2016-08-23 4 views
0

Ich arbeite mit pyCrpyto RSA Klasse:PyCrypto RSA und Pickle

from Crypto.Cipher import PKCS1_v1_5 
from Crypto.PublicKey import RSA 

message = 'To be encrypted' 
key = RSA.generate(2048) 
cipher = PKCS1_v1_5.new(key) 
ciphertext = cipher.encrypt(message) 

Dieser Code läuft gut, und ich bin in der Lage, den verschlüsselten Text zu entschlüsseln. Allerdings muss ich in der Lage sein, diese Ziffern zu serialisieren. Ich habe kein Problem pickle -ing andere PyCrypto Chiffren hatte, wie AES, aber wenn ich zu pickle eine RSA-Chiffre versuche ich laufe in die folgenden Fehler:

from Crypto.Cipher import PKCS1_v1_5 
from Crypto.PublicKey import RSA 
import pickle 

message = 'To be encrypted' 
key = RSA.generate(2048) 
cipher = PKCS1_v1_5.new(key) 

pickle.dump(cipher, open("cipher.temp", "wb")) 
cipher = pickle.load(open("cipher.temp", "rb")) 
ciphertext = cipher.encrypt(message) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Crypto/Cipher/PKCS1_v1_5.py", line 119, in encrypt 
randFunc = self._key._randfunc 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Crypto/PublicKey/RSA.py", line 126, in __getattr__ 
    raise AttributeError("%s object has no %r attribute" % (self.__class__.__name__, attrname,)) 
    AttributeError: _RSAobj object has no '_randfunc' attribute 

Gibt es etwas, was ich tun kann, dies zu umgehen - ein anderes Serialisierungsframework, eine andere Konstruktionsmethode für das RSA-Objekt, oder ist dies nur ein Objekt?

+0

Sie haben würden die Schlüssel serialisiert, die hinter einem solchen Objekt sind. PyCrypto stellt Ihnen Funktionen zur Verfügung, mit denen Sie die Schlüssel exportieren und importieren können. Hast du das probiert? –

+0

@ArtjomB. Ich werde es versuchen, aber ich hatte gehofft, die Chiffre in einer einzigen Datei zu serialisieren. Sie schlagen vor, ich nur den Schlüssel serialisieren (mit PyCrypto exportieren, nicht Pickle) und dann die Chiffre rekonstruieren, indem Sie es importieren? – bkaiser

Antwort

0

Das Beizen funktioniert gut für die öffentliche Schlüsselkomponente, aber wenn es um den gesamten Schlüssel geht, übersteht die _randfunc das Beizen nicht. Ich war bei der Arbeit an einem Projekt auf denselben Fehler gestoßen. Sie können mehr Informationen hier fein: https://github.com/google/oauth2client/issues/638

Nutzen Sie PyCrypto der importkey und exportkey Funktionen, deren Dokumentation finden Sie hier: https://www.dlitz.net/software/pycrypto/api/2.6/