1. 程式人生 > >Python下關於RSA解密模組的使用

Python下關於RSA解密模組的使用

最近籌備一場CTF比賽發現了一道關於RSA解密的題如下:

 

#小明得到了一個 RSA 加密資訊,你能幫他解開嗎?

n = 41069065654959614597750207738698085798765257876378561837894254544512565197793

c = 27990707239527629138352696377606718299992092729307910015562504696905353450041

e = 11

這道題主要考察了參賽選手對RSA加密原理的理解

RSA解密的公式是m=c^d mod n

如果要解密,現在依靠題目提供的資訊還缺少一個d

得到引數D的方法:

按正常的方法要使用e與φ(n)互質的特性計算d

先計算φ(n)=(q-1)*(p-1)= t #41069065654959614597750207738698085798358793355227373058859423166149935907348   因為e與φ(n)互質,根據求模反元素的公式計算e,對於e的模反元素d有:
ed≡1(modφ(n)) #14934205692712587126454620995890213017585015765537226566857972060418158511763   在這裡直接使用CTF比賽機器提供的python模組gmpy2下的invert方法 gmpy2.invert(e,t) #14934205692712587126454620995890213017585015765537226566857972060418158511763 直接傳入e和φ(n)直接可以算出d的值   現在我們已經得到了d的值,直接套進公式c^d mod n得出m = 29517411348814866499427616583800503208093502027866036802414445379669260002593 現在也可以使用python的pow函式代替這個公式 m = pow(c,d,n) #29517411348814866499427616583800503208093502027866036802414445379669260002593 這串數字並不是我們要的結果,轉換成16進位制再decode直接可以得出明文FLAG print hex(pow(c,d,n))[2:].decode('hex') ABCEF!th1s_was_very_hot_outside!