如何使用Python的加密模块加载RSA公钥

埃里亚斯·多内莱斯(Elias Dorneles)

我正在尝试使用加密模块加载公共密钥,这就是密钥的样子:

>>> print(pubkey)
-----BEGIN RSA PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+6gvHdCUCjnc4hSMwbdIIspk4
69pVAzjjb8tDJsCH/QpiK9vXe4nDZ7p9kiw2ACw0fkWaPnApKBwXNB9Nd9Sf+XFt
cIzdqKKBcAqZZCu2pA729amNRug9DoZdkstaBG+VfTxXhdzQRSTxxqJQWgdV8ejK
kt4D1M6pAiTkAyD0eQIDAQAB
-----END RSA PUBLIC KEY-----

我正在尝试使用以下load_pem_public_key()方法加载它

>>> from cryptography.hazmat.backends import default_backend
>>> from cryptography.hazmat.primitives.serialization import load_pem_public_key
>>> load_pem_public_key(pubkey, default_backend())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/elias/.virtualenvs/ckpypkg/local/lib/python2.7/site-packages/cryptography/hazmat/primitives/serialization.py", line 24, in load_pem_public_key
    return backend.load_pem_public_key(data)
  File "/home/elias/.virtualenvs/ckpypkg/local/lib/python2.7/site-packages/cryptography/hazmat/backends/multibackend.py", line 285, in load_pem_public_key
    return b.load_pem_public_key(data)
  File "/home/elias/.virtualenvs/ckpypkg/local/lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1376, in load_pem_public_key
    self._handle_key_loading_error()
  File "/home/elias/.virtualenvs/ckpypkg/local/lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1595, in _handle_key_loading_error
    raise ValueError("Could not unserialize key data.")
ValueError: Could not unserialize key data.

难道我做错了什么?这把钥匙有问题吗?为什么不能将其反序列化?

OpenSSL版本:

$ openssl version
OpenSSL 1.0.1f 6 Jan 2014

更新:我只是用不同的键(与另一个SO问题相同的键)测试了相同的代码,并且它起作用了,这更加令人困惑:为什么它适用于那个键而不是我的?

女神

长话短说,显然您的PEM具有PKCS#1格式的标头和页脚(-----BEGIN RSA PUBLIC KEY----------END RSA PUBLIC KEY-----),但包含PKCS#8格式的DER序列load_pem_public_key,因为它不能正确地反序列化pem,因为它期望使用PKCS#1 DER格式,但接收到PKCS#8格式。通过使用与PKCS#8格式相对应的页眉和页脚替换快速修复。

在您的PEM文件替换-----BEGIN RSA PUBLIC KEY----------BEGIN PUBLIC KEY-----,并-----END RSA PUBLIC KEY----------END PUBLIC KEY-----

您的公钥应类似于:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+6gvHdCUCjnc4hSMwbdIIspk4
69pVAzjjb8tDJsCH/QpiK9vXe4nDZ7p9kiw2ACw0fkWaPnApKBwXNB9Nd9Sf+XFt
cIzdqKKBcAqZZCu2pA729amNRug9DoZdkstaBG+VfTxXhdzQRSTxxqJQWgdV8ejK
kt4D1M6pAiTkAyD0eQIDAQAB
-----END PUBLIC KEY-----

否则,加密模块将无法解析它。


编辑

-----BEGIN RSA PUBLIC KEY-----适用于PKCS#1,-----BEGIN PUBLIC KEY-----适用于PKCS#8

您可以通过执行以下操作来检查DER格式:

from Crypto.Util.asn1 import DerSequence
public_key_der = DerSequence()
public_key_der.decode('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+6gvHdCUCjnc4hSMwbdIIspk469pVAzjjb8tDJsCH/QpiK9vXe4nDZ7p9kiw2ACw0fkWaPnApKBwXNB9Nd9Sf+XFtcIzdqKKBcAqZZCu2pA729amNRug9DoZdkstaBG+VfTxXhdzQRSTxxqJQWgdV8ejKkt4D1M6pAiTkAyD0eQIDAQAB'.decode('base64'));
for k,v in enumerate(public_key_der):
    print k, v

您会注意到您public_key_der[0]是另一个DER序列(您实际上可以再次对其进行解码:)public_key_der.decode(public_key_der[0]),并且代表PKCS#8 DER格式的AlgorithmIdentifier序列,如果它是PKCS#1,public_key_der[0]则应具有一个表示模数的INTEGER。

有关PKCS#8和PKCS#1格式的更多信息,请参见:https//tls.mbed.org/kb/cryptography/asn1-key-structures-in-der-and-pem

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章