2010-05-23 13 views
6

Dieses Problem kann relativ einfach sein, aber ich habe zwei Textdateien. Eine Textdatei enthält alle verschlüsselten Passwörter, die über crypt.crypt in Python verschlüsselt wurden. Die andere Liste enthält über 400k + normale Wörterbuchwörter.Was ist eine effiziente Möglichkeit zum Schreiben Passwort-Cracking-Algorithmus (Python)

Die Zuweisung besteht darin, dass 3 verschiedene Funktionen, die Strings von ihrem Normalfall in alle unterschiedlichen Permutationen von Großbuchstaben transformieren, einen Buchstaben in eine Zahl umwandelt (wenn sie gleich aussieht, zB G -> 6, B -> 8), und kehrt eine Zeichenfolge um. Die Sache ist, dass angesichts der 10 bis 20 verschlüsselten Passwörter in der Passwort-Datei, was ist der effizienteste Weg, um die am schnellsten laufende Lösung in Python zum Ausführen dieser Funktionen auf Wörterbuch Wort in der Wort-Datei zu bekommen? Es wird vorausgesetzt, dass all diese Wörter, wenn sie auf irgendeine Weise transformiert werden, mit einem Passwort in der Passwortdatei verschlüsselt werden.

Dies ist die Funktion, die, wenn eine bestimmte Zeichenfolge überprüft, wenn verschlüsselt, das gleiche wie das verschlüsselte Passwort in vergangen ist:

def check_pass(plaintext,encrypted): 
crypted_pass = crypt.crypt(plaintext,encrypted) 
if crypted_pass == encrypted: 
    return True 
else: 
    return False 

Vielen Dank im Voraus.

+3

'return crypted_pass == encrypted' – SilentGhost

+5

' return verschlüsselt == crypt.crypt (plaintext, encrypted) ' –

Antwort

3

Ohne Details über den zugrundeliegenden Hash-Algorithmus und mögliche Schwächen des Algorithmus zu kennen, können Sie nur einen Brute-Force-Angriff ausführen und alle möglichen Transformationen der Wörter in Ihrer Passwortliste ausprobieren.

Die einzige Möglichkeit, einen solchen Brute-Force-Angriff zu beschleunigen, besteht darin, leistungsfähigere Hardware zu erhalten und die Aufgabe aufzuteilen und den Cracker parallel auszuführen.

+0

Als eine leichte Optimierung des Fleischraums, kann es erfolgreich sein, die Wörter unverändert zu versuchen, bevor Sie beginnen, sie zu ändern. Menschen neigen dazu, echte Wörter zu verwenden, und sind weit weniger wahrscheinlich, Permutationen einschließlich Zahlen usw. zu verwenden.Natürlich, wenn das Hausaufgaben sind, YMMV. ;) –

+0

Yeah @JosephMastey, aber das sieht aus wie Hausaufgaben, in diesem Fall würde Ihre Annahme nicht halten – inspectorG4dget

+0

@ inspectorG4dget Sicher tut, aber lassen Sie uns so tun, dass der Professor kam mit einem einigermaßen realistischen Datensatz, nur um mich besser über meine fühlen eigener CS-Abschluss. –

2

Auf meinem langsamen Laptop nimmt crypt.crypt etwa 20 Mikrosekunden:

$ python -mtimeit -s'import crypt' 'crypt.crypt("foobar", "zappa")' 
10000 loops, best of 3: 21.8 usec per loop 

so, der Brute-Force-Ansatz (wirklich die einzige Vernünftige) ist "irgendwie" möglich. Wenn Sie Ihre Transformationsfunktionen anwenden, erhalten Sie ungefähr 100 transformierte Wörter pro Wörterbuchwort (hauptsächlich aus den Groß- und Kleinschreibungsänderungen), also etwa 40 Millionen transformierte Wörter aus Ihrem gesamten Wörterbuch. Bei jeweils 20 Mikrosekunden dauert das etwa 800 Sekunden, man nennt es 15 Minuten, um zu versuchen, eines der Passwörter zu knacken, das eigentlich keiner der Varianten entspricht; erwartete Zeit etwa die Hälfte, um ein Passwort zu knacken, dass entspricht entsprechen.

Also, wenn Sie 10 Passwörter zu knacken haben, und sie alle zu einem transformierten Wörterbuch Wort entsprechen, sollten Sie in einer Stunde oder zwei getan werden. Ist das in Ordnung? Denn es gibt nicht viel anderes, als dieses peinlich parallele Problem über so viele Knoten und Kerne zu verteilen, wie Sie erfassen können (oh, und verwenden Sie zuerst eine schnellere Maschine - das könnte Sie vielleicht einen Faktor von zwei kaufen oder in der Nähe).

Es gibt keinen tiefe Optimierung Trick, die Sie hinzufügen können, so die allgemeine Logik, dass eine Triple-verschachtelten Schleife sein wird: eine Ebene Schleifen über die verschlüsselten Passwörter, eine über die Worte im Wörterbuch, eine über die Varianten jedes Wörterbuchwort. Es gibt keinen großen Unterschied in Bezug darauf, wie Sie Dinge verschachteln (außer dass die Schleife auf den Varianten der Einfachheit halber in die Schleife der Wörter eingefügt werden muss). Ich empfehle, "gib mir alle Varianten dieses Wortes" als Generator (zur Vereinfachung, nicht für die Geschwindigkeit) einzukapseln und ansonsten die Anzahl der Funktionsaufrufe zu minimieren (zB gibt es keinen Grund, diese check_pass Funktion zu verwenden, da der Inline-Code genauso klar ist und wird mikroskopisch schneller sein).

Verwandte Themen