Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pem文件base64内容最后是如何填充的?_Python_Base64_Rsa_Padding_Pem - Fatal编程技术网

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

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私钥读入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-----
据我所知,末尾的=填充字节,使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)