Base64编码是否对输入进行哈希处理?

3

我正在尝试调试某些东西为什么不能正常工作,并观察到 b64encode 似乎不像我想象的那样工作:

import base64

base64.b64encode( bytes("the cat sat on the mat", "utf-8") )
>> b'dGhlIGNhdCBzYXQgb24gdGhlIG1hdA=='

base64.b64encode( bytes("cat sat on the mat", "utf-8") )
>> b'Y2F0IHNhdCBvbiB0aGUgbWF0'

第二个输入字符串只有一个很小的差异,那么为什么每个字符串的输出几乎没有相似之处呢?本来预期只有开头会略有不同。

如果Base64对输入进行哈希处理,那么它就不是可逆操作。您无法“取消哈希”数据。 - Aran-Fey
2个回答

3

Base64将3个输入字节映射为4个输出字节。

由于您添加了4个输入字节,这意味着所有剩余的字节都会“移动”到输出中的不同位置。

请注意第一个示例中的==(填充),它在第二个示例中消失了。

尝试添加或删除3个输入字节的倍数:

   cat sat on the mat
my cat sat on the mat

2
Base64是一种完全确定性的可逆转换,但它不是按字符为基础进行操作的(从输出长度不是输入的倍数也可以观察到这一点)。
相反,每次编码三个字节(24位),将它们转换为四个6位数字(因此base64 = 2^6)。如果输入长度不是三的倍数,则进行填充,并在输出末尾放置=字符来指示。
因此,不同输入中的常见子字符串只有在它们在三字节帧上对齐并分组成相同的三元组时,才会显示为输出中的公共子字符串。
the cat sat on the mat
dGhlIGNhdCBzYXQgb24gdGhlIG1hdA==

he cat sat on the mat
aGUgY2F0IHNhdCBvbiB0aGUgbWF0

e cat sat on the mat
ZSBjYXQgc2F0IG9uIHRoZSBtYXQ=

 cat sat on the mat
IGNhdCBzYXQgb24gdGhlIG1hdA==

注意,如果你精确地截去了三个字符(“the”,保留空格),输出结果将再次变得可识别。最初的回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接