簡體   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