pem文件base64内容最后是如何填充的?

时间:2018-05-03 10:26:19

标签: python base64 rsa padding pem

我必须在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?

1 个答案:

答案 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)

但另一部分需要进行一些调查才能更好地了解其行为。

我希望这有帮助!