如何读取PEM + PKCS#1格式的RSA公钥(How to read a RSA public

2019-06-24 09:20发布

我在PEM格式+ PKCS#1(我猜),一个RSA公钥:

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

我想要得到的Python中的ASN1编码版本的SHA1摘要。 第一步应该是阅读的关键,但我没能做到这一点在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。

Answer 1:

PyCrypto支持PKCS#1在这个意义上,它可以在X.509阅读SubjectPublicKeyInfo 包含PKCS#1编码的RSA公钥对象。

相反,在你的钥匙编码的数据是一个纯粹的RSAPublicKey对象(即,一个ASN.1 SEQUENCE有两个整数,模数和公开指数)。

你仍然可以读取它虽然。 尝试是这样的:

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)


文章来源: How to read a RSA public key in PEM + PKCS#1 format