2017-12-31 18 views
0

Ich arbeite an einem einfachen Wörterbuchangriffsskript, bei dem jedes englische Kleinwort auf den Chiffretext überprüft wird, und meine erste Version hat gut funktioniert. Es sah so aus:hexdigest() löst TypeError aus: Erforderliches Argument 'length' (pos 1) nicht gefunden

import hashlib 
import random 


def dict_attack(pwds): 
    f = open('Dictionary.txt', 'r') 
    words = f.readlines() 
    f.close() 
    cracked = [] 
    for pwd in pwds: 
     for w in words: 
      word = w.strip('\n') 
      word = word.strip(' ') 
      hashed = hashlib.md5(word.encode()) 
      if hashed.hexdigest() == pwd: 
       print("[+] Found {} as {}, updating...".format(pwd, word)) 
       cracked.append(word) 
       break 
    print("[-] {}/{} passwords found!".format(len(cracked), len(pwds))) 
    return cracked 

def main(): 
    # To generate new ciphertext 
    f = open('Dictionary.txt', 'r') 
    words = f.readlines() 
    f.close() 
    for b in range(0, 10): 
     passwords.append(random.choice(words)) 
     passwords[b] = passwords[b].strip('\n') 
     passwords[b] = passwords[b].strip(' ') 
    hashed_passwords = [] 
    for p in passwords: 
     hashed_passwords.append(hashlib.md5(p.encode()).hexdigest()) 
    #print(hashed_passwords) 
    print(dict_attack(hashed_passwords)) 

main() 

Wie Sie sehen können, verwendete die Funktion dict_attack nur den MD5-Hash. In meiner nächsten Version dieses Skripts plante ich, jeden Algorithmus in der hashlib.algorithms_guaranteed-Bibliothek durchzugehen und jedes Wort im Wörterbuch mit jedem Algorithmus zu verschlüsseln und gegen den Chiffretext zu prüfen. Dieser Code sah wie folgt aus:

import hashlib 


arguments = [[hashlib.md5('hello'.encode())]] 
f = open('Dictionary.txt', 'r') 
words = f.readlines() 
f.close() 
# Remember to strip the \n's 
cracked = {} 
for ciphertext in arguments[0]: 
    for word in words: 
     for alg in hashlib.algorithms_guaranteed: 
      exec("hashed = hashlib.{}(word.encode())".format(alg)) 
      if hashed.hexdigest() == ciphertext: 
       cracked[ciphertext] = [word, alg] 
       print("[+] Found {} as {} with {} algorithm!".format(ciphertext, word, alg)) 
       break 
print(cracked) 

Allerdings, wenn ich meinen Code lief, warf er diesen Fehler:

TypeError: Required argument 'length' (pos 1) not found 

Warum ist das passiert, und wie kann ich es beheben?

+0

Haben Sie sich angesehen, welchen Algorithmus Sie zu der Zeit haben und dann welche Argumente es braucht? Als eine Randnotiz - Sie machen eine Menge wiederholte Arbeit in Ihrem ersten Beispiel, die nicht wunderbar effizient ist ... –

+0

'shake_256' Algorithmus' hexdigest' benötigt einen Längenparameter nach [docs] (https: // docs .python.org/3/library/hashlib.html # Shake-Variable-Length-Digests). –

+0

@ JonClements Ja, mein erster war nicht wirklich gut. Es war eher ein Coder-Skript als ein Programmierer-Skript, was einer der Gründe dafür ist, dass ich eine V2 gemacht habe. –

Antwort

0

hashlib enthält einige Hash-Funktionen mit dynamischen Längenausgaben. Insbesondere shake_128 und shake_256.

import hashlib 


arguments = [[hashlib.md5('hello'.encode())]] 
f = open('Dictionary.txt', 'r') 
words = f.readlines() 
f.close() 
# Remember to strip the \n's 
cracked = {} 

for ciphertext in arguments[0]: 
    digest = ciphertext.digest() 
    for word in words: 
     for alg in hashlib.algorithms_guaranteed: 
      if alg.startswith('shake_'): 
       continue 
      hashed = getattr(hashlib, alg)(word.encode()) 
      if hashed.digest() == digest: 
       cracked[ciphertext] = [word, alg] 
       print("[+] Found {} as {} with {} algorithm!".format(ciphertext, word, alg)) 
       break 

print(cracked) 
Verwandte Themen