首页
社区
课程
招聘
解一个简单的RSA题目
发表于: 2023-9-30 11:09 12238

解一个简单的RSA题目

scz 活跃值
5
2023-9-30 11:09
12238

在看雪上看到这篇,应该是某个CTF题,已知条件用Python代码给出来,求flag。

原题如下

网友「hypersine」评论回复

这个应该还是很好办的

N是一个不安全的大合数,可以用yafu快速分解得到P、Q,因此可以算出E对应的D,从而解密c2得到d2。题目中N的两个因数P、Q靠得太近了,两者之差未超过10000(实际是2214),所以很容易分解。

c1 = pow(e2, 17, n),但e2是一个122位的质数,因此e2^17应该有122 * 17 = 2074位,太接近于n的2048位。这里可以暴力破解,因为c1 = pow(e2, 17, n),所以存在k使得e2^17 == k * n + c1,这个k范围不大,不超过2^(2074 - 2048 + 1) = 2^27,自己写个程序穷举k就好,穷举到k * n + c1是一个完全17次方数就行,然后开17次方得到e2。

现在知道d2、e2那就能分解n了,自己写个程序分解n得到p、q,最后解密flagenc。

他这个回复写得非常清楚,我第一次听说yafu,照着他说的做了一遍,挺有意思。后文假设对RSA算法门儿清,不做科普,直接演示具体实现。

yafu在这里:

yafu-x64.exe factor(...)

c1 = pow( e2, 17, n )
e2 = getPrime( 122 )

e2 = 3114339948601620171033737415539895793

此处我直接求phin,并不需要分解n,不需要知道p、q。

m = bytes_to_long( flag )

b'flag{616fa39c8781aa45031e15651228489a}'

创建: 2023-09-29 17:11
https://scz.617.cn/python/202309291711.txt
创建: 2023-09-29 17:11
https://scz.617.cn/python/202309291711.txt
https://bbs.kanxue.com/thread-279050.htm
https://bbs.kanxue.com/thread-279050.htm
from Crypto.Util.number import *
import gmpy2
from jx2023 import flag, N, E
 
p = getPrime(1024)
q = getPrime(1024)
n = p*q
e1 = 65537
m = bytes_to_long(flag)
flagenc = pow(m, e1, n)
print("n is %d"%n)
print("flagenc is %d"%flagenc)
 
e2 = getPrime(122)
d2 = gmpy2.invert(e2,(p-1)*(q-1))
 
c1 = pow(e2, 17, n)
print("c1 is %d"%c1)
c2 = pow(d2, E, N)
print("N is %d"%N)
print("E is %d"%E)
print("c2 is %d"%c2)
 
# n is 8783117353228609820060025773720048836109116296720444291318682193328216575376903671782151675801584925066872219021319381163804239505579013818679255656402117567158378369967703317919205364480806143209934093723468591544792794708122025724968669241594029740047941933910596214170603520800531302474255823072859735679699558933009869241259760910402379740926512037606096020308081609477145816657118917642443176163860564823645522254412566891344745856141731910712040298787696382973824645074768059896153817964229975814742137600918515702471008251376697190058997187350022140633621955761877009643524289144711721902192261617574896449017
 
# flagenc is 1832021020586052459314800741399454951500982061634041208695770794636942946870944684781204845687614819955481692885982545657535952608100558061853098768890990198808258902800083671402999197944855469054517686346352932015639347886120547093778527571008483890754044661117042113616196224634409728684137167049242919543742476300792865668127981523314258326046469003175979484948578219765126696355000799390683333335678236115175267218556919253045561467791607635318317825080003594243366362225620291777807071774013296604063473075790067769213249767073197915283384750139985842145668772180552896467043807903712438253502782564391233381742
 
# c1 is 7501185876834032332235110133210399479682524972321262801050956129090974843598848916000280794969942298848478394986779571489577405391165372124215072990382219817624500948789393550575823082225944683449240150364401487955484843961943987266467050723988657081468393104862383181698999645914573683498375228946881234015678337769955671069215094086232377038727627179660862997067062391991524231807127953937881102711759932207432989764529075450526104070640765094626829603546052250863300827172150912585791552174463067989228539713261075253602907390439036055716154404417991482262846355144755622306307102084492476950657455416297047328320
 
# N is 29956031606905964747690208452463077877156885038545111351508842927295510069375356079358289621922278316223452695576175299757472345749152582617292471487006177231261463793638998998552474423214925625798531662484883149899251884707864709821973208465998076621327151198438158796296778838657562126343551661323471767755161686549607991960624754677443327266743771304424298446433734879681913848286620429175461870451099771965936783237191184798864363652633155779478727580408625494617809961465590055999661472563150275608218351797354628429061984878432442357241449134341597647749840966740944318445550768334070331490455379767889443973947
 
# E is 3527492693
 
# c2 is 11237333233288323887902003767693284822911839921763421974808265907264411495367936669799604082222415065052099486867383635886650443299459413288200494593477575168578514325691333043832168789236017314435940348619410775859032696755081680003338452277759483862961120696587307757666691557048088894021864124052243936836752825473836552342254367444581003605318145868368417247224184184040226260236268012375524575700053732026218766291274077482132408824236096242385408780811520890742688121731805867574680433796282417791570436991022839930635640379142355212121030479526679958801911687722402447690578345774902440346290388183936888977900
from Crypto.Util.number import *
import gmpy2
from jx2023 import flag, N, E
 
p = getPrime(1024)
q = getPrime(1024)
n = p*q
e1 = 65537
m = bytes_to_long(flag)
flagenc = pow(m, e1, n)
print("n is %d"%n)
print("flagenc is %d"%flagenc)
 
e2 = getPrime(122)
d2 = gmpy2.invert(e2,(p-1)*(q-1))
 
c1 = pow(e2, 17, n)
print("c1 is %d"%c1)
c2 = pow(d2, E, N)
print("N is %d"%N)
print("E is %d"%E)
print("c2 is %d"%c2)
 
# n is 8783117353228609820060025773720048836109116296720444291318682193328216575376903671782151675801584925066872219021319381163804239505579013818679255656402117567158378369967703317919205364480806143209934093723468591544792794708122025724968669241594029740047941933910596214170603520800531302474255823072859735679699558933009869241259760910402379740926512037606096020308081609477145816657118917642443176163860564823645522254412566891344745856141731910712040298787696382973824645074768059896153817964229975814742137600918515702471008251376697190058997187350022140633621955761877009643524289144711721902192261617574896449017
 
# flagenc is 1832021020586052459314800741399454951500982061634041208695770794636942946870944684781204845687614819955481692885982545657535952608100558061853098768890990198808258902800083671402999197944855469054517686346352932015639347886120547093778527571008483890754044661117042113616196224634409728684137167049242919543742476300792865668127981523314258326046469003175979484948578219765126696355000799390683333335678236115175267218556919253045561467791607635318317825080003594243366362225620291777807071774013296604063473075790067769213249767073197915283384750139985842145668772180552896467043807903712438253502782564391233381742
 
# c1 is 7501185876834032332235110133210399479682524972321262801050956129090974843598848916000280794969942298848478394986779571489577405391165372124215072990382219817624500948789393550575823082225944683449240150364401487955484843961943987266467050723988657081468393104862383181698999645914573683498375228946881234015678337769955671069215094086232377038727627179660862997067062391991524231807127953937881102711759932207432989764529075450526104070640765094626829603546052250863300827172150912585791552174463067989228539713261075253602907390439036055716154404417991482262846355144755622306307102084492476950657455416297047328320
 
# N is 29956031606905964747690208452463077877156885038545111351508842927295510069375356079358289621922278316223452695576175299757472345749152582617292471487006177231261463793638998998552474423214925625798531662484883149899251884707864709821973208465998076621327151198438158796296778838657562126343551661323471767755161686549607991960624754677443327266743771304424298446433734879681913848286620429175461870451099771965936783237191184798864363652633155779478727580408625494617809961465590055999661472563150275608218351797354628429061984878432442357241449134341597647749840966740944318445550768334070331490455379767889443973947
 
# E is 3527492693
 
# c2 is 11237333233288323887902003767693284822911839921763421974808265907264411495367936669799604082222415065052099486867383635886650443299459413288200494593477575168578514325691333043832168789236017314435940348619410775859032696755081680003338452277759483862961120696587307757666691557048088894021864124052243936836752825473836552342254367444581003605318145868368417247224184184040226260236268012375524575700053732026218766291274077482132408824236096242385408780811520890742688121731805867574680433796282417791570436991022839930635640379142355212121030479526679958801911687722402447690578345774902440346290388183936888977900
https://sourceforge.net/projects/yafu/
https://sourceforge.net/projects/yafu/
N   = 29956031606905964747690208452463077877156885038545111351508842927295510069375356079358289621922278316223452695576175299757472345749152582617292471487006177231261463793638998998552474423214925625798531662484883149899251884707864709821973208465998076621327151198438158796296778838657562126343551661323471767755161686549607991960624754677443327266743771304424298446433734879681913848286620429175461870451099771965936783237191184798864363652633155779478727580408625494617809961465590055999661472563150275608218351797354628429061984878432442357241449134341597647749840966740944318445550768334070331490455379767889443973947
P   = 173078108398797693665135881829236075381385640386270681597614075449385160047192826549689858183180936639070064309925929218966667262650552855318783567546131862440848767306600252044834602371191453881522882233745590790067041490962165388372445595736465527512700919336312857203007896777270237470242797091626699715021
Q   = 173078108398797693665135881829236075381385640386270681597614075449385160047192826549689858183180936639070064309925929218966667262650552855318783567546131862440848767306600252044834602371191453881522882233745590790067041490962165388372445595736465527512700919336312857203007896777270237470242797091626699712807
N   = 29956031606905964747690208452463077877156885038545111351508842927295510069375356079358289621922278316223452695576175299757472345749152582617292471487006177231261463793638998998552474423214925625798531662484883149899251884707864709821973208465998076621327151198438158796296778838657562126343551661323471767755161686549607991960624754677443327266743771304424298446433734879681913848286620429175461870451099771965936783237191184798864363652633155779478727580408625494617809961465590055999661472563150275608218351797354628429061984878432442357241449134341597647749840966740944318445550768334070331490455379767889443973947
P   = 173078108398797693665135881829236075381385640386270681597614075449385160047192826549689858183180936639070064309925929218966667262650552855318783567546131862440848767306600252044834602371191453881522882233745590790067041490962165388372445595736465527512700919336312857203007896777270237470242797091626699715021
Q   = 173078108398797693665135881829236075381385640386270681597614075449385160047192826549689858183180936639070064309925929218966667262650552855318783567546131862440848767306600252044834602371191453881522882233745590790067041490962165388372445595736465527512700919336312857203007896777270237470242797091626699712807
PHIN
    = ( P - 1 ) * ( Q - 1 )
    = 29956031606905964747690208452463077877156885038545111351508842927295510069375356079358289621922278316223452695576175299757472345749152582617292471487006177231261463793638998998552474423214925625798531662484883149899251884707864709821973208465998076621327151198438158796296778838657562126343551661323471767754815530332810396573294482913784855115981000023651757083238506728783143528192234776076082154084737898687796654617339326360931029127332050068841160445316361769736112426852389551909992267820767367845172587329863446848927901896508111580496557942868666592724439128068318604039534974779529856549969785584636044546120
E   = 3527492693
D   = pow( E, -1, PHIN )
    = 11714295081028872095829649166462229534600990710051935510446747726812850082248692172993712813876838631530131841002864405509809020642090830057480563098086105449080792559844536414801734203530804966201381422491474684930923968884279519098355698332242744379775874767776071264516751080436520394348871721340176066921420286921422058287034111670045372227822407191894590900146761623610897328261136348388566000514394645573157244495497931592466836405935725526366908335327195113887202308698472178807611689040253147826886972580034858628911446318134969278899776543868656799330072299690972211680722019638416076131152808496762522693477
PHIN
    = ( P - 1 ) * ( Q - 1 )
    = 29956031606905964747690208452463077877156885038545111351508842927295510069375356079358289621922278316223452695576175299757472345749152582617292471487006177231261463793638998998552474423214925625798531662484883149899251884707864709821973208465998076621327151198438158796296778838657562126343551661323471767754815530332810396573294482913784855115981000023651757083238506728783143528192234776076082154084737898687796654617339326360931029127332050068841160445316361769736112426852389551909992267820767367845172587329863446848927901896508111580496557942868666592724439128068318604039534974779529856549969785584636044546120
E   = 3527492693
D   = pow( E, -1, PHIN )
    = 11714295081028872095829649166462229534600990710051935510446747726812850082248692172993712813876838631530131841002864405509809020642090830057480563098086105449080792559844536414801734203530804966201381422491474684930923968884279519098355698332242744379775874767776071264516751080436520394348871721340176066921420286921422058287034111670045372227822407191894590900146761623610897328261136348388566000514394645573157244495497931592466836405935725526366908335327195113887202308698472178807611689040253147826886972580034858628911446318134969278899776543868656799330072299690972211680722019638416076131152808496762522693477
c2  = 11237333233288323887902003767693284822911839921763421974808265907264411495367936669799604082222415065052099486867383635886650443299459413288200494593477575168578514325691333043832168789236017314435940348619410775859032696755081680003338452277759483862961120696587307757666691557048088894021864124052243936836752825473836552342254367444581003605318145868368417247224184184040226260236268012375524575700053732026218766291274077482132408824236096242385408780811520890742688121731805867574680433796282417791570436991022839930635640379142355212121030479526679958801911687722402447690578345774902440346290388183936888977900
c2  = pow( d2, E, N )
d2  = pow( c2, D, N )
    = 1465609176542763075940181962864772219331485015754212502937973493443861834882896923514247538047873222749277952886635121836117307545036562427772437806854340361074148192771473277727294143006055601401312427467541596180527496770619498342429377442434816909227051361516850883374420088718381665893195779978368015188860126495766884766922749307806795261008469763388207146667293445107027754446987485763318465318384962761520682566768934401101857441607051135056991848789269185392218296823177075051007900064049736104615073193811802036090426977600680928083396357891022205464091444388907654190936465902019121558566966912994707102641
c2  = 11237333233288323887902003767693284822911839921763421974808265907264411495367936669799604082222415065052099486867383635886650443299459413288200494593477575168578514325691333043832168789236017314435940348619410775859032696755081680003338452277759483862961120696587307757666691557048088894021864124052243936836752825473836552342254367444581003605318145868368417247224184184040226260236268012375524575700053732026218766291274077482132408824236096242385408780811520890742688121731805867574680433796282417791570436991022839930635640379142355212121030479526679958801911687722402447690578345774902440346290388183936888977900
c2  = pow( d2, E, N )
d2  = pow( c2, D, N )
    = 1465609176542763075940181962864772219331485015754212502937973493443861834882896923514247538047873222749277952886635121836117307545036562427772437806854340361074148192771473277727294143006055601401312427467541596180527496770619498342429377442434816909227051361516850883374420088718381665893195779978368015188860126495766884766922749307806795261008469763388207146667293445107027754446987485763318465318384962761520682566768934401101857441607051135056991848789269185392218296823177075051007900064049736104615073193811802036090426977600680928083396357891022205464091444388907654190936465902019121558566966912994707102641
#
# pip3 install gmpy2
#
import gmpy2
 
c1  = 7501185876834032332235110133210399479682524972321262801050956129090974843598848916000280794969942298848478394986779571489577405391165372124215072990382219817624500948789393550575823082225944683449240150364401487955484843961943987266467050723988657081468393104862383181698999645914573683498375228946881234015678337769955671069215094086232377038727627179660862997067062391991524231807127953937881102711759932207432989764529075450526104070640765094626829603546052250863300827172150912585791552174463067989228539713261075253602907390439036055716154404417991482262846355144755622306307102084492476950657455416297047328320
n   = 8783117353228609820060025773720048836109116296720444291318682193328216575376903671782151675801584925066872219021319381163804239505579013818679255656402117567158378369967703317919205364480806143209934093723468591544792794708122025724968669241594029740047941933910596214170603520800531302474255823072859735679699558933009869241259760910402379740926512037606096020308081609477145816657118917642443176163860564823645522254412566891344745856141731910712040298787696382973824645074768059896153817964229975814742137600918515702471008251376697190058997187350022140633621955761877009643524289144711721902192261617574896449017
 
for k in range( 1, 2 ** 26 + 1 ) :
    candidate_e2    = gmpy2.iroot( c1 + k * n, 17 )
    if candidate_e2[1] :
        e2  = int( candidate_e2[0] )
        break
 
print( e2 )
#
# pip3 install gmpy2
#
import gmpy2
 
c1  = 7501185876834032332235110133210399479682524972321262801050956129090974843598848916000280794969942298848478394986779571489577405391165372124215072990382219817624500948789393550575823082225944683449240150364401487955484843961943987266467050723988657081468393104862383181698999645914573683498375228946881234015678337769955671069215094086232377038727627179660862997067062391991524231807127953937881102711759932207432989764529075450526104070640765094626829603546052250863300827172150912585791552174463067989228539713261075253602907390439036055716154404417991482262846355144755622306307102084492476950657455416297047328320
n   = 8783117353228609820060025773720048836109116296720444291318682193328216575376903671782151675801584925066872219021319381163804239505579013818679255656402117567158378369967703317919205364480806143209934093723468591544792794708122025724968669241594029740047941933910596214170603520800531302474255823072859735679699558933009869241259760910402379740926512037606096020308081609477145816657118917642443176163860564823645522254412566891344745856141731910712040298787696382973824645074768059896153817964229975814742137600918515702471008251376697190058997187350022140633621955761877009643524289144711721902192261617574896449017
 
for k in range( 1, 2 ** 26 + 1 ) :
    candidate_e2    = gmpy2.iroot( c1 + k * n, 17 )
    if candidate_e2[1] :
        e2  = int( candidate_e2[0] )
        break
 
print( e2 )

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (13)
雪    币: 3565
活跃值: (3950)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享。
2023-9-30 13:36
0
雪    币: 14846
活跃值: (6078)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
yafu-x64.exe factor(...)分解这个N用了多久得到P、Q?
2023-9-30 13:50
0
雪    币: 267
活跃值: (625)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
tDasm yafu-x64.exe factor(...)分解这个N用了多久得到P、Q?
很快,不到3秒
2023-9-30 14:05
0
雪    币: 14846
活跃值: (6078)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
hypersine 很快,不到3秒
是快,没分析过yafu,难道yafu能自动利用随机数产生P,Q漏洞?
2023-9-30 15:25
0
雪    币: 3070
活跃值: (30876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2023-9-30 23:09
1
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
为什么没有加上判断条件:e2是素数而且是122位的?
2023-10-5 07:46
0
雪    币: 4822
活跃值: (3822)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
8
mb_lxcelyzd 为什么没有加上判断条件:e2是素数而且是122位的?

你可以自己加,我不想加,没有为什么

最后于 2023-10-5 17:41 被scz编辑 ,原因:
2023-10-5 17:39
0
雪    币: 579
活跃值: (194)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
代码中”for k in range( 1, 2 ** 26 + 1 )“,”这个k范围不大,不超过2^(2074 - 2048 + 1) = 2^27“。请问是因为推测不需要 2 ** 27 这么大吗?
2024-5-7 10:49
0
雪    币: 579
活跃值: (194)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10

题目中d2 的 PHIN 是 (p-1)*(q-1),”d2 = gmpy2.invert(e2,(p-1)*(q-1))“,而开头加密使用的 n = p * q。请问为什么之后能够解开加密呢?


是因为求出的 PHIN 直接拿来计算私钥 d1 了,而原本的 n 是已知的,所以不需要分解了。我想明白了,谢谢分享

最后于 2024-5-7 11:41 被mb_fibvrtjb编辑 ,原因: 内容错误
2024-5-7 11:22
0
雪    币: 20
活跃值: (201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
hypersine 很快,不到3秒
兄弟 你吹牛逼的吧 这么长的 n 3秒?
2024-9-3 22:43
0
雪    币: 4822
活跃值: (3822)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
12
他没吹牛,不过这事与PC性能强相关。我在一台四年前的PC上分解这个N,大概6.7秒,就算7秒吧,刚又试了一下。这种N的的P、Q特别接近,不属于常规素因子分解。
2024-9-4 08:32
0
雪    币: 1846
活跃值: (1801)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
13

使用FERMAT花费47毫秒

2024-9-4 08:46
0
雪    币: 4822
活跃值: (3822)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
14
shuax 使用FERMAT花费47毫秒
RDLP这个FERMAT真不错啊,以前真没用过。
2024-9-4 09:42
0
游客
登录 | 注册 方可回帖
返回
//