2017-04-19 8 views
3

Erwartetes Ergebnis:Recursively Iterieren jede Zeichenkombination über

Das Programm nimmt ein Hash-Passwort als Eingang; Dies wird an die Entschlüsselungsfunktion übergeben. Die Funktion iteriert über jede n-Buchstaben-Kombination mit Groß- und Kleinschreibung, wobei jede dieser Zeichenfolgen hasht. Wenn eine Übereinstimmung mit der Eingabe gefunden wird, wird das unverschlüsselte Kennwort ausgegeben. Andernfalls wird es beendet.

Tatsächliches Ergebnis:

Funktion wird über jeden Groß- und Kleinbuchstaben nur für den letzten Buchstaben in der aktuellen Iteration.

Beschreibung des Problems:

Ich versuche, eine einfache Brute-Force-DES-verschlüsselte Passwort-Cracker in Python zu implementieren. Ich habe eine Implementierung für 4-stellige Passwörter mit einer Menge von for-Schleifen, aber jetzt möchte ich es für eine Reihe von Längen, mit Rekursion umgestalten. Wie kann ich über jede Zeichenkombination iterieren, angefangen bei der 1-Zeichen-Kombination bis zur 4-Zeichen-Zeichenkombination?

Ich wollte diese Linie verwenden:

  password[i] = string.ascii_letters[j] 

Aber ich bekomme diese Fehlermeldung:

TypeError: 'str' object does not support item assignment 

-Code-Schnipsel:

def decrypt(encryptedText): 
    # reference global variable 
    global password 
    # check curr password guess length 
    pwdlen = len(password) 

    if pwdlen >= 4: 
     print("Password is longer than 4 characters, exiting...") 
     exit(2) 

    # debug lines 
    print("password is {}".format(password)) 
    print("length: {}".format(pwdlen)) 
    time.sleep(2) 

    # first two characters is salt 
    salt = encryptedText[:2] 

    # Check hashes for every combination of strings and compare them 
    # starts with last char 
    for i in range(pwdlen, 0, -1): 
     for j in range(0, len(string.ascii_letters)): 
      password = string.ascii_letters[:pwdlen] + string.ascii_letters[j] 
      hashed = crypt.crypt(password, salt) 

      # debug line 
      print(password) 

      # if found - print password and exit 
      if hashed == encryptedText: 
       print(password) 
       exit(0) 

    # this makes recursion go through +1 char combinations on every iteration 
    password = (pwdlen + 1) * 'a' 

    return decrypt(encryptedText) 
+2

Zeichenfolgen sind in Python unveränderlich und unterstützen keine Elementzuweisung. – Charul

Antwort

6

Strings unveränderlich sind. Sie können einem Teil der Zeichenfolge keinen neuen Wert zuweisen. Stattdessen müssen Sie einen neuen Wert erstellen und der ursprünglichen Variablen zuweisen. Zum Beispiel:

# password[i] = string.ascii_letters[j] 
password = password[:i] + string.ascii_letters[j] + password[i+1:] 

Zweitens können Sie tun wahrscheinlich viel besser durch das itertools Paket mit all Permutationen zu erzeugen, die Sie wollen. Zum Beispiel, erzeugen Sie das Produkt von asci_letters so oft wie Sie wollen, und Schritt beitreten dieser Buchstaben-Sequenzen.