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'

第二个输入字符串在开始时只有很小的差异,那么为什么每个字符串的输出几乎不包含相似性呢?本来预计只有每个输出的开始会有点不同。

4

2 回答 2

3

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

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

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

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

   cat sat on the mat
my cat sat on the mat
于 2019-04-29T13:42:52.043 回答
2

Base64 是一种完全确定性的可逆转换,但它不是在每个字符的基础上运行(您也可以从输出长度不是输入的倍数观察到)。

相反,三个字节(24 位)的组通过将它们转换为四个 6 位数字(因此基数 64 = 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”,留下空格),输出将再次变得可识别。

于 2019-04-29T14:03:09.153 回答