这是 passlib base64 编码中的错误吗?
Is this a bug in the passlib base64 encoding?
我正在尝试使用 passlib
s base64 编码对字节串进行解码和重新编码:
from passlib.utils import binary
engine = binary.Base64Engine(binary.HASH64_CHARS)
s2 = engine.encode_bytes(engine.decode_bytes(b"1111111111111111111111w"))
print(s2)
这会打印出 b'1111111111111111111111A'
,这当然不是我所期望的。最后一个字符不同。
我的错误在哪里?这是一个错误吗?
不,这不是错误。
在 Base64 的所有变体中,每个编码字符仅代表 6 位,并且根据编码的字节数,您可以在末尾得到 0、2 或 4 个无关紧要的位。
在这种情况下,编码字符串 1111111111111111111111w
的长度为 23 个字符,这意味着 23*6 = 138 位可以解码为 17 个字节(136 位)+ 2 个无意义的位。
你这里使用的编码不是Base64而是Hash64
Base64 character map used by a number of hash formats; the ordering is wildly different from the standard base64 character map.
人物图中
HASH64_CHARS = u("./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
我们在索引 12 (001100
) 上找到 A
,在索引 60 (111100
)
上找到 w
这里的'trick'就是那个
binary.Base64Engine(binary.HASH64_CHARS)
有一个默认参数big=False
,表示默认以little endian格式进行编码。
在您的示例中,这意味着 w
是 001111
,A
是 001100
。在解码过程中,最后两位被截断,因为如上所述不需要它们。再次编码时,A
作为字符映射中的第一个字符,可以使用两次编码0011
加上两个无关紧要的位。
我正在尝试使用 passlib
s base64 编码对字节串进行解码和重新编码:
from passlib.utils import binary
engine = binary.Base64Engine(binary.HASH64_CHARS)
s2 = engine.encode_bytes(engine.decode_bytes(b"1111111111111111111111w"))
print(s2)
这会打印出 b'1111111111111111111111A'
,这当然不是我所期望的。最后一个字符不同。
我的错误在哪里?这是一个错误吗?
不,这不是错误。
在 Base64 的所有变体中,每个编码字符仅代表 6 位,并且根据编码的字节数,您可以在末尾得到 0、2 或 4 个无关紧要的位。
在这种情况下,编码字符串 1111111111111111111111w
的长度为 23 个字符,这意味着 23*6 = 138 位可以解码为 17 个字节(136 位)+ 2 个无意义的位。
你这里使用的编码不是Base64而是Hash64
Base64 character map used by a number of hash formats; the ordering is wildly different from the standard base64 character map.
人物图中
HASH64_CHARS = u("./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
我们在索引 12 (001100
) 上找到 A
,在索引 60 (111100
)
w
这里的'trick'就是那个
binary.Base64Engine(binary.HASH64_CHARS)
有一个默认参数big=False
,表示默认以little endian格式进行编码。
在您的示例中,这意味着 w
是 001111
,A
是 001100
。在解码过程中,最后两位被截断,因为如上所述不需要它们。再次编码时,A
作为字符映射中的第一个字符,可以使用两次编码0011
加上两个无关紧要的位。