在网上找了一上午,看了好几个人的wp,资源不多,结合了好多人的内容总算梳理明白了
#第一段e1 = 14606334023791426p1 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859q1 = 130968576816900149996914427770826228884925960001279609559095138835900329492765336419489982304805369724685145941218640504262821549441728192761733409684831633194346504685627189375724517070780334885673563409259345291959439026700006694655545512308390416859315892447092639503318475587220630455745460309886030186593c1 = 11402389955595766056824801105373550411371729054679429421548608725777586555536302409478824585455648944737304660137306241012321255955693234304201530700362069004620531537922710568821152217381257446478619320278993539785699090234418603086426252498046106436360959622415398647198014716351359752734123844386459925553497427680448633869522591650121047156082228109421246662020164222925272078687550896012363926358633323439494967417041681357707006545728719651494384317497942177993032739778398001952201667284323691607312819796036779374423837576479275454953999865750584684592993292347483309178232523897058253412878901324740104919248#第二段e2 = 13813369129257838p2 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859q2 = 94582257784130735233174402362819395926641026753071039760251190444144495369829487705195913337502962816079184062352678128843179586054535283861793827497892600954650126991213176547276006780610945133603745974181504975165082485845571788686928859549252522952174376071500707863379238688200493621993937563296490615649c2 = 7984888899827615209197324489527982755561403577403539988687419233579203660429542197972867526015619223510964699107198708420785278262082902359114040327940253582108364104049849773108799812000586446829979564395322118616382603675257162995702363051699403525169767736410365076696890117813211614468971386159587698853722658492385717150691206731593509168262529568464496911821756352254486299361607604338523750318977620039669792468240086472218586697386948479265417452517073901655900118259488507311321060895347770921790483894095085039802955700146474474606794444308825840221205073230671387989412399673375520605000270180367035526919
已知内容就是上面这些,我们把他分成两段已知条件来看,看到第一眼是不是想直接求phi然后求d?结果是不是发现e没有phi的模逆?这里就是著名的e与phi不互素的情况!(不然为什么要给你两段已知条件嘿嘿)
其实也不难,就是网上许多博客的内容感觉前后逻辑不同,思路不是很顺畅。
在这里我们知道
那么我们想找到d来让 ,那不好意思,没法直接求出来d,那就求不出来m。
但是既然已知d与phi不互素,我们可以找到e和phi的最大公因数gcd(e,phi)=14,虽然e和phi是不互素的,但是e的因子和phi互素啊(后面你就知道为什么要这么找了),这样我们有下面这个式子
只不过这里我们把m^14看成一个整体作为之前的m,之前求的d是在m的指数为e的情况下算出来d=invert(e,phi),这里把m^14看成了一个整体,那么m^14指数为e//14的时候,d就变成了invert(e//14,phi),所以你会发现,原来的 换成了 ,这样我们可以求出来m^14
根据第一段已知条件就能把m求出来吗?显然是不可能的。两段已知条件中p1和p2是相等的,但是q1和q2不相等,所以p1*q1!=p2*q2,也就是说两端条件下m所在的有限域不同,第一段条件解出来的明文m不一定满足第二段的域
所以我们不能直接用第一段求出来m^14,那么我们把用两段已知条件得到的式子列出来:
m^14c1^d1 mod (p1*q1)
m^14c2^d2 mod (p2*q2)
然后我们复习一下同余的性质:
ab mod(mn)→ab mod m且ab mod n
所以我们把上面的式子拆开(p1=p2,我们统称为p)变成下面4个式子:
m^14c1^d1 mod p
m^14c1^d1 mod q1
m^14c2^d2 mod p
m^14c2^d2 mod q2
把模q1和模q2的两项拿出来(后面你就会知道为什么拿这两项了),用中国剩余定理来计算出m^14的一个特解。
m^14=m^(2*7),如果能找到7的逆元,那么就可以求出来(m^2)^(7*invert(7))=m^2,
因为7与(q1-1)*(q2-1)是互素的,所以我们可以找到这个逆元,那么我们就求出了m^2,
再将其开平方就得到m了,代码如下:
import gmpy2from Crypto.Util.number import long_to_bytesdef crt(a,n): N=1 for i in n: N=N*i Ni=[N//i for i in n] t=[gmpy2.invert(Ni[i],n[i]) for i in range(len(n))] sum=0 for i in range(len(n)): sum+=a[i]*t[i]*Ni[i] return sum%Ne1 = 14606334023791426p1 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859q1 = 130968576816900149996914427770826228884925960001279609559095138835900329492765336419489982304805369724685145941218640504262821549441728192761733409684831633194346504685627189375724517070780334885673563409259345291959439026700006694655545512308390416859315892447092639503318475587220630455745460309886030186593c1 = 11402389955595766056824801105373550411371729054679429421548608725777586555536302409478824585455648944737304660137306241012321255955693234304201530700362069004620531537922710568821152217381257446478619320278993539785699090234418603086426252498046106436360959622415398647198014716351359752734123844386459925553497427680448633869522591650121047156082228109421246662020164222925272078687550896012363926358633323439494967417041681357707006545728719651494384317497942177993032739778398001952201667284323691607312819796036779374423837576479275454953999865750584684592993292347483309178232523897058253412878901324740104919248e2 = 13813369129257838p2 = 121009772735460235364940622989433807619211926015494087453674747614331295040063679722422298286549493698150690694965106103822315378461970129912436074962111424616439032849788953648286506433464358834178903821069564798378666159882090757625817745990230736982709059859613843100974349380542982235135982530318438330859q2 = 94582257784130735233174402362819395926641026753071039760251190444144495369829487705195913337502962816079184062352678128843179586054535283861793827497892600954650126991213176547276006780610945133603745974181504975165082485845571788686928859549252522952174376071500707863379238688200493621993937563296490615649c2 = 7984888899827615209197324489527982755561403577403539988687419233579203660429542197972867526015619223510964699107198708420785278262082902359114040327940253582108364104049849773108799812000586446829979564395322118616382603675257162995702363051699403525169767736410365076696890117813211614468971386159587698853722658492385717150691206731593509168262529568464496911821756352254486299361607604338523750318977620039669792468240086472218586697386948479265417452517073901655900118259488507311321060895347770921790483894095085039802955700146474474606794444308825840221205073230671387989412399673375520605000270180367035526919phi1=(p1-1)*(q1-1)gcd1=gmpy2.gcd(e1,phi1)#gcd1=14d1=gmpy2.invert(e1//14,phi1)#print(d1)phi2=(p2-1)*(q2-1)gcd2=gmpy2.gcd(e2,phi2)#14d2=gmpy2.invert(e2//14,phi2)#print(d2)a=[pow(c1,d1,q1),pow(c2,d2,q2)]n=[q1,q2]m14=crt(a,n)m2=pow(m14,gmpy2.invert(7,(q1-1)*(q2-1)),(q1*q2))flag=long_to_bytes(gmpy2.iroot(m2,2)[0]).decode()print(flag)