# Tính
```python=
from Crypto.Util.number import *
from secret import flag
def gen(nbit, m):
kbit = int(nbit * 0.4512)
key = getPrime(kbit)
while True:
p = getPrime(nbit // 2 - 1)
if isPrime(p * 2 + 1):
p = p * 2 + 1
break
while True:
q = getPrime(nbit // 2 - 1)
if isPrime(q * 2 + 1):
q = q * 2 + 1
break
n = p * q
phi = (p - 1) * (q - 1)
e, k = [], []
for i in range(m):
d = key + 2 * i + 2
ee = inverse(d, phi)
kk = (ee * d - 1) // phi
e.append(ee % 2 ** (nbit - kbit))
k.append(kk)
return n, e, k
n, e, k = gen(1024, 12)
enc = pow(bytes_to_long(flag), 65537, n)
with open("data.txt","w") as f:
f.write(f"{n = }\n{enc = }\n{e = }\n{k = }\n")
```
Ta có:
$$
k_i = \frac{ee_id_i-1}{\phi} = \frac{ee_i(key+2i+2)-1}{\phi} \\
$$
$$
\Rightarrow \phi = \frac{ee_i(key+2i+2)-1}{k_i} \\
$$
$$
\Rightarrow \frac{ee_i(key+2i+2)-1}{k_i} = \frac{ee_j(key+2j+2)-1}
{k_j} \\
$$
$$
\Rightarrow ee_i(key+2i+2)k_j - k_j = ee_j(key+2j+2)k_i - k_i \\
$$
$$
\Rightarrow e_i(key+2i+2)k_j - k_j \equiv e_j(key+2j+2)k_i - k_i \pmod{2^{562}}
$$
vì key chỉ có 462 bit, giải phương trình trên ta được $key \bmod 2^{562} = key$
Quay lại phương trình đầu tiên:
$$
\phi{k_i} = { ee_id_i-1} \\
$$
$$
\Rightarrow \phi{k_i} \equiv -1 \pmod{d_i}
$$
$$
\Rightarrow \phi \equiv -k_i^{-1} \pmod{d_i}
$$
$\phi < 2^{1024}$, $d_i$ khoảng 462 bit
$\Rightarrow$ lọc trong $d$ khoảng 3-4 $d_i$ sao cho từng cặp bất kỳ đều nguyên tố cùng nhau, sau đó dùng thặng dư trung hoa ta sẽ tính được $\phi$
Sau khi có $\phi$, dễ dàng tìm được khóa bí mật và giải mã RSA $enc$ để lấy flag