• 2021长安杯-高校组-Crypto-easyrsa


    题目:

    1. from Crypto.Util.number import *
    2. from secret import flag
    3. def add(a,b):
    4. if(a
    5. a0 = str(b).encode()
    6. b0 = str(a).encode()
    7. else:
    8. a0 = str(a).encode()
    9. b0 = str(b).encode()
    10. ans = 0
    11. for i in range(len(a0)-len(b0)):
    12. ans = ans*10+a0[i]-48
    13. for i in range(len(b0)):
    14. ans = ans*10+(a0[i+len(a0)-len(b0)]+b0[i]+4)%10
    15. return ans
    16. def mul(a,b):
    17. if(a
    18. a0 = str(b).encode()
    19. b0 = str(a).encode()
    20. else:
    21. a0 = str(a).encode()
    22. b0 = str(b).encode()
    23. ans = 0
    24. for i in range(len(b0)):
    25. ans = ans*10+((a0[i+len(a0)-len(b0)]+2)*(b0[i]+2))%10
    26. return ans
    27. m = bytes_to_long(flag)
    28. e = 65537
    29. p = getPrime(512)
    30. q = getPrime(512)
    31. n = p*q
    32. c = pow(m,e,n)
    33. print(add(p,q))
    34. print(mul(p,q))
    35. print(n)
    36. print(c)
    37. # 10399034381787849923326924881454040531711492204619924608227265350044149907274051734345037676383421545973249148286183660679683016947030357640361405556516408
    38. # 6004903250672248020273453078045186428048881010508070095760634049430058892705564009054400328070528434060550830050010084328522605000400260581038846465000861
    39. # 100457237809578238448997689590363740025639066957321554834356116114019566855447194466985968666777662995007348443263561295712530012665535942780881309520544097928921920784417859632308854225762469971326925931642031846400402355926637518199130760304347996335637140724757568332604740023000379088112644537238901495181
    40. # 49042009464540753864186870038605696433949255281829439530955555557471951265762643642510403828448619593655860548966001304965902133517879714352191832895783859451396658166132732818620715968231113019681486494621363269268257297512939412717227009564539512793374347236183475339558666141579267673676878540943373877937

    分析:

    首先,我们审计题目,我们可以发现题目给了我们四个条件,其中n和c是求解rsa必须的数值,还有两个add和mul值,我们不妨将两个值的产生式带入到python中尝试,可以发现add和mul分别是加法和乘法的不进位求解。 

    接下来,我们需要考虑的便是问题的不进位求解,由于add和mul位数不同,我们考虑从后往前进行位运算来求解我们所需的p和q值:

    1. pq0 = [(0, 0)]
    2. for k in range(len(mul)):
    3. pq, pq0 = pq0, [(0, 0)]
    4. for i in range(10):
    5. for j in range(10):
    6. if (i + j) % 10 == int(add[-k - 1]) and (i * j) % 10 == int(mul[-k - 1]):
    7. for (p, q) in pq:
    8. p = (p + i * 10 ** k)
    9. q = (q + j * 10 ** k)
    10. adddddddd(k, p, q)

     但在每一项的求解中,我们求出的两个值都不知道是对应p还是q,所以我们可以边进行求解边于原值n的(m+1)数位进行比较。

    1. def adddddddd(k, p0, q0):
    2. if (p0 * q0) % (10 ** (k + 1)) == n % (10 ** (k + 1)):
    3. pq0.append((p0, q0))
    4. pq0 = [(0, 0)]
    5. for k in range(len(mul)):
    6. pq, pq0 = pq0, [(0, 0)]
    7. for i in range(10):
    8. for j in range(10):
    9. if (i + j) % 10 == int(add[-k - 1]) and (i * j) % 10 == int(mul[-k - 1]):
    10. for (p, q) in pq:
    11. p = (p + i * 10 ** k)
    12. q = (q + j * 10 ** k)
    13. adddddddd(k, p, q)

     最后,在求得的pq0中,p值加上1*pow(10,154)乘以q必定等于n值可以帮助我们确定p和q的取值大小。

    1. print(len(pq0))
    2. print(len('2092931636613623040737253079065768977037831274116990695362696899634198318309588587556607732878944639910799730236593646983127255905400637167879667181506829'))
    3. for i in range(5):
    4. for j in range(5):
    5. if (pq0[i][0]+1*pow(10,154))*pq0[j][1] == n:
    6. print(pq0[i][0])
    7. print(pq0[j][1])
    8. break

    rsa求解:

    1. p=12092931636613623040737253079065768977037831274116990695362696899634198318309588587556607732878944639910799730236593646983127255905400637167879667181506829
    2. q=8307103755174226983699771812499382664784661030503034013965679561410051699975573257899430944515587916063550418050690024796566861042630720583592848475010689
    3. print(p*q)
    4. phi=(p-1)*(q-1)
    5. import gmpy2
    6. d=gmpy2.invert(e,phi)
    7. from Crypto.Util.number import *
    8. print(long_to_bytes(gmpy2.powmod(c,d,n)))

     

    wp:
     

    1. add = '10399034381787849923326924881454040531711492204619924608227265350044149907274051734345037676383421545973249148286183660679683016947030357640361405556516408'
    2. mul = '6004903250672248020273453078045186428048881010508070095760634049430058892705564009054400328070528434060550830050010084328522605000400260581038846465000861'
    3. n = 100457237809578238448997689590363740025639066957321554834356116114019566855447194466985968666777662995007348443263561295712530012665535942780881309520544097928921920784417859632308854225762469971326925931642031846400402355926637518199130760304347996335637140724757568332604740023000379088112644537238901495181
    4. c = 49042009464540753864186870038605696433949255281829439530955555557471951265762643642510403828448619593655860548966001304965902133517879714352191832895783859451396658166132732818620715968231113019681486494621363269268257297512939412717227009564539512793374347236183475339558666141579267673676878540943373877937
    5. e = 65537
    6. # def add(a,b):
    7. # if(a
    8. # a0 = str(b).encode()
    9. # b0 = str(a).encode()
    10. # else:
    11. # a0 = str(a).encode()
    12. # b0 = str(b).encode()
    13. # ans = 0
    14. # for i in range(len(a0)-len(b0)):
    15. # ans = ans*10+a0[i]-48
    16. # for i in range(len(b0)):
    17. # ans = ans*10+(a0[i+len(a0)-len(b0)]+b0[i]+4)%10
    18. # return ans
    19. # def mul(a,b):
    20. # if(a
    21. # a0 = str(b).encode()
    22. # b0 = str(a).encode()
    23. # else:
    24. # a0 = str(a).encode()
    25. # b0 = str(b).encode()
    26. # ans = 0
    27. # for i in range(len(b0)):
    28. # ans = ans*10+((a0[i+len(a0)-len(b0)]+2)*(b0[i]+2))%10
    29. # return ans
    30. # print(mul(123,96))
    31. def adddddddd(k, p0, q0):
    32. if (p0 * q0) % (10 ** (k + 1)) == n % (10 ** (k + 1)):
    33. pq0.append((p0, q0))
    34. pq0 = [(0, 0)]
    35. for k in range(len(mul)):
    36. pq, pq0 = pq0, [(0, 0)]
    37. for i in range(10):
    38. for j in range(10):
    39. if (i + j) % 10 == int(add[-k - 1]) and (i * j) % 10 == int(mul[-k - 1]):
    40. for (p, q) in pq:
    41. p = (p + i * 10 ** k)
    42. q = (q + j * 10 ** k)
    43. adddddddd(k, p, q)
    44. print(len(pq0))
    45. print(len('2092931636613623040737253079065768977037831274116990695362696899634198318309588587556607732878944639910799730236593646983127255905400637167879667181506829'))
    46. for i in range(5):
    47. for j in range(5):
    48. if (pq0[i][0]+1*pow(10,154))*pq0[j][1] == n:
    49. print(pq0[i][0])
    50. print(pq0[j][1])
    51. break
    52. p=12092931636613623040737253079065768977037831274116990695362696899634198318309588587556607732878944639910799730236593646983127255905400637167879667181506829
    53. q=8307103755174226983699771812499382664784661030503034013965679561410051699975573257899430944515587916063550418050690024796566861042630720583592848475010689
    54. print(p*q)
    55. phi=(p-1)*(q-1)
    56. import gmpy2
    57. d=gmpy2.invert(e,phi)
    58. from Crypto.Util.number import *
    59. 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