2017-01-12 7 views
0

Я хотел бы показать своим ученикам, что MD5 сталкивается с двумя целыми «сообщениями», данными here. Это моя оригинальная демонстрация для Python 2.7:Хеширование int в Python 3

from hashlib import md5 

m1 = "d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab4004583eb8fb7f8955ad340609f4b30283e488832571415a085125e8f7cdc99fd91dbdf280373c5bd8823e3156348f5bae6dacd436c919c6dd53e2b487da03fd02396306d248cda0e99f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396f9652b6ff72a70" 
m2 = "d131dd02c5e6eec4693d9a0698aff95c2fcab50712467eab4004583eb8fb7f8955ad340609f4b30283e4888325f1415a085125e8f7cdc99fd91dbd7280373c5bd8823e3156348f5bae6dacd436c919c6dd53e23487da03fd02396306d248cda0e99f33420f577ee8ce54b67080280d1ec69821bcb6a8839396f965ab6ff72a70" 
# differences        ^            ^      ^           ^            ^      ^

print md5(m1.decode("hex")).hexdigest() 
print md5(m2.decode("hex")).hexdigest() 

Как и ожидалось, он печатает дважды 79054025255fb1a26e4bc422aef54eb4. Теперь, когда я пытаюсь перевести последние две строки в Python 3.5, как:

print(md5(int(m1, 16)).hexdigest()) 
print(md5(int(m2, 16)).hexdigest()) 

Все я получаю это сообщение TypeError: object supporting the buffer API required. Метод decode больше не работает в Python 3, но я не уверен, что это хорошая идея заменить его на int(m, base), как указано выше. Может быть, проблема есть, а не с хэш-функцией API?

ответ

5

В Python 2, декодирование строк как шестнадцатеричный дает вам по-прежнему, а не целые числа. Не пытайтесь интерпретировать ваши шестнадцатеричные строки как целые числа.

Используйте binascii.unhexlify() function, чтобы превратить ваши шестнадцатеричные строки в байтовой строки:

from binascii import unhexlify 

print(md5(unhexlify(m1)).hexdigest()) 

Обратите внимание, что тот же самый код будет работать нормально в Python 2, а также.

Если вы хотите использовать декодирование в любом случае, используйте codecs.decode() function:

import codecs 

print(md5(codecs.decode(m1, 'hex')).hexdigest()) 

Опять же, тот же код работает в Python 2, а также.

+0

Это работает как шарм, спасибо! Я не знал этого модуля. – Aristide