主页 > 软件开发  > 

2025N1CTFcrypto复现

2025N1CTFcrypto复现
近一个月都没有学习了,一些比赛也没有打,很惭愧自己还是处在刚放假时的水平啊,马上开学了,抓紧做一些训练来康复。 CheckIn import os from Crypto.Util.number import * from secret import FLAG p, q = getPrime(512), getPrime(512) n = p * q phi = (p - 1) * (q - 1) e = 65537 r = bytes_to_long(b'n1junior2025') gift = ((2025 * p + r * r) * p % phi) >> 750 msg = bytes_to_long(FLAG) ct = pow(msg, e, n) print(f"n = {n}") print(f"e = {e}") print(f"ct = {ct}") print(f"gift = {gift}") ''' n = 127060392619341060272126983366487069092712215979664340339428955285201267724168574813227106020122399594060458777939446978632526348867806863618885370221957087197582864380885199290793062293120324984868138488667017882272415668310242448870352699380394381756621677031459335310964085476227148301120850021800822495119 e = 65537 ct = 18305235107479382231970252522433686185039231184629854177334609960907102735540326234277108553640185845164498239822263821349544015918443334769445559622730315115384134147808359107914969010678607157349844717217781801237935737980608575612421610972048739840839726108493286994232100086338529591086935374295281642738 gift = 8312456126096895497368692810699639462746223116345115761188530231045483000989605820 '''

经典RSA,唯一的额外信息在gift,测一下发现r是90bit,gift在移位是273+750位,也就是1024位左右,也就是说等式两边可以画一个约等于符号,通过在实数域上的近似计算,可以恢复p的高位

from Crypto.Util.number import * from libnum import * n = 127060392619341060272126983366487069092712215979664340339428955285201267724168574813227106020122399594060458777939446978632526348867806863618885370221957087197582864380885199290793062293120324984868138488667017882272415668310242448870352699380394381756621677031459335310964085476227148301120850021800822495119 e = 65537 ct = 18305235107479382231970252522433686185039231184629854177334609960907102735540326234277108553640185845164498239822263821349544015918443334769445559622730315115384134147808359107914969010678607157349844717217781801237935737980608575612421610972048739840839726108493286994232100086338529591086935374295281642738 gift = 8312456126096895497368692810699639462746223116345115761188530231045483000989605820 r = bytes_to_long(b'n1junior2025') g=gift<<750 PR.<x> = PolynomialRing(RealField(1000)) for i in trange(2300,2400): f=g*x-2025*x^3-x^2*r^2-i*(x-1)*(n-x) root=f.roots() ph=int(root[-1][0])>>226<<226#总共就三组,都试试就可以用最后一组解出 PR.<y> = PolynomialRing(Zmod(n)) f=ph+y res=f.small_roots(X=2**226,beta=0.4) if res and res[0]!=0: p=int(res[0])+ph print(res,p) break q=n//p print(long_to_bytes(pow(ct,invmod(e,(p-1)*(q-1)),n)))
标签:

2025N1CTFcrypto复现由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“2025N1CTFcrypto复现