# 导入 Crypto.Util.number 模块中的所有函数,用于处理数字和字节之间的转换等 from Crypto.Util.number import *
"""输入部分""" # 已知的模数 n,用于 RSA 加密和解密 n = 4024941574680124502316363981547051098032677531528457166859670261861728313081282635664023890534034586556845494323497683923813915739234466472396261320600483 # 已知的公钥指数 e,通常为 65537 e = 65537 # 已知的密文 c,需要被解密 c = 226967182640114431119923862488626190608050511354278604627242247124377735518111678279381846350389469161980779137969837090666693533616114290831130137310320 # 已知的质数 p,用于计算私钥 p = 62658315832909660478685872111870233686035497063073558738980225214351386198939 # 已知的质数 q,用于计算私钥 q = 64236351092062515945998729497153532140067861836088195242257976217499252460697
"""处理部分""" # 计算欧拉函数 phi(n),用于RSA算法中的私钥计算 phi = (p-1)*(q-1) # 计算私钥指数 d ,即 e 在模 phi(n) 的逆元 d = inverse(e,phi) # 使用私钥指数 d 解密密文 c,得到明文 m,具体就是 m = c ** d (modn) m = pow(c, d, n) # 将解密后的长整数 m 转换回字符串,得到原始的 flag 信息 flag = long_to_bytes(m)
from Crypto.Util.number import * from math import gcd
defcommon_modulus_attack(n, e1, e2, c1, c2): # 扩展欧几里得算法,求解 a * e1 + b * e2 = 1 defegcd(a, b): if b == 0: return (a, 1, 0) else: g, y, x = egcd(b, a % b) return (g, x, y - (a // b) * x)
g, a, b = egcd(e1, e2) if g != 1: raise Exception("e1 and e2 are not coprime!")
# 若 a < 0,则计算 c1^{-a} mod n,即模逆+幂 if a < 0: c1 = inverse(c1, n) a = -a if b < 0: c2 = inverse(c2, n) b = -b
m = (pow(c1, a, n) * pow(c2, b, n)) % n return m
# 示例数据(演示用,请替换为真实数据) n = 18962682884029916758266148712505745769930251807486581175852746411420202928241516937832183978007221718832524708070926778926047462679852701680119573672086987102806746013917856291115241315396097056547791102379598520572653521839151746091770505325576025506216040948960407634360766413917009528663176592446406188935607285249768406522483451323332869038201690761692396934508701198776039170160825932569854510890717698839864324907395534236377475429151260126650206505223888915546928897884818098697371381102013517518088143512010341618604013730873811895372101358873053673492497993058229695619855124625929422288077109937999813125009 e1 = 17 e2 = 13 m = b"attack at dawn" m_int = bytes_to_long(m)
from Crypto.Util.number import bytes_to_long, long_to_bytes import gmpy2
deflow_exponent_attack(c, e): # 直接计算整数的e次根 m_root, exact = gmpy2.iroot(c, e) ifnot exact: raise ValueError("The root is not exact; m^e >= n, attack failed.") returnint(m_root)
# 示例明文 plaintext = b"attack at dawn" m = bytes_to_long(plaintext)
# 参数设置(低指数 e=3) n = 17207813408827103864232834453718240404256207776473195603833883222550085713263312178061956051570981138304553424351533759341843886988037589996836800172080989247901092860675283917792376508142626356947018854628009464434064348703066932998068320382047678068831988903330670000137190543367195121038536391898033648631182445857699244565169300742700970528157714029607334860854474360615932123721060603038551920908076990199310564184431371353455563870497874701913547639261995158683757252811208140013377653322801908827687229389173989691699203062882442083075199375009430197914167802307859798384351637765054362302474384036006738670083 e = 3 c = pow(m, e, n)
import gmpy2 from functools import reduce from Crypto.Util.number import long_to_bytes
defCRT(items): N = reduce(lambda x, y: x * y, (i[1] for i in items)) result = 0 for a, n in items: m = N // n d, r, s = gmpy2.gcdext(n, m) if d != 1: raise Exception("Input not pairwise co-prime") result += a * s * m return result % N, N
# 示例数据(需至少2组n和c) e = 3 n = [ 3733764742621371987947351902968312868056845889086054346406914908377408144612536549613883596047991001782736997571483548656987227352705958618056056807752367, 5975714612645545165217802713165264900295593190225535517994609218472455963199049168546710002169642814118703212038789758731340259084486414821051036778066333 ] c = [ 7722709502790459166639993213708833737796147876436427049309008419119949153843426449996193173565875000, 7722709502790459166639993213708833737796147876436427049309008419119949153843426449996193173565875000 ]
import gmpy2 from Crypto.Util.number import long_to_bytes import hashlib
defcontinuedFra(x, y): cF = [] while y: cF.append(x // y) x, y = y, x % y return cF
defSimplify(ctnf): numerator = 0 denominator = 1 for x inreversed(ctnf): numerator, denominator = denominator, x * denominator + numerator return (numerator, denominator)
defcalculateFrac(x, y): cF = continuedFra(x, y) cF = [Simplify(cF[:i]) for i inrange(1, len(cF)+1)] return cF
defsolve_pq(a, b, c): par = gmpy2.isqrt(b * b - 4 * a * c) return (-b + par) // (2 * a), (-b - par) // (2 * a)
defwienerAttack(e, n): for (d, k) in calculateFrac(e, n): if k == 0: continue if (e * d - 1) % k != 0: continue phi = (e * d - 1) // k p, q = solve_pq(1, n - phi + 1, n) if p * q == n: returnabs(int(p)), abs(int(q)) print('[!]not find!') returnNone, None
n = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170646906557242832893914902053581087502512787303322747780420210884852166586717636559058152544979471 e = 46731919563265721307105180410302518676676135509737992912625092976849075262192092549323082367518264378630543338219025744820916471913696072050291990620486581719410354385121760761374229374847695148230596005409978383369740305816082770283909611956355972181848077519920922059268376958811713365106925235218265173085
p, q = wienerAttack(e, n) if p and q: print('[+]Found!') print('[-]p =', p) print('[-]q =', q) d = gmpy2.invert(e, (p-1)*(q-1)) d_int = int(d) flag = "flag{" + hashlib.md5(hex(d_int).encode()).hexdigest() + "}" print(flag) else: print("Failed to factorize n")
defrecover_p_from_dp(e, n, dp): m = 2# 任意数(通常选小整数) c = pow(m, e, n) m_p = pow(c, dp, n) p = gmpy2.gcd(m_p - m, n) if p != 1and p != n: return p returnNone
e = 65537 n = 123... # 模数 dp = 456... # 泄露的dp p = recover_p_from_dp(e, n, dp) if p: q = n // p print("Found p:", p) print("Found q:", q)