Wie programmiere ich einen password cracker?

4 Antworten

Naja, im Endeffekt macht heute quasi kaum jemand noch Brute Force Attacken - und wenn dann auf GPUs, weil die einfach viel schneller rechnen als CPUs, aber ich würde einfach das Problem vereinfachen und würde zum einen die Passwortlänge z.B. auf genau 4 Zeichen begrenzen und sagen, es kommen nur Kleinbuchstaben ohne Umlaute vor. Ohne eine solche Beschränkung wirst Du kein Programm schreiben können, welches in überschaubarer Zeit fertig wird.

Dann hast Du pro Stelle 26 Möglichkeiten. Das ist relativ überschaubar und Du musst einfach nur ein Programm schreiben, welches alle Kombinationen probiert, bis es die richtige findet. Beispiel (Pseudo-Java - so in etwa könnte das aussehen):

string buchstaben = "abcdefghijklmnopqrstuvwxyz";
int[] stellen = new int[4];
for (int s1 = 0; s1 < buchstaben.length; s1++) {
  stellen[0] = s1;
  for (int s2 = 0; s2 < buchstaben.length; s2++) {
    stellen[1] = s2;
    for (int s3 = 0; s3 < buchstaben.length; s3++) {
      stellen[2] = s3;
      for (int s4 = 0; s4 < buchstaben.length; s4++) {
        stellen[3] = s4;

        string passwort = buchstaben[stellen[0]] + 
                          buchstaben[stellen[1]] + 
                          buchstaben[stellen[2]] +
                          buchstaben[stellen[3]];

        if (zufälligesKennwort == passwort) {
          System.out.println("Kennwort gefunden: " + passwort);
          return;
        }
      }
    }
  }
}

System.out.println("Kennwort nicht gefunden!");

Das macht nichts anderes, als alle Kombinationen auszuprobieren, indem es hinten anfängt, Stellen zu tauschen. Es prüft also "aaaa", "aaab", "aaac", ..., "aaba", "aabb", ... "zzzz".

Wenn Du davon die Zeit misst, weißt Du halt, wie lange das dauert. Wenn Du jetzt noch eine Stelle (und damit eine Schleife) dazunimmst, kannst Du wieder die Zeit messen und wirst feststellen, dass der Aufwand überproportional steigt.

Melina236 
Fragesteller
 10.11.2023, 14:09

Vielen vielen Dank. Das hat mir schon sehr viel weiter geholfen (;

1
ohwehohach  10.11.2023, 14:13
@Melina236

Das obige kann man auch noch eleganter ohne die 4 Schleifen machen und dann auch gleich so, dass die Länge des Passworts vorgegeben werden kann, aber für das Verständnis ist das obige vermutlich einfacher.

0

Wenn du nicht programmieren kannst ist das natürlich schwierig.

An sich ist das aber ganz einfach im Pseudocode:

Password password;
size_t iterations = 0;
Time start_time = Time::now();
do{
password = generateRandomPassword();
iterations++;
}while(checkPassword(password));
Time end_time = Time::now();

print("Password is ", password, " and was found after ", iterations, " iterations in ", (end_time-start_time).as_milliseconds(), " ms.");

Bzw. am besten gibt du das irgendwie strukturiert aus, sodass du das dann verwenden kannst um eine Statistik zu erstellen.

Die Methode "checkPassword" wird davon abhängen wie du das Password prüfen möchtest.
Die Methode "generateRandomPassword" wird davon abhängen wie du Brute Force machen möchtest (e.g. Wörterbuchattacke oder komplett zufällig, evtl. mit Längenbegrenzung, ...)

Hallo. Du hast es doch eigentlich schon skizziert. Denke mal die Algorithmen müssen nicht sonderlich ausgefuchst sein. Fang doch einfach mal einfach an, mit einem bestimmten Zeichenvorrat und einer maximalen Zeichenkettenlänge.

Letztlich kommt wohl bei raus, dass es ziemlich viele Kombinationen gibt. :)

Also wenn du nur Random irgendwelche Passwörter versuchst wirst du auch bei einem einfachen Passwort wie 1234 mehrere Tage benötigen...

Du musst also hier irgendwie die Auswahl beschränken. Also wenn du zB sagst du hast Passwörter in der Länge von 3 bis 6 Zeichen gehts schneller. Generell wirds einfacher je mehr Infos du vorher hast.