2015-04-05 21 views
1

我有一個加密文件,我嘗試將其解碼爲實驗的一部分。努力工作,不久之後,我已經能夠從公鑰中提取專用指數自模量小:使用私有指數和模數以64位塊解密RSA加密文件的Python代碼

OpenSSL的RSA -pubin -inform PEM -text -noout < public_key.pem 公鑰:( 64位) 模量:16513720463601767803(0xe52c8544a915157b) 指數:65537

現在,我有:

Factors: 3917781347 x 4215069449 
Private exponent: 9440767265896423601 

現在,以導出明文,我需要密文的每個64位塊提升到私人指數mod模數。我正在嘗試編寫一個Python腳本,它將以十六進制數據形式爲我執行此操作。

這是代碼我迄今爲止:

#!/usr/bin/python 

file = open('encrypted.hex', 'r') 
c = file.readline() 
d = 0x830457cf1ae460b1 
N = 0xe52c8544a915157b 

m = hex(pow(c, d, N)).rstrip("L") 

f = open('new.try', 'w') 
f.write(m) 
f.close() 

我已經使用xxd從密文文件中提取十六進制數據: XXD -p> encrypted.hex

這創造了一個十六進制轉儲的文件名爲'encrypted.hex'。該文件的內容如下所示:

7d4554292d7b9f980ed049cea0f968cf438b6fc312cf2028ce5ce2fe9f38 
387b72a01bf6564f25884a2cacd187c2eeccd0cf78c2a74785f18d5e72b5 
270ac3e45b6f7505347b38ec7684b1af206d73ea4a84cd59b50be56d7abf 
74a569868406ab2b17846c9e448fe1392b21dac0b10fbb733536c99e598b 
683be7400a1ad55c42faa171becd803b8b8f4a1fa512a33222ec042486c5 
672f6200d4f00e2994b6d247a44edb6ce90795bde7ccda4433cf6fca8362 
f87c68f9df6418c4f0b8fb9da39a1d173fea2b1466e646f01e2dc7fb0499 
311d35ec75c15c5910b2d3e0c662de0b3b1716bab44faa2a36538bb44f6a 
3c3abd37692cf95fa075b58485ad983533782d7bf51e10c0e3b18ccec972 

...等等。工具'xxd'創建了hexdump並插入了我認爲的換行符。所以,'c'是ciphertext,'d'是private exponent,'N'是modulus,'m'應該包含明文的十六進制字節。

然而,劇本給了我這個錯誤:

Traceback (most recent call last): 
    File "final.py", line 8, in <module> 
    m = hex(pow(c, d, N)).rstrip("L") 
    TypeError: unsupported operand type(s) for pow(): 'str', 'long', 'long' 

任何人都可以糾正我的Python腳本,以便它能夠根據需要破譯密文?

回答

3

假設c是一個十六進制字符串的16個字符的倍數,可以split it每16個字符(64位),然後轉化這個hex chunk into an int在其上運行您的教科書RSA。由於你的十六進制文件有換行符,你首先需要remove those line breaks。您可以使用file.read()而不是file.readline()來讀取整個文件。

最終代碼

n = 16 
c = c.replace('\n', '').replace('\r', '') 
m = [hex(pow(int(c[i:i+n], 16), d, N)).rstrip("L") for i in range(0, len(c), n)] 

f = open('new.try', 'w') 
f.write(''.join(m)) 
f.close() 
+0

強制性大限通知:教科書RSA是可怕的破碎並且必須使用諸如OAEP適當的填充方案。小於2048位的密鑰不推薦用於嚴重的事情。 – 2015-04-05 20:52:19

+0

包含密文的文件太大,並且包含換行符(\ n)。所以,readline只讀一行我認爲,因爲我只看到一行作爲明文輸出。如何讀取整個密文文件,刪除換行符(\ n)字符? – learnerX 2015-04-05 21:02:00

+0

完成!您在編輯中看到的這個hexdump已經使用工具'xxd -p'進行了處理。它在我認爲的地方插入了換行符。這個hexdump來自.enc(加密)文件,我需要以64位的塊解密。 – learnerX 2015-04-05 21:10:08