題目連結#
https://learn.cylabacademy.org/library/470
題目解法#
使用 nc 連線後題目會提供 $N$, $e$(每次都不一樣)。在這題題目中的 $N$ 有明顯的漏洞,就是是 2 的倍數,代表其中一個質數一定是 $p = 2$。
解密步驟:
計算出 $q$
$$q = \frac{N}{2}$$
計算出 $\phi(n)$
$$\phi(n) = \phi(p) \times \phi(q) = (p-1) \times (q-1) = (2-1) \times (q-1) = q-1$$
計算私鑰 $d$:
使用模反元素(Modular Inverse)公式:
$$d \equiv e^{-1} \pmod{\phi(N)}$$
解密密文 $C$:
$$m = C^d \pmod{N}$$
轉換為文字:
將得到的長整數 $m$ 轉回 bytes,再以 UTF-8 解碼。
解題腳本#
將 $N$, $e$, $cyphertext$ 填入執行即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| from Crypto.Util.number import long_to_bytes, inverse
# 已知資訊
N = 24363402644768690727955172666209469821725905198393631084455253811708663554350947264649402937037672246381690969915451279285279631133822103514599606304356602
e = 65537
cyphertext = 13597050467487786638619946148639439992899445404956336122073567173641265830288842478196554274484546393046984321139824087540835441687603028763464962383947497
# 1. 分解 N (因為 N 是偶數,所以其中一個質數是 2)
p = 2
q = N // p
# 2. 計算 phi(N)
phi = (p - 1) * (q - 1)
# 3. 計算私鑰 d
d = inverse(e, phi)
# 4. 解密
m_long = pow(cyphertext, d, N)
# 5. 轉回字串
print(long_to_bytes(m_long).decode('utf-8'))
|
題目原始碼#
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
| from sys import exit
from Crypto.Util.number import bytes_to_long, inverse
from setup import get_primes
e = 65537
def gen_key(k):
"""
Generates RSA key with k bits
"""
p,q = get_primes(k//2)
N = p*q
d = inverse(e, (p-1)*(q-1))
return ((N,e), d)
def encrypt(pubkey, m):
N,e = pubkey
return pow(bytes_to_long(m.encode('utf-8')), e, N)
def main(flag):
pubkey, _privkey = gen_key(1024)
encrypted = encrypt(pubkey, flag)
return (pubkey[0], encrypted)
if __name__ == "__main__":
flag = open('flag.txt', 'r').read()
flag = flag.strip()
N, cypher = main(flag)
print("N:", N)
print("e:", e)
print("cyphertext:", cypher)
exit()
|