2

在尝试使用 base64 lib 解码 base32 字符串时,我需要一种方法来忽略“不正确的填充”异常。

我看过这篇文章Python: Ignore 'Incorrect padding' error when base64 解码解决了 base64 (b64decode) 解码的问题。我试着做同样的事情(添加接受的填充的最大数量,如果我不是 msitaken,base32 是 6)像这样

b32decode(str(decoding) + "======", True, None)

但无论如何都会引发异常。

预期的结果是即使没有正确的填充,也会对 base32 字符串进行解码:

decoding = JBSWY3DPEBZXIYLDNMQG65TFOJTGY33XEE== #this string should have 6 '=' as padding
print(b32decode(str(decoding) + "======", True, None))
>> Hello stack overflow! 
4

3 回答 3

3

据我测试过。这行代码将使它工作。

pad_length = math.ceil(len(b32_string) / 8) * 8 - len(b32_string)
bytes_data = base64.b32decode(b32_string.encode('ascii') + b'=' * pad_length)
于 2020-05-21T12:28:43.957 回答
1

已经有一个解决方案,但没有解释为什么它有效。

一个 base32 字符包含 5 位数据。编码器的输入以字节(8 位)的形式出现。这会造成一些尴尬。就像编码一个字节时,你得到 5+3 位,两个字节,你得到 5+5+5+1 位,依此类推。

唯一不尴尬的是当有 40 位时,因为它完全适合 5 个字节的输入和 8 个 base32 字符的输出。

因此,RFC4648标准规定,当事情不对齐时,会添加填充字符('=')直到它对齐。

因此,如果未填充的字符串可以被 8 整除,则无需采取任何措施。否则,必须添加填充字符,以便它与 40 位也就是 8 个 base32 字符块对齐。

这给出了:

last_block_width = len(unpadded_str) % 8
if last_block_width != 0:
  unpadded_str += (8 - last_block_width) * '='
于 2021-10-07T15:13:20.993 回答
0

您不应该附加整个 6 个 '=' 字符,您需要填充后缀以获得 6 个相等字符:

> base64.b32decode("JBSWY3DPEBZXIYLDNMQG65TFOJTGY33XEE======")
'Hello stack overflow!'

要正确填充消息,您应该遵循https://www.rfc-editor.org/rfc/rfc4648#section-6

于 2018-12-23T20:40:06.930 回答