Python ValueError:不是有效的PEM预边界

Python ValueError:不是有效的PEM预边界,python,python-3.x,pycrypto,pem,Python,Python 3.x,Pycrypto,Pem,这段代码 key=RSA.importKey(open("receiver.pem","rb").read()) <pre> response = get(url).content return response.replace('\r', '') 返回此错误 ValueError: Not a valid PEM pre boundary 及 返回 ValueError: Not a valid PEM post boundary 当我们使用Pycrypto和Python2

这段代码

key=RSA.importKey(open("receiver.pem","rb").read())
<pre>
response = get(url).content
return response.replace('\r', '')
返回此错误

ValueError: Not a valid PEM pre boundary

返回

ValueError: Not a valid PEM post boundary
当我们使用Pycrypto和Python2.7时,代码运行得很好,现在我已经转到Pycryptodome和Python3.4.3(使用2to3)。但是现在这个代码不起作用了。我甚至不能尝试任何东西,因为我甚至不明白它的意思

要生成.PEM文件,使用了此代码

random_generator = Random.new().read
rsakey = RSA.generate(1024, random_generator)
f=open(email+'.pem','wb')
f.write(rsakey.exportKey("PEM"))
f.write(rsakey.publickey().exportKey("PEM"))
f.close()
这就是.PEM文件的内容

-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCIQhU/+nPVFgw+T0Tf7NEpHYB12I/qywo5xBdp5kaLxEHD9zOx
2FTOX2OMPiL7fv/PW/AXuSrvD3pZAFzGmkigWdQP6TES5ZM65LUzeUUy8noHkZ00
D4mz+4a4YtBGaFyNL2CCxOAczi9rx5UB6qbY6+5kkBNd7k75XDp28g2bjwIDAQAB
AoGAaFRQ+P/HmSyci0ker2YgcJ7KMXF0II7+cWSXmNpcwb+vq2CoEFBX/vxCuKsL
Fg4TyK3YlBGPsiPjxink35xaZm7eI5sqbmD8Bnw4JZsQ1FN/Si6pbNLZkmOxyZgl
CoQvuvLavKH5GSWQ5wqvLD6OHBGd7w0YyGVOQHNQvOKhLgECQQC6EgYqOOz8ddQ2
qaLHxJl1LwpwvA4nWUWqeP69yl4QrhOmfTyLxLmw8HJFuz8XYiAxKq9fxnrU0j8H
W+QKwxRBAkEAu3eVGHZF5AA+K/Co+y2MTh1uzaSqbPZY/D4+zs1eLxoVM/e0MLYI
SqPciDTHl3HjZqivpJ5SbU3DcfvGSlV7zwJAJUxRogsRLjYsWNy+PY8iN8Q7Mofv
ymFxvo9MeRzkqDFMzRXTmizQEDDSpzm2luhbjZ+B0hAGNT0D12TLHIEoQQI/N6dI
m/qAxS9NRb4sbGUZQhd6zZIVBkQcJsZT3xEY5OLZaJQg6lUgIQiEb+s7Vbp5yABM
JJLb5ZcwbqZQN8EpAkEAt716AEn2qyxONCfLan1tuZVF+3V0KVphdhu6gdXpyHBv
9hLm2Ezb5VXMoU+IoeYGQ3SaSr6Gb1ein/sXGyaZuQ==
-----END RSA PRIVATE KEY----------BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIQhU/+nPVFgw+T0Tf7NEpHYB1
2I/qywo5xBdp5kaLxEHD9zOx2FTOX2OMPiL7fv/PW/AXuSrvD3pZAFzGmkigWdQP
6TES5ZM65LUzeUUy8noHkZ00D4mz+4a4YtBGaFyNL2CCxOAczi9rx5UB6qbY6+5k
kBNd7k75XDp28g2bjwIDAQAB
-----END PUBLIC KEY-----

由于以下原因,您将出现该错误:

不幸的是,在非多行正则表达式中,
$
表示“字符串结束”。这意味着PyCryptoDome需要字符串末尾的
END
边界,并且没有解决此问题的方法

您有三种选择:

  • 拆分两个键并分别导入它们
  • 固定穹顶
  • 切换回PyCrypto
如前所述,问题是行尾格式

我正在CentOS中使用Python2.7进行一个项目,我从一个网站上获得了一个公钥,这给了我上述错误

问题是它带有\r\n行尾序列,这使得对PyScript库的python jose库jwt.decode调用失败

我的修复方法是在以这种方式返回响应之前删除“\r”字符:


response=get(url).content
返回响应。替换('\r','')


这使得这件事最终成功了。希望这有帮助

你用的是什么模块?文档对方法
importKey
怎么说?文件以二进制模式打开是否重要?PEM的第一行是否有匹配
“\s*----BEGIN(.*)----\n”
?看见如果您以二进制模式打开windows文件,它可能有
\r\n
,因此不匹配。@tmoreau模块如中所示?我用过密穹顶。我不知道你说的“模块”到底是什么意思?“对不起,我是个傻瓜!”彼得伍德回答说,它返回了一个不同的答案。我已经更新了我的问题。“rb”是打开文件的预期模式。
def decode(pem_data, passphrase=None):
    ...

    # Verify Pre-Encapsulation Boundary
    r = re.compile("\s*-----BEGIN (.*)-----\n")
    m = r.match(pem_data)
    if not m:
        raise ValueError("Not a valid PEM pre boundary")
    marker = m.group(1)

    # Verify Post-Encapsulation Boundary
    r = re.compile("-----END (.*)-----\s*$")
    m = r.search(pem_data)
    if not m or m.group(1) != marker:
        raise ValueError("Not a valid PEM post boundary")
<pre>
response = get(url).content
return response.replace('\r', '')