如何读取PEM + PKCS#1格式的RSA公钥

Mr.*_*een 28 python cryptography key-management x509 pycrypto

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

-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+zn
JDEbNHODZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE=
-----END RSA PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

我想在Python中获取其ASN1编码版本的SHA1摘要.第一步应该是读取此键,但我没有在PyCrypto中执行此操作:

>> from Crypto.PublicKey import RSA
>> RSA.importKey(my_key)
ValueError: RSA key format is not supported
Run Code Online (Sandbox Code Playgroud)

PyCrypto文档说支持PEM + PKCS#1,所以我很困惑.我也试过M2Crypto,但事实证明M2Crypto不支持PKCS#1但只支持X.509.

Squ*_*ree 24

PyCrypto支持PKCS#1,因为它可以读取包含PKCS#1中编码的RSA公钥的X.509 SubjectPublicKeyInfo对象.

相反,密钥中编码的数据是纯RSAPublicKey对象(即具有两个INTEGER,模数和公共指数的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]) )
Run Code Online (Sandbox Code Playgroud)

从2.6版开始,PyCrypto也可以导入RsaPublicKeyASN.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)
Run Code Online (Sandbox Code Playgroud)

  • 它是通过OpenSSL中的PEM_write_bio_RSAPublicKey生成的.我相信它是一个有效的PEM密钥,我设法使用python-rsa读取它. (3认同)