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 odpowiedzi
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ągdigest_size
bajtów, który może zawierać znaki spoza zestawu ASCII, w tym bajty zerowe.
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.
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.