【问题标题】:How to read a RSA public key in PEM + PKCS#1 format如何读取 PEM + PKCS#1 格式的 RSA 公钥
【发布时间】:2012-05-21 02:27:52
【问题描述】:

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

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

documentation of PyCrypto 表示支持 PEM + PKCS#1,所以我很困惑。 我也试过 M2Crypto,但事实证明 M2Crypto 不支持 PKCS#1,只支持 X.509。

【问题讨论】:

    标签: python cryptography x509 pycrypto key-management


    【解决方案1】:

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

    相反,在您的密钥中编码的数据是一个纯 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)
    

    【讨论】:

    • 它是通过 OpenSSL 中的 PEM_write_bio_RSAPublicKey 生成的。我相信这是一个有效的 PEM 密钥,我设法使用 python-rsa 读取了它。
    • 从 2.6 版开始,PyCrypto 还可以导入 RsaPublic 密钥对象,因此不再需要上面的代码。
    • 使用 Python 3,ASN1 解码返回字节,而 construct 需要整数。使用哪种字节顺序?
    • @SquareRootOfTwentyThree:你说“RsaPublic”是什么意思?我看不出如何缩短此代码。请更新答案。
    • @janus-troelsen RsaPublicKey 是具有模数和公共指数的简单 ASN.1 对象(参见 RFC3447 中的 A.1.1)。使用 PyCrypto 2.6,您可以简单地使用 RSA.importKey
    猜你喜欢
    • 2017-10-14
    • 2018-08-04
    • 2021-06-22
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多