web-dev-qa-db-fra.com

Comment lire une clé publique RSA au format PEM + PKCS # 1

J'ai une clé publique RSA au format PEM + PKCS # 1 (je suppose):

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

Je veux obtenir le résumé SHA1 de sa version encodée ASN1 en Python. La première étape devrait être de lire cette clé, mais je n'ai pas réussi à le faire dans PyCrypto:

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

Le documentation de PyCrypto indique que PEM + PKCS # 1 est pris en charge, donc je suis confus. J'ai également essayé M2Crypto, mais il s'avère que M2Crypto ne prend pas en charge PKCS # 1 mais uniquement X.509.

28
Mr.Teen

PyCrypto prend en charge PKCS # 1 dans le sens où il peut lire en X.509 SubjectPublicKeyInfo objets qui contiennent une clé publique RSA codée en PKCS # 1.

Au lieu de cela, les données encodées dans votre clé sont un pur objet RSAPublicKey (c'est-à-dire une SÉQUENCE ASN.1 avec deux entiers, module et exposant public).

Vous pouvez toujours le lire. Essayez quelque chose comme:

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 version 2.6, PyCrypto peut également importer RsaPublicKey objets ASN.1. Le code est alors beaucoup plus 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)