Python pem文件base64内容最后是如何填充的?
我必须将RSA私钥读入python,并为私钥pem获取一个异常“不正确的填充”,这应该是有效的Python pem文件base64内容最后是如何填充的?,python,base64,rsa,padding,pem,Python,Base64,Rsa,Padding,Pem,我必须将RSA私钥读入python,并为私钥pem获取一个异常“不正确的填充”,这应该是有效的 rsa_p_file = open(rsa_p_filename, "r") content = rsa_p_file.read() rsa_p = RSA.importKey(content) 现在,为了找到问题,我用另一个pem文件进行了实验,该文件可以工作。此pem文件以 8YPmbfUbUcCj6CQfIcSZcg== -----END PRIVATE KEY----- 据我所知,末尾的=
rsa_p_file = open(rsa_p_filename, "r")
content = rsa_p_file.read()
rsa_p = RSA.importKey(content)
现在,为了找到问题,我用另一个pem文件进行了实验,该文件可以工作。此pem文件以
8YPmbfUbUcCj6CQfIcSZcg==
-----END PRIVATE KEY-----
据我所知,末尾的=填充字节,使base64的总长度为4的倍数。在本例中,总长度为1624,因此可以
但是,当我删除最后一个“g”并将其替换为“=”时
它给出了以下解释:
Error: Incorrect padding
Traceback:
Traceback (most recent call last):
File "app.py", line 204, in t1_process
meters = extract.parseShipmentFile(ifile, pkpath, serials)
File "D:\Siemens\Projects\DLMS_becom\code\python\shipment\extract.py", line 146, in parseShipmentFile
rsa_p = RSA.importKey(content)
File "C:\Users\atw11a92\AppData\Local\Programs\Python\Python36\lib\site-packages\Crypto\PublicKey\RSA.py", line 736, in import_key
(der, marker, enc_flag) = PEM.decode(tostr(extern_key), passphrase)
File "C:\Users\atw11a92\AppData\Local\Programs\Python\Python36\lib\site-packages\Crypto\IO\PEM.py", line 168, in decode
data = a2b_base64(b(''.join(lines[1:-1])))
binascii.Error: Incorrect padding
为什么填充仍然不正确,因为总长度%4再次为0?您很幸运,可以访问git上a2b_base64的源代码: 您可以看到错误“不正确的填充”从2个点上升:
s = _bytes_from_decode_data(s)
if len(s) % 8:
raise binascii.Error('Incorrect padding')
这里它检查字符串的大小是否是8的倍数,而不是4的倍数
您还可以对填充字符进行其他检查:
l = len(s)
s = s.rstrip(b'=')
padchars = l - len(s)
(...)
if padchars:
acc <<= 5 * padchars
last = acc.to_bytes(5, 'big')
if padchars == 1:
decoded[-5:] = last[:-1]
elif padchars == 3:
decoded[-5:] = last[:-2]
elif padchars == 4:
decoded[-5:] = last[:-3]
elif padchars == 6:
decoded[-5:] = last[:-4]
else:
raise binascii.Error('Incorrect padding')
return bytes(decoded)
l=len(s)
s=s.rstrip(b'='))
padchars=l-len(s)
(...)
如果padchars:
acc Base64填充为一个或两个“=”字符,而不是三个。请参阅James评论中的链接。
l = len(s)
s = s.rstrip(b'=')
padchars = l - len(s)
(...)
if padchars:
acc <<= 5 * padchars
last = acc.to_bytes(5, 'big')
if padchars == 1:
decoded[-5:] = last[:-1]
elif padchars == 3:
decoded[-5:] = last[:-2]
elif padchars == 4:
decoded[-5:] = last[:-3]
elif padchars == 6:
decoded[-5:] = last[:-4]
else:
raise binascii.Error('Incorrect padding')
return bytes(decoded)