2012-05-13 47 views
25

tengo una clave pública RSA en formato + PKCS PEM # 1 (supongo):Cómo leer una clave pública RSA en PEM + PKCS # 1 formato

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

que desea obtener el SHA1 de su versión codificada ASN1 en Python. El primer paso debe ser para leer esta clave, pero no pudo hacerlo en PyCrypto:

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

la documentation of PyCrypto dice PEM + PKCS # 1 es compatible, así que estoy confundido. También probé M2Crypto, pero resulta que M2Crypto no es compatible con PKCS # 1 sino solo con X.509.

Respuesta

23

PyCrypto apoya PKCS # 1 en el sentido de que se puede leer en X.509 SubjectPublicKeyInfo objetos que contienen una clave pública RSA codificada en PKCS # 1.

En su lugar, los datos codificados en su clave son un objeto RSAPublicKey puro (es decir, una SECUENCIA DE ASN.1 con dos INTEGER, módulo y exponente público).

Aún así puedes leerlo. Pruebe algo como:

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])) 

partir de la versión 2.6, PyCrypto puede importar también RsaPublicKey objetos ASN.1. El código es entonces mucho más simple:

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

Se genera a través de PEM_write_bio_RSAPublicKey en OpenSSL. Creo que es una clave válida de PEM, y logré leerla usando python-rsa. –

+0

A partir de la versión 2.6, PyCrypto también puede importar objetos clave RsaPublic, por lo que el código anterior ya no es necesario. – SquareRootOfTwentyThree

+0

Usando Python 3, la decodificación ASN1 devuelve bytes, mientras que 'construct' necesita entradas. ¿Qué orden de bytes se usa? –

Cuestiones relacionadas