Подтвердить что ты не робот

Как читать открытый ключ RSA в формате PEM + PKCS # 1

У меня есть открытый ключ RSA в формате PEM + PKCS # 1 (я думаю):

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

Я хочу получить дайджест SHA1 его кодированной версии ASN1 в Python. Первым шагом должно быть чтение этого ключа, но я не смог сделать это в PyCrypto:

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

Документация PyCrypto говорит, что поддерживается PEM + PKCS # 1, поэтому я запутался. Я также пробовал M2Crypto, но, оказывается, M2Crypto не поддерживает PKCS # 1, а только X.509.

4b9b3361

Ответ 1

PyCrypto поддерживает PKCS # 1 в том смысле, что он может читать объекты X.509 SubjectPublicKeyInfo, содержащие открытый ключ RSA, закодированный в PKCS # 1.

Вместо этого данные, закодированные в вашем ключе, являются чистым RSAPublicKey объектом (т.е. ASN.1 SEQUENCE с двумя INTEGER, модулем и общедоступным показателем).

Вы все равно можете прочитать это. Попробуйте что-то вроде:

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

Начиная с версии 2.6, PyCrypto может также импортировать объекты RSAPublicKey ASN.1. Тогда код намного проще:

from Crypto.PublicKey import RSA
from base64 import b64decode

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

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