ctf show unusualrsa4

题目描述:

# ********************
# @Author: Lazzaro
# ********************

from Crypto.Util.number import getPrime,bytes_to_long,long_to_bytes
from gmpy2 import invert,gcd
from secret import flag

m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
n = p*q
print(invert(q,p))

e = 0x10001
d = invert(e,(p-1)*(q-1))
print(d)

c = pow(m,e,n)
print(c)
'''
113350138578125471637271827037682321496361317426731366252238155037440385105997423113671392038498349668206564266165641194668802966439465128197299073392773586475372002967691512324151673246253769186679521811837698540632534357656221715752733588763108463093085549826122278822507051740839450621887847679420115044512
27451162557471435115589774083548548295656504741540442329428952622804866596982747294930359990602468139076296433114830591568558281638895221175730257057177963017177029796952153436494826699802526267315286199047856818119832831065330607262567182123834935483241720327760312585050990828017966534872294866865933062292893033455722786996125448961180665396831710915882697366767203858387536850040283296013681157070419459208544201363726008380145444214578735817521392863391376821427153094146080055636026442795625833039248405951946367504865008639190248509000950429593990524808051779361516918410348680313371657111798761410501793645137
619543409290228183446186073184791934402487500047968659800765382797769750763696880547221266055431306972840980865602729031475343233357485820872268765911041297456664938715949124290204230537793877747551374176167292845717246943780371146830637073310108630812389581197831196039107931968703635129091224513813241403591357678410312272233389708366642638825455844282490676862737715585788829936919637988039113463707959069907015464745700766013573282604376277598510224455044288896809217461295080140187509519005245601483583507547733673523120385089098002298314719617693895392148294399937798485146568296114338393548124451378170302291
'''

题目分析:

  • 首先已知条件有(设q1为q的逆元):
q1= 113350138578125471637271827037682321496361317426731366252238155037440385105997423113671392038498349668206564266165641194668802966439465128197299073392773586475372002967691512324151673246253769186679521811837698540632534357656221715752733588763108463093085549826122278822507051740839450621887847679420115044512
d = 27451162557471435115589774083548548295656504741540442329428952622804866596982747294930359990602468139076296433114830591568558281638895221175730257057177963017177029796952153436494826699802526267315286199047856818119832831065330607262567182123834935483241720327760312585050990828017966534872294866865933062292893033455722786996125448961180665396831710915882697366767203858387536850040283296013681157070419459208544201363726008380145444214578735817521392863391376821427153094146080055636026442795625833039248405951946367504865008639190248509000950429593990524808051779361516918410348680313371657111798761410501793645137
c = 619543409290228183446186073184791934402487500047968659800765382797769750763696880547221266055431306972840980865602729031475343233357485820872268765911041297456664938715949124290204230537793877747551374176167292845717246943780371146830637073310108630812389581197831196039107931968703635129091224513813241403591357678410312272233389708366642638825455844282490676862737715585788829936919637988039113463707959069907015464745700766013573282604376277598510224455044288896809217461295080140187509519005245601483583507547733673523120385089098002298314719617693895392148294399937798485146568296114338393548124451378170302291
e = 65537
  • 因为不知道做,所以只能求助于提示:
    ctf show unusualrsa4_第1张图片
  • 首先 e * d = 1 + k * φ,其中d和φ的比特位数均为2048,这就说明e和k的比特位数是接近的,由此可以爆破出k,从而能得到φ:
q1= 113350138578125471637271827037682321496361317426731366252238155037440385105997423113671392038498349668206564266165641194668802966439465128197299073392773586475372002967691512324151673246253769186679521811837698540632534357656221715752733588763108463093085549826122278822507051740839450621887847679420115044512
d = 27451162557471435115589774083548548295656504741540442329428952622804866596982747294930359990602468139076296433114830591568558281638895221175730257057177963017177029796952153436494826699802526267315286199047856818119832831065330607262567182123834935483241720327760312585050990828017966534872294866865933062292893033455722786996125448961180665396831710915882697366767203858387536850040283296013681157070419459208544201363726008380145444214578735817521392863391376821427153094146080055636026442795625833039248405951946367504865008639190248509000950429593990524808051779361516918410348680313371657111798761410501793645137
c = 619543409290228183446186073184791934402487500047968659800765382797769750763696880547221266055431306972840980865602729031475343233357485820872268765911041297456664938715949124290204230537793877747551374176167292845717246943780371146830637073310108630812389581197831196039107931968703635129091224513813241403591357678410312272233389708366642638825455844282490676862737715585788829936919637988039113463707959069907015464745700766013573282604376277598510224455044288896809217461295080140187509519005245601483583507547733673523120385089098002298314719617693895392148294399937798485146568296114338393548124451378170302291
e = 65537
# print((d).bit_length()) # 2048
# e * d = 1 + k * phi
for k in range(1,e):
    if (e * d - 1) % k == 0:
        phi = (e * d - 1) // k
        print(phi)
        break
  • 提示1.2:尝试化简(q1 * φ )mod p

其中q1 * q = 1 mod p ==> q1 * q = 1
(q1 * phi ) % p=[ q1 * (p - 1) * (q-1) ] % p
------------------ = (q1 * p * q - q1 * p - q1 * q + q1) % p
------------------ = (q1 - q1 * q ) % p
------------------ = (q1 - 1) % p
===>
q1 * phi = (q1 - 1) % p
q1 * phi = q1 - 1 + k * p
q1 * phi - q1 + 1 = k * p

  • 令kq = q1 * phi - q1 + 1 , 易知kq是p的倍数
  • 接下来我们来看2.1的提示,假设出一个未知数g,其中gcd(g,p) = 1,那么:

运用费马小定理得:
== > g ** (p-1) = 1 mod p
== > g ** (p-1)*(q-1) = 1 mod p
== > g ** φ = 1 mod p
== > 1 = g ** φ mod p
根据L:对于任意 r,k1,k2,当 k2 为 k1 因子时,r mod k2=(r mod k1) mod k2
==> 1 = g ** φ mod p = g ** φ mod kp
(其中k1 = kp, k2 = p)
==> g ** φ = 1 mod kp
==> g ** φ - 1 = k’ * kp

  • 如此我们只要对g取两个数, 然后按照公式求公因子即可得到p
  • p,q1都知道了,那么取q1的逆元即可得到q,以下是完整代码(顺便提醒一下,我们求公因子得到的是k’ * kp, 要得到真正的p, 得满足公因子的比特长度为1024(题目给的条件,我们用它来求出真正的p)):
q_1= 113350138578125471637271827037682321496361317426731366252238155037440385105997423113671392038498349668206564266165641194668802966439465128197299073392773586475372002967691512324151673246253769186679521811837698540632534357656221715752733588763108463093085549826122278822507051740839450621887847679420115044512
d = 27451162557471435115589774083548548295656504741540442329428952622804866596982747294930359990602468139076296433114830591568558281638895221175730257057177963017177029796952153436494826699802526267315286199047856818119832831065330607262567182123834935483241720327760312585050990828017966534872294866865933062292893033455722786996125448961180665396831710915882697366767203858387536850040283296013681157070419459208544201363726008380145444214578735817521392863391376821427153094146080055636026442795625833039248405951946367504865008639190248509000950429593990524808051779361516918410348680313371657111798761410501793645137
c = 619543409290228183446186073184791934402487500047968659800765382797769750763696880547221266055431306972840980865602729031475343233357485820872268765911041297456664938715949124290204230537793877747551374176167292845717246943780371146830637073310108630812389581197831196039107931968703635129091224513813241403591357678410312272233389708366642638825455844282490676862737715585788829936919637988039113463707959069907015464745700766013573282604376277598510224455044288896809217461295080140187509519005245601483583507547733673523120385089098002298314719617693895392148294399937798485146568296114338393548124451378170302291
e = 65537
print(d.bit_length()) # 2048
for k in range(1,e):
    # 枚举phi
    t = e * d - 1
    if t % k == 0:
        phi = t // k
        kp = q_1 * phi - q_1 + 1
        x1 = pow(3, phi, kp) - 1
        x2 = pow(5, phi, kp) - 1
        x = gcd(x1,x2)
        print(x)
        if x.bit_length() == 1024:
            p = x
            q = invert(q_1,p)
            n, phi = q * p,(p-1)*(q-1)
            assert d == invert(e,phi)
            m = pow(c,d,n)
            print(long_to_bytes(m))
  • 得到:flag{wh47_1f_y0u_kn0w_1nv3r7_q_p~?}

体会:

这题没有提示真做不出,反正我做不出

你可能感兴趣的:(ctf,show,密码RSA,python,python,密码学,安全)