Kod skrótu MD4 wygenerowany z Pythona różni się od kodu dostępnego online. Wiem, że to musi być spowodowane kodowaniem. Możesz pomóc?

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()}')

Dane wyjściowe skrótu dla `` Szybki brązowy lis przeskakuje nad leniwym psem '' w innym kodowaniu to:

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

Funkcja skrótu MD4 online (https://emn178.github.io/online-tools/ md4.html)

1bee69a46ba811185c194762abaeae90

Aktualizacja :

Dziękuję za komentarz, zaktualizowałem kod:


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()}')

Nowy wynik to

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

Odkryłem też, że https://emn178.github.io/online-tools/md4. html używa UTF-16, mimo że przekazałem mu plik z kodowaniem UTF-16LE.

WPA2 Enterprise wymaga zakodowania tekstu w UTF-16LE.

2
yoonghm 15 marzec 2020, 05:18

2 odpowiedzi

Najlepsza odpowiedź

Dzięki update oczywiście aktualizujesz hash, co oznacza, że dodajesz więcej fragmentów wiadomości. Więc tak naprawdę zasilasz ciąg wiele razy z różnymi kodowaniami, co w końcu daje hash dla czegoś więcej niż tylko twój ciąg.

Jeśli zaktualizujesz tylko raz, uzyskasz oczekiwany wynik.

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()}')

Z dokumentacji wyciągu, z którego pochodzi metoda hexdigest:

Zwróć podsumowanie ciągów przekazanych do tej pory do metody update(). To jest ciąg digest_size bajtów, który może zawierać znaki spoza zestawu ASCII, w tym bajty zerowe.

3
Maarten Bodewes 15 marzec 2020, 19:08

Nie wiem, skąd zainstalowałeś pip moduł Crypto, więc nie mogę przetestować

Ale po prostu wypróbuj następujący kod:

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()}')

Teraz, gdy podałeś mi nazwę pip pakietu, mogę potwierdzić, że błąd w twoim oryginalnym kodzie polegał na kontynuowaniu aktualizacji tego samego skrótu zamiast używania nowego (lub resetowaniu go w inny sposób)

Otrzymuję prawidłowe wyniki.

1
gelonida 15 marzec 2020, 07:42