- from Crypto.Util.number import *
- from secret import flag
-
- def add(a,b):
- if(a
- a0 = str(b).encode()
- b0 = str(a).encode()
- else:
- a0 = str(a).encode()
- b0 = str(b).encode()
- ans = 0
- for i in range(len(a0)-len(b0)):
- ans = ans*10+a0[i]-48
- for i in range(len(b0)):
- ans = ans*10+(a0[i+len(a0)-len(b0)]+b0[i]+4)%10
- return ans
-
- def mul(a,b):
- if(a
- a0 = str(b).encode()
- b0 = str(a).encode()
- else:
- a0 = str(a).encode()
- b0 = str(b).encode()
- ans = 0
- for i in range(len(b0)):
- ans = ans*10+((a0[i+len(a0)-len(b0)]+2)*(b0[i]+2))%10
- return ans
-
- m = bytes_to_long(flag)
- e = 65537
- p = getPrime(512)
- q = getPrime(512)
- n = p*q
- c = pow(m,e,n)
- print(add(p,q))
- print(mul(p,q))
- print(n)
- print(c)
- # 10399034381787849923326924881454040531711492204619924608227265350044149907274051734345037676383421545973249148286183660679683016947030357640361405556516408
- # 6004903250672248020273453078045186428048881010508070095760634049430058892705564009054400328070528434060550830050010084328522605000400260581038846465000861
- # 100457237809578238448997689590363740025639066957321554834356116114019566855447194466985968666777662995007348443263561295712530012665535942780881309520544097928921920784417859632308854225762469971326925931642031846400402355926637518199130760304347996335637140724757568332604740023000379088112644537238901495181
- # 49042009464540753864186870038605696433949255281829439530955555557471951265762643642510403828448619593655860548966001304965902133517879714352191832895783859451396658166132732818620715968231113019681486494621363269268257297512939412717227009564539512793374347236183475339558666141579267673676878540943373877937
分析:
首先,我们审计题目,我们可以发现题目给了我们四个条件,其中n和c是求解rsa必须的数值,还有两个add和mul值,我们不妨将两个值的产生式带入到python中尝试,可以发现add和mul分别是加法和乘法的不进位求解。
接下来,我们需要考虑的便是问题的不进位求解,由于add和mul位数不同,我们考虑从后往前进行位运算来求解我们所需的p和q值:
- pq0 = [(0, 0)]
- for k in range(len(mul)):
- pq, pq0 = pq0, [(0, 0)]
- for i in range(10):
- for j in range(10):
- if (i + j) % 10 == int(add[-k - 1]) and (i * j) % 10 == int(mul[-k - 1]):
- for (p, q) in pq:
- p = (p + i * 10 ** k)
- q = (q + j * 10 ** k)
- adddddddd(k, p, q)
但在每一项的求解中,我们求出的两个值都不知道是对应p还是q,所以我们可以边进行求解边于原值n的(m+1)数位进行比较。
- def adddddddd(k, p0, q0):
- if (p0 * q0) % (10 ** (k + 1)) == n % (10 ** (k + 1)):
- pq0.append((p0, q0))
-
- pq0 = [(0, 0)]
- for k in range(len(mul)):
- pq, pq0 = pq0, [(0, 0)]
- for i in range(10):
- for j in range(10):
- if (i + j) % 10 == int(add[-k - 1]) and (i * j) % 10 == int(mul[-k - 1]):
- for (p, q) in pq:
- p = (p + i * 10 ** k)
- q = (q + j * 10 ** k)
- adddddddd(k, p, q)
最后,在求得的pq0中,p值加上1*pow(10,154)乘以q必定等于n值可以帮助我们确定p和q的取值大小。
- print(len(pq0))
- print(len('2092931636613623040737253079065768977037831274116990695362696899634198318309588587556607732878944639910799730236593646983127255905400637167879667181506829'))
- for i in range(5):
- for j in range(5):
- if (pq0[i][0]+1*pow(10,154))*pq0[j][1] == n:
- print(pq0[i][0])
- print(pq0[j][1])
- break
rsa求解:
- p=12092931636613623040737253079065768977037831274116990695362696899634198318309588587556607732878944639910799730236593646983127255905400637167879667181506829
- q=8307103755174226983699771812499382664784661030503034013965679561410051699975573257899430944515587916063550418050690024796566861042630720583592848475010689
- print(p*q)
- phi=(p-1)*(q-1)
- import gmpy2
- d=gmpy2.invert(e,phi)
- from Crypto.Util.number import *
- print(long_to_bytes(gmpy2.powmod(c,d,n)))
wp:
- add = '10399034381787849923326924881454040531711492204619924608227265350044149907274051734345037676383421545973249148286183660679683016947030357640361405556516408'
- mul = '6004903250672248020273453078045186428048881010508070095760634049430058892705564009054400328070528434060550830050010084328522605000400260581038846465000861'
- n = 100457237809578238448997689590363740025639066957321554834356116114019566855447194466985968666777662995007348443263561295712530012665535942780881309520544097928921920784417859632308854225762469971326925931642031846400402355926637518199130760304347996335637140724757568332604740023000379088112644537238901495181
- c = 49042009464540753864186870038605696433949255281829439530955555557471951265762643642510403828448619593655860548966001304965902133517879714352191832895783859451396658166132732818620715968231113019681486494621363269268257297512939412717227009564539512793374347236183475339558666141579267673676878540943373877937
- e = 65537
-
- # def add(a,b):
- # if(a
- # a0 = str(b).encode()
- # b0 = str(a).encode()
- # else:
- # a0 = str(a).encode()
- # b0 = str(b).encode()
- # ans = 0
- # for i in range(len(a0)-len(b0)):
- # ans = ans*10+a0[i]-48
- # for i in range(len(b0)):
- # ans = ans*10+(a0[i+len(a0)-len(b0)]+b0[i]+4)%10
- # return ans
- # def mul(a,b):
- # if(a
- # a0 = str(b).encode()
- # b0 = str(a).encode()
- # else:
- # a0 = str(a).encode()
- # b0 = str(b).encode()
- # ans = 0
- # for i in range(len(b0)):
- # ans = ans*10+((a0[i+len(a0)-len(b0)]+2)*(b0[i]+2))%10
- # return ans
- # print(mul(123,96))
- def adddddddd(k, p0, q0):
- if (p0 * q0) % (10 ** (k + 1)) == n % (10 ** (k + 1)):
- pq0.append((p0, q0))
-
- pq0 = [(0, 0)]
- for k in range(len(mul)):
- pq, pq0 = pq0, [(0, 0)]
- for i in range(10):
- for j in range(10):
- if (i + j) % 10 == int(add[-k - 1]) and (i * j) % 10 == int(mul[-k - 1]):
- for (p, q) in pq:
- p = (p + i * 10 ** k)
- q = (q + j * 10 ** k)
- adddddddd(k, p, q)
- print(len(pq0))
- print(len('2092931636613623040737253079065768977037831274116990695362696899634198318309588587556607732878944639910799730236593646983127255905400637167879667181506829'))
- for i in range(5):
- for j in range(5):
- if (pq0[i][0]+1*pow(10,154))*pq0[j][1] == n:
- print(pq0[i][0])
- print(pq0[j][1])
- break
-
- p=12092931636613623040737253079065768977037831274116990695362696899634198318309588587556607732878944639910799730236593646983127255905400637167879667181506829
- q=8307103755174226983699771812499382664784661030503034013965679561410051699975573257899430944515587916063550418050690024796566861042630720583592848475010689
- print(p*q)
- phi=(p-1)*(q-1)
- import gmpy2
- d=gmpy2.invert(e,phi)
- from Crypto.Util.number import *
- print(long_to_bytes(gmpy2.powmod(c,d,n)))
-
相关阅读:
leetcode 57. 插入区间
19-28-hive-数据类型-DDL
Element-Ui+Vue实现首页布局(带收缩展开效果)
UG\NX二次开发 二维向量相加
基于 CNN-GRU 的菇房多点温湿度预测方法研究 学习记录
所见即所得的3D打印建模设计
共享日志。 vCorfu: A Cloud-Scale Object Store on a Shared Log
暴雪战网重装失败问题解决
【Overleaf】解决LaTeX Error: Something‘s wrong--perhaps a missing \item.
自然语言处理从零到入门 Transformer
-
原文地址:https://blog.csdn.net/shshss64/article/details/127797901