繁体   English   中英

base64编码哈希输入?

[英]does base64 encoding hash the input?

我正在尝试调试为什么某些东西不能正常工作,并观察到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将3个输入字节映射到4个输出字节。

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

注意第一个例子上的== (填充)在第二个例子上消失了。

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

   cat sat on the mat
my cat sat on the mat

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

相反,通过将三个字节(24比特)组成四个6比特数(因此基数64 = 2 ^ 6),一次编码三个字节(24比特)的组。 如果输入长度不是三的倍数,则填充并通过在输出的末尾加上=字符来表示。

因此,如果在这个三字节帧上对齐,则不同输入中的公共子串只会在输出中显示为公共子串,并分组为相同的三元组。

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”,留下空格),输出将再次被识别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM