Python base32数据解码

时间:2015-06-10 09:57:39

标签: python base64

我无法理解为什么

import base64
base64.b32decode('siddh===', casefold=True);

有效但

base64.b32decode('siddha==', casefold=True);

引发

TypeError: Incorrect padding

2 个答案:

答案 0 :(得分:2)

python base64模块跟在RFC 3548之后。对于base32编码,

  

结束时的填充      使用“=”字符执行数据。由于所有基地32      输入是八位字节的整数,只有以下情况才可以      出现:

     

(1)编码输入的最终量子是40的整数倍      位;这里,编码输出的最后一个单元将是一个整数      多个8个字符,没有“=”填充,

     

(2)编码输入的最终量子正好是8位;在这里,      编码输出的最终单位是两个字符,后跟六个字符      “=”填充字符,

     

(3)编码输入的最终量子正好是16位;在这里,      编码输出的最终单位是四个字符,后跟四个字符      “=”填充字符,

     

(4)编码输入的最终量子正好是24位;在这里,      编码输出的最终单位将是五个字符,然后是      三个“=”填充字符,或

     

(5)编码输入的最终量子正好是32位;在这里,      编码输出的最终单位将是七个字符,后跟一个      “=”填充字符。

您可以看到RFC 3548 base32编码没有有效的情况会导致六个字符和两个填充字符。

五个字符总共提供25位,因此用一个额外位编码三个字节就足够了。六个字符总共会给你30位,对于四个字节来说仍然不够。使用七个字符可获得35位,这足以容纳四个字节。由于六个字符对于编码整数个字节不超过五个字符,因此它将从标准中排除在包含填充的八个字符的最终填充40位输入组的标准之外。

答案 1 :(得分:0)

另请注意,Base32的字符集为每RFC 4648个大写字母A-Z2-7=(比RFC 3548更新)。还有一个名为Base32-hex的变体,它使用'0-9A-V =',因此没有Base32解码器应该接受小写字母。