2015-12-06 25 views
1

我試圖使用AES加密對文件中的數據進行加密,然後使用RSA加密AES密鑰。但是當我嘗試從文件中讀取密鑰時,它會遇到錯誤「RSA binascii.Error:不正確的填充」。Python:PyCrypto RSA binascii.Error:從文件中讀取密鑰時填充不正確

Traceback (most recent call last): 
    File "C:/Users/dbane_000/PycharmProjects/RSE/RSA.py", line 33, in <module> 
    key=RSA.importKey(f.read()) 
    File "C:\Python27\lib\site-packages\Crypto\PublicKey\RSA.py", line 660, in importKey 
    der = binascii.a2b_base64(b('').join(lines[1:-1])) 
binascii.Error: Incorrect padding 

錯誤並不總是出現,但可能每五次運行一次該代碼。可能是什麼原因?

from Crypto.Cipher import AES 
from Crypto.PublicKey import RSA 
from Crypto.Cipher import PKCS1_OAEP 
from Crypto import Random 
import rsa 
import base64 
import os 

BLOCK_SIZE = 32 
PADDING = '{' 

pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 

EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) 
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) 

random_generator = Random.new().read 
rsakey = RSA.generate(1024, random_generator) 
f=open('key.pem','w') 
cipher = PKCS1_OAEP.new(rsakey.publickey()) 
f.write(rsakey.exportKey("PEM")) 
f.write(rsakey.publickey().exportKey("PEM")) 
f.close() 
f=open('key.pem','r') 
key=RSA.importKey(f.read()) 
pubkey=key.publickey() 
f.close() 
secret = os.urandom(BLOCK_SIZE) 
print secret 
crypto =pubkey.encrypt(secret, 32) 
secret =key.decrypt(crypto) 

print crypto 
print secret 

cipher = AES.new(secret) 


# encode a string 
f=open('plaintext.txt','r') 
plaintext=f.read() 
f.close() 
encoded = EncodeAES(cipher, plaintext) 
print 'Encrypted string:', encoded 
f=open('cipher_data.txt','w') 
f.write(encoded) 
f.close() 

# decode the encoded string 
decoded = DecodeAES(cipher, encoded) 
print 'Decrypted string:', decoded 
f=open('plaintext.txt','r') 
plaintext=f.read() 
f.close() 
f=open('decrypted.txt','w') 
f.write(decoded) 
f.close() 
+1

你不是以二進制模式打開你的文件... –

+0

@MaartenBodewes以二進制模式打開文件這應該是代碼正確嗎? f =開放('key.pem','rb')。我嘗試過但仍然沒有區別。 – daipayan

+0

嗯。通常公鑰部分包含在私鑰中。你是否嘗試不明確導出公鑰?對於PEM文本模式可能是可以的,但肯定不適用於密文。 –

回答

0

請嘗試檢查輸入的文件從那裏你正在服用的關鍵或數據進行加密或解密的內容。如果來自f.read()的數據處於期望的格式以執行解密,則可能會發生此類錯誤。並且請嘗試在開頭或期望的索引處寫入這些密鑰或數據並從該索引中讀取。

# please check at this statements 
f=open('key.pem','w') 
cipher = PKCS1_OAEP.new(rsakey.publickey()) 
f.write(rsakey.exportKey("PEM")) 
f.write(rsakey.publickey().exportKey("PEM")) 
f.close() 
f=open('key.pem','r') 
key=RSA.importKey(f.read()) 
pubkey=key.publickey() 
f.close() 

I hope this may help you.. 
相關問題