EIP 4337
EOF CTF 2025
跟學弟一起去參加人生首次Attack & Defense,意外拿到第四名。
以此記錄一下crypto菜雞在別人解完兩題開打AD時我還在解半天。
PRSA
1 | from Crypto.Util.number import getPrime, getRandomRange, bytes_to_long |
解題思路
看程式可以知道程式會先給 flag 的密文,接著可以透過選擇1,2來轉換RSA 與 Paillier 加密。
這題主要分成兩個部分,第一個是得先還原 N。
第二部分就是要利用兩組RSA密文用Franklin-Reiter解出密文
還原 N
在分析 Paillier 與 RSA 的轉換的功能的時候,可以發現:
而 Paillier 可以有同態運算的特性
例如:
因此我麼可以構造一個
p(1) = rsa_to_paillier(1)
p(2) = p(1) * p(1)
p(4) = p(2) * p(2)
rsa(2) = paillier_to_rsa(p(1)*p(1))
rsa(4) = paillier_to_rsa(p(2)*p(2))
則我們可以得:
2^e - rsa(2) = 2^e - 2^e mod n = kn
4^e - rsa(4) = 2^e - 2^e mod n = mn
因此我們求 gcd(kn, mn) 即可求得 n
1 | from pwn import * |
Franklin-Reiter
接著我們可以使用Franklin-Reiter 去求 Flag。
首先,我們先把 rsa(flag) 轉換成 paillier(flag)
接著利用同態加密計算 paillier(flag + 2)
(不知道為何測試的時候+1會壞掉,所以這邊就+2了)
再把paillier加密後的結果拿去還原回去rsa(flag+2)
用 Franklin-Reiter即可求解
因為我沒有成功裝好 sage 的 ptyhon lib
所以我就把腳本分開寫了
1 | import libnum |
後記
第二題要破 2049 bits 的 Python random number 實在是寫不出來。
博士生涯也沒打過幾場CTF,謝謝學弟們在我僅存不到一年(大概吧?)的學生生涯找我一起玩
希望大家都玩得愉快。