• [0ctf 2016]rsa


    题目:

    首先,我们审计题目,题目给了我们一个flag(c值)和public(n和e值),于是我们首先的第一步便是 将我们可以得到三个值找出来:

    1. with open('flag.enc','rb')as f:
    2. c=bytes_to_long(f.read())
    3. print(c)
    4. c=2485360255306619684345131431867350432205477625621366642887752720125176463993839766742234027524
    5. with open('public.pem','rb')as f:
    6. f1=f.read()
    7. con=RSA.importKey(f1)
    8. n=con.n
    9. e=con.e
    10. print(n,e)
    11. print(gmpy2.iroot(n,3)[1])
    12. for i in range(0,100000):
    13. c+=i*n
    14. if gmpy2.iroot(c,3)[1]:
    15. print(long_to_bytes(gmpy2.iroot(c,3)[0]))

    求得我们所需的c值和ne值:

    1. n=23292710978670380403641273270002884747060006568046290011918413375473934024039715180540887338067
    2. e=3

    接着,我们观察题目,我首先的第一个想法是小明文爆破,结果没有得到所需的flag,再加上题目中出题人给的{easy?},所以判断不是此类问题,于是,开始尝试常规的rsa求解,先将n值分解,解得:

    1. p1=26440615366395242196516853423447
    2. p2=27038194053540661979045656526063
    3. p3=32581479300404876772405716877547

     求出phi值,发现gcd(e,phi)=3,于是转换思路:

    p = 26440615366395242196516853423447
    q = 27038194053540661979045656526063
    r = 32581479300404876772405716877547
    x^3 mod p = ct mod p = 20827907988103030784078915883129
    x^3 mod q = ct mod q = 19342563376936634263836075415482
    x^3 mod r = ct mod r = 10525283947807760227880406671000

    我们可以求解出三个函数分别对应的x值;

    1. #sagemath
    2. n=26440615366395242196516853423447
    3. c=2485360255306619684345131431867350432205477625621366642887752720125176463993839766742234027524
    4. m=c%n
    5. PR. = PolynomialRing(Zmod(n))
    6. f = x^3-m
    7. x0 = f.roots()
    8. print(x0)
    9. [(13374868592866626517389128266735, 1), (7379361747422713811654086477766, 1), (5686385026105901867473638678946, 1)]
    10. n=27038194053540661979045656526063
    11. c=2485360255306619684345131431867350432205477625621366642887752720125176463993839766742234027524
    12. m=c%n
    13. PR. = PolynomialRing(Zmod(n))
    14. f = x^3-m
    15. x0 = f.roots()
    16. print(x0)
    17. [(19616973567618515464515107624812, 1)]
    18. n=32581479300404876772405716877547
    19. c=2485360255306619684345131431867350432205477625621366642887752720125176463993839766742234027524
    20. m=c%n
    21. PR. = PolynomialRing(Zmod(n))
    22. f = x^3-m
    23. x0 = f.roots()
    24. print(x0)
    25. [(13404203109409336045283549715377, 1), (13028011585706956936052628027629, 1), (6149264605288583791069539134541, 1)]

     求解出:

    1. a=[13374868592866626517389128266735,7379361747422713811654086477766,5686385026105901867473638678946]
    2. b=[19616973567618515464515107624812]
    3. c=[13404203109409336045283549715377,13028011585706956936052628027629,6149264605288583791069539134541]

    可以看到有3*1*3=9,也就是说有9种情况需要我们来讨论(使用中国剩余定理

    1. for x in a:
    2. for y in b:
    3. for z in c:
    4. m = crt(p1,p2,p3,x, y, z)
    5. m=long_to_bytes(m)
    6. if b'ctf{' in m:
    7. print(m)
    8. break

    exp:

    1. from Crypto.PublicKey import RSA
    2. import gmpy2
    3. from Crypto.Util.number import *
    4. with open('flag.enc','rb')as f:
    5. c=bytes_to_long(f.read())
    6. print(c)
    7. c=2485360255306619684345131431867350432205477625621366642887752720125176463993839766742234027524
    8. with open('public.pem','rb')as f:
    9. f1=f.read()
    10. con=RSA.importKey(f1)
    11. n=con.n
    12. e=con.e
    13. print(n,e)
    14. print(gmpy2.iroot(n,3)[1])
    15. for i in range(0,100000):
    16. c+=i*n
    17. if gmpy2.iroot(c,3)[1]:
    18. print(long_to_bytes(gmpy2.iroot(c,3)[0]))
    19. p1=26440615366395242196516853423447
    20. p2=27038194053540661979045656526063
    21. p3=32581479300404876772405716877547
    22. phi=(p1-1)*(p2-1)*(p3-1)
    23. n=23292710978670380403641273270002884747060006568046290011918413375473934024039715180540887338067
    24. e=3
    25. #sagemath
    26. n=26440615366395242196516853423447
    27. c=2485360255306619684345131431867350432205477625621366642887752720125176463993839766742234027524
    28. m=c%n
    29. PR. = PolynomialRing(Zmod(n))
    30. f = x^3-m
    31. x0 = f.roots()
    32. print(x0)
    33. n=27038194053540661979045656526063
    34. c=2485360255306619684345131431867350432205477625621366642887752720125176463993839766742234027524
    35. m=c%n
    36. PR. = PolynomialRing(Zmod(n))
    37. f = x^3-m
    38. x0 = f.roots()
    39. print(x0)
    40. n=32581479300404876772405716877547
    41. c=2485360255306619684345131431867350432205477625621366642887752720125176463993839766742234027524
    42. m=c%n
    43. PR. = PolynomialRing(Zmod(n))
    44. f = x^3-m
    45. x0 = f.roots()
    46. print(x0)
    47. def crt(p1,p2,p3,m1, m2, m3):
    48. sum=0
    49. sum=m1*p2*p3*gmpy2.invert(p2*p3,p1)+m2*p1*p3*gmpy2.invert(p1*p3,p2)+m3*p1*p2*gmpy2.invert(p1*p2,p3)
    50. return(sum%n)
    51. a=[13374868592866626517389128266735,7379361747422713811654086477766,5686385026105901867473638678946]
    52. b=[19616973567618515464515107624812]
    53. c=[13404203109409336045283549715377,13028011585706956936052628027629,6149264605288583791069539134541]
    54. for x in a:
    55. for y in b:
    56. for z in c:
    57. m = crt(p1,p2,p3,x, y, z)
    58. m=long_to_bytes(m)
    59. if b'ctf{' in m:
    60. print(m)
    61. break

    最终得到:b'\x02\xd1^\xcb\x84\x84RC\xf3J\x000ctf{HahA!Thi5_1s_n0T_rSa~}\n'

  • 相关阅读:
    【BOOST C++ 12 函数式编程】(3) Boost.Boost.Bind
    vue独立提供模板下载功能
    鼠标参数以及选购DPI和报告率
    zabbix监控
    chromedriver依赖安装失败 解决办法
    NEON优化:性能优化经验总结
    集合框架----源码解读LikedeHashSet篇
    JavaScript高级
    Linux更新IP后如何配置网卡
    HTTP服务器
  • 原文地址:https://blog.csdn.net/shshss64/article/details/127725865