MagicianV RSA 题解(WP)
题目源码:
from Crypto.Util.number import *
from secret import flag, p, q
from hashlib import *
import random
assert 'flag{' + md5(str(p).encode()).hexdigest() + '}' == flag
assert isPrime(p), isPrime(q)
assert p.bit_length() == 1024, q.bit_length() == 1024
m = random.getrandbits(400)
e = 65537
d = inverse(e, (p - 1) * (q - 1))
r1, r2, r3 = getPrime(20), getPrime(20), getPrime(10)
dp, dq = d % (p - 1), d % (q - 1)
Sp, Sq = pow(m + getPrime(10), dp, r1 * p), pow(m, dq, r2 * q)
s1, s2 = pow(m, dp % (r1 - 1), r1), pow(m, dq % (r2 - 1), r2)
S_ = Sq + (q * r2) * (int(inverse(q * r2, p * r1)) * (Sp - Sq) % (p * r1))
c1, c2 = (S_ - s1 + 1) % r1, (S_ - s2 + 1) % r2
gamma = (r3 * c1 + (2 ** 10 - r3) * c2) // (2 ** 10)
S = pow(S_, gamma, p * q)
给出了:
-
m -
n = p*q -
S_ -
S
目标:
flag = flag{md5(str(p))}
所以核心是:
分解 n
一、观察关键点
最关键的一句:
S = pow(S_, gamma, n)
即:
S ≡ S_^gamma mod n
这里:
gamma = (r3 * c1 + (2 ** 10 - r3) * c2) // (2 ** 10)
其中:
-
r3是 10 bit 素数 -
c1 < r1 -
c2 < r2 -
r1,r2是 20 bit 素数
因此:
gamma 很小
数量级:
gamma < 2^20
二、爆破 gamma
因为:
S = S_^gamma mod n
而:
gamma < 2^20
所以直接暴力:
for g in range(2**20):
if pow(S_, g, n) == S:
print(g)
得到:
gamma = 337756
三、利用 gamma 分解 n
由于:
S ≡ S_^gamma mod n
则:
S_^gamma - S ≡ 0 mod n
即:
n | (S_^gamma - S)
这意味着:
pow(S_, gamma, n) - S
与 n 存在巨大关系。
进一步考虑:
RSA 中常用:
gcd(a^k - b, n)
去提取因子。
于是尝试:
g = gcd(pow(S_, gamma) - S, n)
即可得到:
p
随后:
q = n // p
完成分解。
四、计算 flag
题目:
flag = flag{md5(str(p))}
因此:
from hashlib import md5
flag = "flag{" + md5(str(p).encode()).hexdigest() + "}"
得到:
flag{b40ea076da8c73572ae5d067aa0fc22e}
五、完整 EXP
from Crypto.Util.number import *
from hashlib import md5
from math import gcd
m = ...
n = ...
S_ = ...
S = ...
for gamma in range(1 << 20):
if pow(S_, gamma, n) == S:
print("[+] gamma =", gamma)
break
x = pow(S_, gamma) - S
p = gcd(x, n)
q = n // p
print("[+] p =", p)
print("[+] q =", q)
flag = "flag{" + md5(str(p).encode()).hexdigest() + "}"
print(flag)
六、题目考点
这题核心是:
小指数泄露
由于:
gamma < 2^20
导致:
S = S_^gamma mod n
可以直接离散爆破。
随后通过:
gcd(pow(S_, gamma) - S, n)
恢复 RSA 因子。
本质属于: