一、題目
給出兩個公鑰和兩個密文
二、解題
1、
兩個公鑰,用Crypto庫可以直接獲取到n1,n2,e1,e2
2、
但是僅有n和e和c無法解出明文,還需要有d,但是算d需要有p和q,列印n發現是個上百位的模數,透過暴力演算法顯然不當,因此棄用yafu。再到http://www.factordb.com/嘗試分解,也沒有結果
3、
正當一籌莫展的時候,列印n1和n2時發現n1和n2相同,兩個不同的公鑰,竟然巧合的存在相同的模數!?於是上網一查,發現對於這種情況可以使用共模攻擊來繞過解密私鑰,僅僅使用n,e1,e2,c1,c2即可破解兩份密文!
共模攻擊原理與演算法:
歐幾里得演算法與歐幾里得擴充套件演算法
gmpy2庫的運用
- gmpy2是一個用於Python的高精度計算庫,支援大整數、有理數和浮點數的計算。你可以透過pip安裝gmpy2,然後使用其提供的函式進行加減乘除運算,還可以進行三角函式、對數函式等高階計算
參考:https://blog.csdn.net/m0_52842062/article/details/117852175
4、
萬事具備,編寫指令碼解密即可
需要注意的是gmpy2的擴充套件歐幾里得演算法返回的是一個元組,其中s1和s2分別是元組的第二和第三個元素,而元組的第一個元素是gcd(s1,s2),並不是我們需要的。
三、指令碼程式碼與答案
from Crypto.PublicKey import RSA
from Crypto.Util.number import inverse,long_to_bytes,bytes_to_long
from gmpy2 import invert,gcd,gcdext
with open("publickey1.pem","rb") as f:
pk1_bit= f.read()
with open("publickey2.pem","rb") as f:
pk2_bit =f.read();
pk1 = RSA.importKey(pk1_bit)
pk2 = RSA.importKey(pk2_bit)
n1 = pk1.n
e1 = pk1.e
n2 = pk2.n
e2 = pk2.e
# print(n1)
# print(n2)
with open("cipher1.txt","rb") as f:
c1= f.read()
with open("cipher2.txt","rb") as f:
c2= f.read()
c1= bytes_to_long(c1)
c2= bytes_to_long(c2)
s= gcdext(e1,e2)
# print(s)
m = (pow(c1,s[1],n1)*pow(c2,s[2],n2) ) % n1
m = long_to_bytes(m)
print(m)
答案:flag{interesting_rsa}