2011-09-28 13 views
130

mam ten błąd:Jak poprawić TypeError: Obiekty Unicode muszą być zakodowane przed haszowaniem?

Traceback (most recent call last): 
    File "python_md5_cracker.py", line 27, in <module> 
    m.update(line) 
TypeError: Unicode-objects must be encoded before hashing 

gdy próbuję uruchomić ten kod w Python 3.2.2:

import hashlib, sys 
m = hashlib.md5() 
hash = "" 
hash_file = input("What is the file name in which the hash resides? ") 
wordlist = input("What is your wordlist? (Enter the file name) ") 
try: 
     hashdocument = open(hash_file,"r") 
except IOError: 
     print("Invalid file.") 
     raw_input() 
     sys.exit() 
else: 
     hash = hashdocument.readline() 
     hash = hash.replace("\n","") 

try: 
     wordlistfile = open(wordlist,"r") 
except IOError: 
     print("Invalid file.") 
     raw_input() 
     sys.exit() 
else: 
     pass 
for line in wordlistfile: 
     m = hashlib.md5() #flush the buffer (this caused a massive problem when placed at the beginning of the script, because the buffer kept getting overwritten, thus comparing incorrect hashes) 
     line = line.replace("\n","") 
     m.update(line) 
     word_hash = m.hexdigest() 
     if word_hash==hash: 
       print("Collision! The word corresponding to the given hash is", line) 
       input() 
       sys.exit() 

print("The hash given does not correspond to any supplied word in the wordlist.") 
input() 
sys.exit() 
+0

Znalazłem otwarcie pliku z "rb" pomógł mi w przypadku. – dlamblin

Odpowiedz

132

Prawdopodobnie szuka kodowania znaków od wordlistfile.

wordlistfile = open(wordlist,"r",encoding='utf-8') 

Lub, jeśli pracujesz na zasadzie wiersz po wierszu:

line.encode('utf-8') 
+1

'open (wordlist," r ", encoding = 'utf-8')' po co używać open z określonym kodowaniem, kodowanie jest określone kodekiem dekodowania, bez tej opcji używa kodowania zależnego od platformy. –

10

Błąd już mówi, co masz robić. MD5 działa na bajtach, więc musisz kodować ciąg znaków Unicode w bytes, np. z line.encode('utf-8').

+52

Potrącony, ponieważ zdanie "Błąd już mówi, co musisz zrobić." jest niegrzecznie niegrzeczny i nic nie dodaje. – timthelion

+12

@timthelion Dodaje, że czytanie ze zrozumieniem jest warunkiem wstępnym programowania. Okropne, wiem. –

+11

@timthelion Naprawdę. Nie miałeś nic lepszego do roboty, niż zdanie moralnego osądu nad odpowiedzią na pytanie sprzed około 4 lat. I to nie jest nieuprzejme (to faktyczne) i jest pomocne (możesz przeczytać wiadomość w sposób, który pomoże ci znaleźć rozwiązanie). – sehe

8

Proszę spojrzeć najpierw na that odpowiedź.

Teraz komunikat jest jasny: można używać tylko bajty, a nie ciągi Python (co było unicode w Pythonie < 3), więc trzeba kodować sznurki z preferowanym kodowaniem: utf-32, utf-16, utf-8 lub nawet jedno z ograniczonych 8-bitowych kodowań (co niektórzy mogą nazwać stronami kodowymi).

Bajty w twoim pliku listy słów są automatycznie dekodowane do Unicode przez Python 3 podczas czytania z pliku. Proponuję zrobić:

m.update(line.encode(wordlistfile.encoding)) 

tak że kodowane dane popychany z algorytmem md5 są kodowane dokładnie jak plik bazowego.

45

Musisz zdefiniować encoding format jak utf-8, Spróbuj łatwy sposób,

Ten przykład generuje liczbę losową przy użyciu algorytmu SHA256:

>>> import hashlib 
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f' 
4

Można by otworzyć plik w trybie binarnym:

import hashlib 

with open(hash_file) as file: 
    control_hash = file.readline().rstrip("\n") 

wordlistfile = open(wordlist, "rb") 
# ... 
for line in wordlistfile: 
    if hashlib.md5(line.rstrip(b'\n\r')).hexdigest() == control_hash: 
     # collision 
6

Aby zapisać hasło (PY3):

import hashlib, os 
password_salt = os.urandom(32).hex() 
password = '12345' 

hash = hashlib.sha512() 
hash.update(('%s%s' % (password_salt, password)).encode('utf-8')) 
password_hash = hash.hexdigest() 
Powiązane problemy