【问题标题】:PyAsn1 error when reading a PEM string读取 PEM 字符串时出现 PyAsn1 错误
【发布时间】:2014-08-11 12:52:14
【问题描述】:

我正在尝试在 Python 中读取 PEM 编码的公钥。我尝试了多个键和多种可能的解决方案。我尝试过 base64 解码,其他格式等...

我真的不知道该怎么办了(因为我从昨天开始就遇到了这个问题)。

我得到的错误:

Traceback (most recent call last):
  File "I:/path/Main.py", line 6, in <module>
    -----END RSA PUBLIC KEY-----""", format='PEM')
  File "C:\Python34\lib\site-packages\rsa-3.1.4-py3.4.egg\rsa\key.py", line 65, in load_pkcs1
  File "C:\Python34\lib\site-packages\rsa-3.1.4-py3.4.egg\rsa\key.py", line 192, in _load_pkcs1_pem
  File "C:\Python34\lib\site-packages\rsa-3.1.4-py3.4.egg\rsa\key.py", line 160, in _load_pkcs1_der
  File "C:\Python34\lib\site-packages\pyasn1-0.1.7-py3.4.egg\pyasn1\codec\ber\decoder.py", line 792, in __call__
  File "C:\Python34\lib\site-packages\pyasn1-0.1.7-py3.4.egg\pyasn1\codec\ber\decoder.py", line 321, in valueDecoder
  File "C:\Python34\lib\site-packages\pyasn1-0.1.7-py3.4.egg\pyasn1\codec\ber\decoder.py", line 798, in __call__
pyasn1.error.PyAsn1Error: TagSet(Tag(tagClass=0, tagFormat=32, tagId=16)) not in asn1Spec: {TagSet(Tag(tagClass=0, tagFormat=0, tagId=2)): Integer()}/{}

我的代码:

pubkey = rsa.PublicKey.load_pkcs1(b"""-----BEGIN RSA PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANkHLKYS2dByWQ3gKjQDvQbuWb/2Y9z4
eYuLEfgXdiP5qc5cG/5c+c/GgIl6yQY7AYeZVXiBXLaGzxiLZ5Y4fi0CAwEAAQ==
-----END RSA PUBLIC KEY-----""", format='PEM')
crypto = rsa.encrypt("Secret", pubkey)

Screen RSA Documentations

【问题讨论】:

  • RSA-Link 对我不起作用 (403)。
  • 我只能说再试一次,链接在这里工作正常。

标签: python python-3.x rsa python-3.4 pem


【解决方案1】:

我不确定我做得对。但至少遵循加密没有错误。

import rsa
pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(b"""-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANkHLKYS2dByWQ3gKjQDvQbuWb/2Y9z4
eYuLEfgXdiP5qc5cG/5c+c/GgIl6yQY7AYeZVXiBXLaGzxiLZ5Y4fi0CAwEAAQ==
-----END PUBLIC KEY-----""")
crypto = rsa.encrypt(b"Secret", pubkey)

注意:我将 BEGIN RSA PUBLIC KEY 更改为 BEGIN PUBLIC KEY。 (END RSA PUBLIC KEY 相同)。我使用了load_pkcs1_openssl_pem

更新

传递 bytes 对象而不是 str(尤其是在 Python 3.x 中运行此对象时)。

【讨论】:

  • 嗯,现在已成功读取公钥(我认为),但我在 .encrypt() 部分收到另一个错误。 Screen
  • @Anton,我没有收到任何错误。当我打印repr(crypto) 时,我得到:'t\xc1]\xa8\x89\xac\xe9P\xd2(@\x96\xd8\xccL\xad[8\xc3\x17"\xc7\xe6\x7f~\xa8\x115K{\x0c\xe9u[o7\x80K.\xc6@\xb6w(\x9c\xac\xbb\xc5\xca\xec\nf\xfc\x9f\x00\xc3\xa09T\xcc\xf6Vy\x83'
  • @Anton,尝试将"Secret" 替换为其字节字符串版本:b"Secret"。我相应地更新了答案。
  • 谢谢,现在可以使用了。我之前需要问这个,浪费了这么多时间
  • @Anton,我添加了Python-3.x 标签,因为bytes 对象不仅与 Python-3.4 相关,而且与所有 Python-3.x 相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
相关资源
最近更新 更多