我必须在RSA私钥中读入python,并获得一个异常的“不正确的填充”,这个私钥应该是有效的。
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”并将其替换为“=”
时8YPmbfUbUcCj6CQfIcSZc===
-----END PRIVATE KEY-----
它让人感到兴奋:
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?
答案 0 :(得分:0)
你很幸运,你可以在git上访问a2b_base64的来源: https://github.com/python/cpython/blob/master/Lib/base64.py
你可以看到错误"不正确的填充"是从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)
但另一部分需要进行一些调查才能更好地了解其行为。
我希望这有帮助!