Python Функция MD4 не может генерировать код ha sh, как в онлайн-генераторе MD4 ha sh - PullRequest
2 голосов
/ 15 марта 2020

MD4 га sh код, сгенерированный из Python, отличается от онлайн. Я знаю, это должно быть из-за кодировки. Вы можете помочь?

from Crypto.Hash import MD4

psk = 'The quick brown fox jumps over the lazy dog'

h = MD4.new()
h.update(psk.encode('UTF-16LE'))
print(f'UTF-16LE: {h.hexdigest()}')

h.update(psk.encode('UTF-16'))
print(f'UTF-16:   {h.hexdigest()}')

h.update(psk.encode('UTF-8'))
print(f'UTF8:     {h.hexdigest()}')

h.update(psk)
print(f'UTF8?:    {h.hexdigest()}')

Результаты ha sh для 'Быстрая коричневая лиса перепрыгивает через ленивую собаку' в различных кодировках:

UTF-16LE: 4e6a076ae1b04a815fa6332f69e2e231
UTF-16:   db8ae265b09c6ffa1e2fc163d66f64a4
UTF8:     324563ee68cc8009c82778d70d958723
UTF8?:    1aaf934b705b1d2aab69b0cf2a9cd87b

Онлайн MD4 га * Функция 1032 * (https://emn178.github.io/online-tools/md4.html) выдаст

1bee69a46ba811185c194762abaeae90

Обновление :

Спасибо за комментарий, я обновил код:


import getpass
from Crypto.Hash import MD4

psk = 'The quick brown fox jumps over the lazy dog' #getpass.getpass()

h = MD4.new(data=psk.encode('UTF-16LE'))
print(f'UTF-16LE: {h.hexdigest()}')

h = MD4.new(data=psk.encode('UTF-16'))
print(f'UTF-16:   {h.hexdigest()}')

h = MD4.new(data=psk.encode('UTF-8'))
print(f'UTF8:     {h.hexdigest()}')

h = MD4.new(data=psk)
print(f'UTF8?:    {h.hexdigest()}')

Новый вывод

UTF-16LE: 4e6a076ae1b04a815fa6332f69e2e231
UTF-16:   c6274a58a30e434503b45d2ce95e6c19
UTF8:     1bee69a46ba811185c194762abaeae90
UTF8?:    1bee69a46ba811185c194762abaeae90

Я также обнаружил, что https://emn178.github.io/online-tools/md4.html использует UTF-16, хотя я передал ему файл с UTF-16LE кодировка.

WPA2 Enterprise требует, чтобы текст был закодирован в UTF-16LE.

Ответы [ 2 ]

3 голосов
/ 15 марта 2020

С обновлением вы, очевидно, обновляете ха sh, что означает, что вы добавляете больше фрагментов вашего сообщения. Таким образом, вы на самом деле вводите строку несколько раз с разными кодировками, что в итоге дает га sh не только для вашей строки.

Если вы обновитесь только один раз, вы получите ожидаемый результат.

from Crypto.Hash import MD4

psk = 'The quick brown fox jumps over the lazy dog'

h = MD4.new()

h.update(psk.encode('UTF-8'))
print(f'UTF8:     {h.hexdigest()}')

Из документации дайджеста, из которого метод hexdigest является производным:

Возвращает дайджест строк, переданных до сих пор методу update(). Это строка из digest_size байтов, которая может содержать не-ASCII-символы, включая нулевые байты.

1 голос
/ 15 марта 2020

Я не знаю, откуда вы установили модуль Crypto, поэтому я не могу проверить

, но просто попробуйте следующий код:

from Crypto.Hash import MD4

psk = 'The quick brown fox jumps over the lazy dog'

Now that you gave me the information of how

h = MD4.new()
h.update(psk.encode('UTF-16LE'))
print(f'UTF-16LE: {h.hexdigest()}')

h = MD4.new()
h.update(psk.encode('UTF-16'))
print(f'UTF-16:   {h.hexdigest()}')

h = MD4.new()
h.update(psk.encode('UTF-8'))
print(f'UTF8:     {h.hexdigest()}')

h = MD4.new()
h.update(psk)
print(f'UTF8?:    {h.hexdigest()}')

Теперь, когда вы дал мне pip-имя пакета, который я могу подтвердить, что ошибка в вашем исходном коде состояла в том, чтобы продолжать обновлять тот же хеш-код вместо использования нового (или сбрасывать его в противном случае)

Я получаю правильные результаты.

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