2012-05-13 13 views
25

Ich habe einen öffentlichen RSA-Schlüssel im PEM-Format + PKCS # 1 (ich glaube) zu lesen:Wie ein öffentlichen RSA-Schlüssel in PEM + PKCS # 1-Format

-----BEGIN RSA PUBLIC KEY----- 
MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k 
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+zn 
JDEbNHODZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE= 
-----END RSA PUBLIC KEY----- 

ich den SHA1-Digest erhalten möge von seine ASN1-codierte Version in Python. Der erste Schritt sollte sein, diese Schlüssel zu lesen, aber ich scheiterte es in PyCrypto zu tun:

>> from Crypto.PublicKey import RSA 
>> RSA.importKey(my_key) 
ValueError: RSA key format is not supported 

Die documentation of PyCrypto sagt PEM + PKCS # 1 unterstützt wird, also bin ich verwirrt. Ich habe auch M2Crypto ausprobiert, aber es stellt sich heraus, dass M2Crypto nicht PKCS # 1, sondern nur X.509 unterstützt.

Antwort

23

PyCrypto unterstützt PKCS # 1 in dem Sinne, dass es SubjectPublicKeyInfo Objekte in X.509 lesen kann, die einen öffentlichen RSA-Schlüssel in PKCS # 1 codiert enthalten .

Stattdessen sind die in Ihrem Schlüssel codierten Daten ein reines RSAPublicKey-Objekt (dh eine ASN.1-SEQUENZ mit zwei INTEGERN, Modul und öffentlichem Exponenten).

Sie können es immer noch in lesen. Versuchen Sie so etwas wie:

from Crypto.PublicKey import RSA 
from Crypto.Util import asn1 
from base64 import b64decode 

key64 = 'MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k\ 
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+znJDEbNHOD\ 
ZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE=' 

keyDER = b64decode(key64) 
seq = asn1.DerSequence() 
seq.decode(keyDER) 
keyPub = RSA.construct((seq[0], seq[1])) 

Ab Version 2.6 kann PyCrypto importieren auch RsaPublicKey ASN.1-Objekte. Der Code ist dann viel einfacher:

from Crypto.PublicKey import RSA 
from base64 import b64decode 

key64 = b'MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k\ 
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+znJDEbNHOD\ 
ZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE=' 

keyDER = b64decode(key64) 
keyPub = RSA.importKey(keyDER) 
+3

Es wird über PEM_write_bio_RSAPublicKey in OpenSSL erzeugt. Ich glaube, es ist ein gültiger PEM-Schlüssel, und ich habe es mit Python-rsa gelesen. –

+0

Ab Version 2.6 kann PyCrypto auch RsaPublic-Schlüsselobjekte importieren, so dass der obige Code nicht mehr benötigt wird. – SquareRootOfTwentyThree

+0

Mit Python 3 gibt die ASN1-Dekodierung Bytes zurück, während 'Konstrukt' Ints benötigt. Welche Byte-Reihenfolge wird verwendet? –