base64编码是否散列输入?

2024-10-03 23:21:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在试着调试为什么有些东西不能正常工作,并观察到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'

第二个输入字符串在开始时只有很小的差异,那么为什么这些字符串的输出实际上没有相似性呢?只希望每个输出的开头有点不同。你知道吗


Tags: the字符串importbyteson差异satutf
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”,保留空格),输出将再次变得可识别。你知道吗

Base64将3个输入字节映射为4个输出字节。你知道吗

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

注意第一个例子中的==(padding)在第二个例子中消失了。你知道吗

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

   cat sat on the mat
my cat sat on the mat

相关问题 更多 >