⭕ 考察內容
1、非標準RSA加密演算法
2、逆元求解
3、因式分解(yafu)
一、題目
給出一串程式碼,大概看一眼是類似RSA的加密演算法,但是其n的選取並非2個素數的乘積,而是5個素數的乘積,所以並不是標準的RSA加密。
再看一眼檔案,發現給出了n和e
二、解題
1、因數分解
由於n僅有96位,所以嘗試使用yafu進行因式分解
得到了5個素數
2、仔細閱讀程式碼
順便學習一下語法,發現加密演算法是類似RSA的非標準加密演算法
while True:
##這是定義n為一個陣列並且使用迴圈重複呼叫getPrime()來生成5個元素
ps = [number.getPrime(size) for _ in range(n)]
##使用set()把列表轉化為集合來進行去重,也就是保證列表中沒有相同的素數
if len(set(ps)) == n:
break
##這是一段reduce()和lambda表示式聯用的程式碼,功能在於實現求取ps中所有元素的乘積並賦值給n
n = reduce(lambda x, y: x*y, ps)
- reduce()函式
- lambda表示式聯用
參考連結
3、編寫解密指令碼
查了一下,解密演算法與RSA解密類似,只是phi要變為多個(素數-1)的乘積,再利用e和phi求解逆元d即可,最後解密即可
三、指令碼程式碼與答案
from Crypto.Util.number import long_to_bytes,bytes_to_long,inverse
c = 144009221781172353636339988896910912047726260759108847257566019412382083853598735817869933202168
n = 175797137276517400024170861198192089021253920489351812147043687817076482376379806063372376015921
e = 65537
p1 = 9401433281508038261
p2 = 11855687732085186571
p3 = 13716847112310466417
p4 = 11215197893925590897
p5 = 10252499084912054759
phi = (p1-1)*(p2-1)*(p3-1)*(p4-1)*(p5-1)
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
HSCTF{@Tv0_br3ad5_c1ip_cHe3se_!@}