1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| from Crypto.Util.number import long_to_bytes import math from sympy import nextprime, gcd
# 从output.txt读取数据 with open('output.txt', 'r') as f: data = f.read()
# 解析数据 my_key = eval(data.split("My private key:")[1].split("My Friend's public keys:")[0].strip()) friend_keys = eval(data.split("My Friend's public keys:")[1].split("Encrypted flag:")[0].strip()) encrypted_flag = int(data.split("Encrypted flag:")[1].strip())
N, d = my_key e = 0x10001 # 65537
# 已知d分解N的算法 def factorize_N(N, e, d): k = e * d - 1 g = 2 while True: # 将k表示为k = 2^s * t,其中t为奇数 t = k while t % 2 == 0: t //= 2 x = pow(g, t, N) y = gcd(x - 1, N) if y > 1 and y < N: p = y q = N // y return p, q g = nextprime(g)
# 分解N得到p和q p, q = factorize_N(N, e, d) print(f"Found factors: p={p}, q={q}")
# 计算欧拉函数 phi = (p - 1) * (q - 1)
# 反向解密(从最后一个朋友开始) friend_keys.reverse() current = encrypted_flag for _, friend_e in friend_keys: # 计算朋友的私钥指数 friend_d = pow(friend_e, -1, phi) # 解密 current = pow(current, friend_d, N)
# 转换为字节 flag = long_to_bytes(current) print(f"Flag: {flag.decode()}")
|
💬 评论与讨论
分享你的想法和见解