450 votes

"TypeError: les objets Unicode doivent être codés avant le hachage"

J'ai cette erreur

 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
 

quand j'essaye d'exécuter ce code dans 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()
 

432voto

cwallenpoole Points 34940

Il recherche probablement un caractère encodant à partir de wordlistfile .

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

Ou, si vous travaillez ligne par ligne:

 line.encode('utf-8')
 

180voto

user1153551 Points 3562

Vous devez définir encoding format comme utf-8 , essayez ce moyen facile,

Dans cet exemple, générer un nombre aléatoire utilisant l’algorithme SHA256,

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

22voto

Cat Plus Plus Points 53385

L'erreur dit déjà ce que vous devez faire. Comme MD5 fonctionne sur des octets, vous devez donc coder la chaîne Unicode en bytes , par exemple avec line.encode('utf-8') .

14voto

tzot Points 32224

Veuillez prendre un regarder d'abord que répondre.

Maintenant, le message d'erreur est clair: vous ne pouvez utiliser que des octets, pas Python cordes (ce unicode en Python < 3), de sorte que vous devez coder les chaînes de votre choix à l'encodage: utf-32, utf-16, utf-8 ou même l'un de l'limité à 8 bits codages (ce que certains pourraient appeler les codes).

Les octets dans votre liste de mots de fichier sont automatiquement décodé en Unicode par Python 3 comme vous le lire à partir du fichier. Je vous suggère de faire:

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

de sorte que les données codées poussé à l'algorithme md5 sont codés exactement comme le fichier sous-jacent.

12voto

J.F. Sebastian Points 102961

Vous pouvez ouvrir le fichier en mode binaire:

importer 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X