Вопрос по x509, key-management, pycrypto, python, cryptography – Как прочитать открытый ключ RSA в формате PEM + PKCS # 1

27

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

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

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

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

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

Ваш Ответ

1   ответ
24

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

Вместо этого данные, закодированные в вашем ключе, являются чистымиRSAPublicKey объект (то есть ПОСЛЕДОВАТЕЛЬНОСТЬ ASN.1 с двумя 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)
Он генерируется через PEM_write_bio_RSAPublicKey в OpenSSL. Я считаю, что это действительный ключ PEM, и мне удалось прочитать его с помощью python-rsa. Mr.Teen
@SquareRootOfTwentyThree: что вы имеете в виду, когда говорите «RsaPublic»? Я не вижу, как этот код можно сократить. Пожалуйста, обновите ответ.
Используя Python 3, декодер ASN1 возвращает байты, аconstruct нужны целые Какой порядок байтов используется?
@ janus-troelsen RsaPublicKey - это простой объект ASN.1 с модулем и открытым показателем (см. A.1.1 в RFC3447). С PyCrypto 2.6 вы можете просто использоватьRSA.importKey.
Начиная с версии 2.6, PyCrypto может также импортировать объекты ключа RsaPublic, поэтому приведенный выше код больше не нужен.

Похожие вопросы