2012-10-16 7 views
16

Ich möchte einige Daten in Python mit PyCrypto verschlüsseln.Wie verwende ich ein X509-Zertifikat mit PyCrypto?

Allerdings erhalte ich einen Fehler, wenn key = RSA.importKey(pubkey) mit:

RSA key format is not supported 

Der Schlüssel wurde erzeugt mit:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mycert.key -out mycert.pem 

Der Code ist:

def encrypt(data): 
    pubkey = open('mycert.pem').read() 
    key = RSA.importKey(pubkey) 
    cipher = PKCS1_OAEP.new(key) 
    return cipher.encrypt(data) 
+0

erste Reaktion in einer google-Suche: http://stackoverflow.com/questions/10569189/how-to-read-a-rsa-public-key-in-pem-pkcs1-format-in-python – tMC

+0

@ tMC funktioniert nicht mit mir, ich benutze certificat e, keine öffentliche Schlüsseldatei. – eshizhan

Antwort

31

PyCrypto nicht unterstützt X. 509 Zertifikate. Sie müssen zunächst den öffentlichen Schlüssel mit dem Befehl extrahieren:

openssl x509 -inform pem -in mycert.pem -pubkey -noout > publickey.pem 

Dann Sie RSA.importKey auf publickey.pem verwenden können.


Wenn Sie nicht wollen oder können nicht openssl verwenden, können Sie die PEM-X.509-Zertifikat nehmen und tun es in reinen Python wie folgt aus:

from Crypto.Util.asn1 import DerSequence 
from Crypto.PublicKey import RSA 
from binascii import a2b_base64 

# Convert from PEM to DER 
pem = open("mycert.pem").read() 
lines = pem.replace(" ",'').split() 
der = a2b_base64(''.join(lines[1:-1])) 

# Extract subjectPublicKeyInfo field from X.509 certificate (see RFC3280) 
cert = DerSequence() 
cert.decode(der) 
tbsCertificate = DerSequence() 
tbsCertificate.decode(cert[0]) 
subjectPublicKeyInfo = tbsCertificate[6] 

# Initialize RSA key 
rsa_key = RSA.importKey(subjectPublicKeyInfo) 
+9

Als Hinweis, PEM-> DER-Konvertierung könnte einfacher mit dem eingebauten ['ssl.PEM_cert_to_DER_cert()'] (http://docs.python.org/2/library/ssl.html#ssl.PEM_cert_to_DER_cert) getan werden. –

+0

Können Sie nach diesem Schritt erklären, wie eine Zeichenkette verschlüsselt wird? –

+0

ist es immer noch in 2016? –

1

Hier ist ein gutes Beispiel: https://www.dlitz.net/software/pycrypto/api/2.6/Crypto.Cipher.PKCS1_OAEP-module.html

from Crypto.Cipher import PKCS1_OAEP 
from Crypto.PublicKey import RSA 

# sender side 
message = 'To be encrypted' 
key = RSA.importKey(open('pubkey.der').read()) 
cipher = PKCS1_OAEP.new(key) 
ciphertext = cipher.encrypt(message) 

# receiver side 
key = RSA.importKey(open('privkey.der').read()) 
cipher = PKCS1_OAP.new(key) 
message = cipher.decrypt(ciphertext)