[其它交流] 攻防世界Crypto练习区:crypto_rsa1练习

262 0
小菜鸟一枚 2022-10-30 13:27:02 | 显示全部楼层 |阅读模式
0x1 题目来源
  1.攻防世界Crypto练习区:crypto_rsa1。

  2.题目没有描述,下载后是一个压缩包,解压后看到源码:

  1. from Crypto.Util.number import getPrime, isPrime, getRandomNBitInteger, bytes_to_long, long_to_bytes
  2. from gmpy2 import powmod,invert,gcd
  3. from flag import flag
  4. import sympy

  5. q = getPrime(1024)
  6. p = sympy.nextprime(q)
  7. N = p * q
  8. e = 0x10001
  9. flag = flag.ljust(80)
  10. m = bytes_to_long(flag)
  11. c = pow(m,e,N)

  12. print('N = ',N)
  13. print('e = ',e)
  14. print('c = ',c)

  15. '''
  16. N =  12194420073815392880989031611545296854145241675320130314821394843436947373331080911787176737202940676809674543138807024739454432089096794532016797246441325729856528664071322968428804098069997196490382286126389331179054971927655320978298979794245379000336635795490242027519669217784433367021578247340154647762800402140321022659272383087544476178802025951768015423972182045405466448431557625201012332239774962902750073900383993300146193300485117217319794356652729502100167668439007925004769118070105324664379141623816256895933959211381114172778535296409639317535751005960540737044457986793503218555306862743329296169569
  17. e =  65537
  18. c =  4504811333111877209539001665516391567038109992884271089537302226304395434343112574404626060854962818378560852067621253927330725244984869198505556722509058098660083054715146670767687120587049288861063202617507262871279819211231233198070574538845161629806932541832207041112786336441975087351873537350203469642198999219863581040927505152110051313011073115724502567261524181865883874517555848163026240201856207626237859665607255740790404039098444452158216907752375078054615802613066229766343714317550472079224694798552886759103668349270682843916307652213810947814618810706997339302734827571635179684652559512873381672063
  19. '''
复制代码

  3. 看源码给出了N,e,c,这个sympy.nextprime(q),表示p和q接近。

0x2 分析工具
  1.想办法分解大数N,已经p,q,e,c再使用rsa计算工具得到明文d,网上找到了一篇参考教程:https://www.bilibili.com/read/cv13392301/

  2.在线查询分解网站:http://www.factordb.com/index.php

  3.使用yafu工具分解,下载地址:https://sourceforge.net/projects/yafu/

  4.费马定理分解

  1. def isqrt(n):
  2.   x = n
  3.   y = (x + n // x) // 2
  4.   while y < x:
  5.     x = y
  6.     y = (x + n // x) // 2
  7.   return x

  8. def fermat(n, verbose=True):
  9.     a = isqrt(n) # int(ceil(n**0.5))
  10.     b2 = a*a - n
  11.     b = isqrt(n) # int(b2**0.5)
  12.     count = 0
  13.     while b*b != b2:
  14.         # if verbose:
  15.         #     print('Trying: a=%s b2=%s b=%s' % (a, b2, b))
  16.         a = a + 1
  17.         b2 = a*a - n
  18.         b = isqrt(b2) # int(b2**0.5)
  19.         count += 1
  20.     p=a+b
  21.     q=a-b
  22.     assert n == p * q
  23.     # print('a=',a)
  24.     # print('b=',b)
  25.     # print('p=',p)
  26.     # print('q=',q)
  27.     # print('pq=',p*q)
  28.     return p, q
  29. fermat(n)
复制代码

0x3 脚本解密
&#8195;&#8195;1.套用参考文章的脚本,替换N,e,c三个值,得到:

  1. import  gmpy2
  2. import libnum

  3. def isqrt(n):
  4.   x = n
  5.   y = (x + n // x) // 2
  6.   while y < x:
  7.     x = y
  8.     y = (x + n // x) // 2
  9.   return x

  10. def fermat(n, verbose=True):
  11.     a = isqrt(n) # int(ceil(n**0.5))
  12.     b2 = a*a - n
  13.     b = isqrt(n) # int(b2**0.5)
  14.     count = 0
  15.     while b*b != b2:
  16.         # if verbose:
  17.         #     print('Trying: a=%s b2=%s b=%s' % (a, b2, b))
  18.         a = a + 1
  19.         b2 = a*a - n
  20.         b = isqrt(b2) # int(b2**0.5)
  21.         count += 1
  22.     p=a+b
  23.     q=a-b
  24.     assert n == p * q
  25.     # print('a=',a)
  26.     # print('b=',b)
  27.     print('p=',p)
  28.     print('q=',q)
  29.     # print('pq=',p*q)
  30.     return p, q
  31. n= 12194420073815392880989031611545296854145241675320130314821394843436947373331080911787176737202940676809674543138807024739454432089096794532016797246441325729856528664071322968428804098069997196490382286126389331179054971927655320978298979794245379000336635795490242027519669217784433367021578247340154647762800402140321022659272383087544476178802025951768015423972182045405466448431557625201012332239774962902750073900383993300146193300485117217319794356652729502100167668439007925004769118070105324664379141623816256895933959211381114172778535296409639317535751005960540737044457986793503218555306862743329296169569
  32. e= 65537
  33. c= 4504811333111877209539001665516391567038109992884271089537302226304395434343112574404626060854962818378560852067621253927330725244984869198505556722509058098660083054715146670767687120587049288861063202617507262871279819211231233198070574538845161629806932541832207041112786336441975087351873537350203469642198999219863581040927505152110051313011073115724502567261524181865883874517555848163026240201856207626237859665607255740790404039098444452158216907752375078054615802613066229766343714317550472079224694798552886759103668349270682843916307652213810947814618810706997339302734827571635179684652559512873381672063
  34. pq=fermat(n)
  35. p=pq[0]
  36. q=pq[1]
  37. phi_n=(p-1)*(q-1)
  38. #求逆元
  39. #d=libnum.invmod(e,phi_n)
  40. d=gmpy2.invert(e,phi_n)
  41. m=pow(c,d,n)
  42. print(m)
  43. print(libnum.n2s(int(m)).decode())
复制代码

&#8195;&#8195;2.执行py脚本报错,提示没有找到libnum模块,输入pip install libnum安装,运行再报错,重复同样的步骤安装对应模块即可。
  1. C:\Users\LENOVO\Desktop>1.py
  2. Traceback (most recent call last):
  3.   File "C:\Users\LENOVO\Desktop\1.py", line 2, in <module>
  4.     import libnum
  5. ModuleNotFoundError: No module named 'libnum'
复制代码

&#8195;&#8195;3.打印出了p,q的值和flag。
  1. C:\Users\LENOVO\Desktop>1.py
  2. p= 11042834814401324223490700808335597483426691702722872474973038510408702524935
  3. 23459461649803610821785323136697674852702543264047239481539129106881181406217129
  4. 22649644396733499972695482991866293857864311557686710317462165131360819813493524
  5. 457615383204504505224030129953230866877990529769205769592709254542472051
  6. q= 11042834814401324223490700808335597483426691702722872474973038510408702524935
  7. 23459461649803610821785323136697674852702543264047239481539129106881181406217129
  8. 22649644396733499972695482991866293857864311557686710317462165131360819813493524
  9. 457615383204504505224030129953230866877990529769205769592709254542470619
  10. 18253925923982047205986424851121322554758057061858542412479835360825682848439282
  11. 39211521652778447259428509799330489185958833814558444450696791918083165183860444
  12. 150060968303497172121385611304992
  13. flag{5c9c885c361541e0b261f58b61db8cec}
复制代码

&#8195;&#8195;4.提交flag,验证通过:

0x4总结
&#8195;&#8195;这种方法是在已知大数N,加密密钥e,密文c才可以使用,并且e很小,p和q接近,才会很快爆出。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行