Ich mache einen Kurs über Kryptographie und stehe auf einer Aufgabe fest. Die Anweisungen lauten wie folgt:
Der Klartext plain6.txt wurde mit DES verschlüsselt, um6d.dat mit einem 64-Bit-Schlüssel zu verschlüsseln, der als eine Folge von 8 Zeichen (64 Zeichen) angegeben wird Bits, von denen jedes 8. Bit ignoriert wird), wobei alle Zeichen Buchstaben sind (Klein- oder Großbuchstaben) und Ziffern (0 bis 9).
Um die Aufgabe abzuschließen, senden Sie mir den Verschlüsselungsschlüssel vor Februar 12, 23.59.
Hinweis: Ich erwarte einen 8-Byte (64-Bit) Schlüssel. Jedes Byte sollte stimmen mit dem entsprechenden Byte in meinem Schlüssel überein, bis auf den geringsten signifikantes Bit, das in DES nicht verwendet wird und daher beliebig sein könnte.
Hier ist der Code zu meinem ersten Versuch in Python:
%Vor%Ich bekomme eine Geschwindigkeit von 60.000 Versuchen / Sekunde. Ein Passwort von 8 Bytes über 62 Zeichen gibt 13 Billionen Möglichkeiten, was bedeutet, dass ich bei dieser Geschwindigkeit 130 Jahre brauchen würde, um es zu lösen. Ich weiß, dass dies keine effiziente Umsetzung ist und dass ich bessere Geschwindigkeiten in einer schnelleren Sprache wie C oder seinen Geschmacksrichtungen erreichen kann, aber ich habe sie nie programmiert. Selbst wenn ich eine Beschleunigung von 10 bekomme, sind wir immer noch einen großen Sprung von 10.000.000.000 pro Sekunde, um in den Stundenbereich zu kommen.
Was vermisse ich? Dies soll ein schwacher Schlüssel sein :). Nun, schwächer als der volle 256 Zeichensatz.
BEARBEITEN
Aufgrund einiger Unklarheiten bezüglich der Aufgabe, hier die vollständige Beschreibung und einige Testdateien für die Kalibrierung: Ссылка
BEARBEITEN 2
Dies ist eine grobe C-Implementierung, die rund 2.000.000 Passwörter / s pro Kern auf einem i7 2600K erreicht. Sie müssen das erste Zeichen des Kennworts angeben und mehrere Instanzen auf verschiedenen Kernen / Computern manuell ausführen. Ich habe es geschafft, das Problem innerhalb weniger Stunden auf vier Computern zu lösen.
%Vor%Ich würde annehmen, dass die gewünschte Lösung darin besteht, den Algorithmus tatsächlich zu implementieren. Dann, da du dich selbst entschlüsselst, kannst du früh bailen, was dir, wenn der Klartext auch A-Za-z0-9 ist, eine 98% ige Chance gibt, nach dem Entschlüsseln eines einzelnen Bytes stoppen zu können, ein 99,97% Chance, nach dem Entschlüsseln von 2 Bytes zu stoppen, und eine 99,9995% Chance, nach 3 Bytes zu stoppen.
Benutze auch C oder Ocaml oder so etwas. Sie verbringen wahrscheinlich viel mehr Zeit mit der String-Manipulation als mit der Verschlüsselung. Oder zumindest multi-processing und spin-up alle deine Kerne ...
Es gibt einen offensichtlichen Faktor 256 Beschleunigung: Ein Bit pro Byte ist nicht Teil des Schlüssels. DES hat nur einen 56-Bit-Schlüssel, aber einen 64-Bit-Schlüssel. Finde heraus, welches Bit es ist, und wirf äquivalente Zeichen weg.
Ich hatte ziemlich viel Hilfe und das ist eine Lösung in C. Da ich ein C Anfänger bin, ist es wahrscheinlich voller Bugs und schlechter Übung, aber es funktioniert.
Wie CodeInChaos herausgefunden hat, müssen nur 31 Zeichen getestet werden, da DES jedes 8. Bit des Schlüssels ignoriert, wobei zum Beispiel die ASCII Zeichen b: *0110001*0
und c: *0110001*1
bei der Verschlüsselung / Entschlüsselung identisch sind, wenn sie als Teil der Schlüssel.
Ich verwende die OpenSSL-Bibliothek für die DES-Entschlüsselung. Auf meinem Rechner erreicht die Geschwindigkeit ~ 1,8 Millionen Passwörter pro Sekunde, wodurch sich der gesamte Schlüsselraum auf rund 5 Tage testen lässt. Dies ist einen Tag kürzer als die Frist. Viel besser als der Python-Code, der über dem Jahr-Territorium liegt.
Es gibt noch Raum für Verbesserungen, wahrscheinlich könnte der Code optimiert und eingefädelt werden. Wenn ich alle meine Kerne verwenden könnte, würde ich meinen, dass die Zeit auf etwas mehr als einen Tag sinken würde, aber ich habe noch keine Erfahrung mit Threading.
%Vor%Diese Antwort ergänzt möglicherweise andere spezifischere Vorschläge, aber das erste, was Sie tun sollten, ist ein Profiler .
Hier gibt es wirklich schöne Beispiele:
Wie können Sie ein Python-Skript profilieren?
>BEARBEITEN:
Für diese besondere Aufgabe ist mir klar, dass es nicht helfen wird. Eine Testfrequenz von 10 GHz ist ... Hart auf einer einzelnen Maschine mit weniger Frequenz. Vielleicht könnten Sie erwähnen, welche Hardware Sie zur Verfügung haben. Versuchen Sie auch nicht, es während einiger Stunden zu laufen. Wenn Sie eine Methode finden, die innerhalb der Woche eine vernünftige Erfolgswahrscheinlichkeit gibt, lassen Sie sie laufen, während Sie Ihre Methoden verbessern.
Tags und Links python cryptography brute-force des