攻防世界-best_rsa

wyuu101發表於2024-12-01

一、題目


給出兩個公鑰和兩個密文

二、解題

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}

相關文章