---
# System prepended metadata

title: Writeup crypto_n0tr5a

---

# 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 