хеширование base64 хэширует ввод? - PullRequest
3 голосов
/ 29 апреля 2019

Я пытаюсь отладить, почему что-то не совсем работает, и заметил, что 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'

Вторая входная строка имеет небольшую разницу в начале, так почему же выходные данные для каждой из этих строк практически не имеют сходства? Ожидалось бы, что только начало каждого вывода будет немного другим.

Ответы [ 2 ]

3 голосов
/ 29 апреля 2019

Base64 отображает 3 входных байта в 4 выходных байта.

Поскольку вы добавили 4 входных байта, все оставшиеся байты «сместились» в разные места вывода.

Примечание== (отступ) в первом примере, который исчез во втором.

Попробуйте добавить или удалить кратные 3 входных байта:

   cat sat on the mat
my cat sat on the mat
2 голосов
/ 29 апреля 2019

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", оставляя пробел), вывод снова становится узнаваемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...