Dehiffrierung mit brute force

brutale Gewalt

Da wir nicht wissen mit welchem Schlüssel der Code
eatvndeatvndndaihebneyrdenstrnetniadntdneedaeninttnseaauedmndnreedzgkneaeatns
erstellt wurde bleibt uns nichts anderes übrig, als alle Schlüssel zu probieren. Als erstes wird ein Algorithmus benötigt, der alle Permutationen der Länge n ermittelt.

  public void bruteforce(int[] a, int pos) {
    if (pos == a.length) {
      doSomething(a);
    } else {
      for (a[pos] = 1;  a[pos] <= a.length;  a[pos]++) {
        bruteforce(a, pos + 1);
      }
    }
  }
Diese Methode belegt a[pos] der Reihe nach mit allen Werten von 1 bis a.length und ruft sich selbst mit pos+1 wieder auf. Damit wird a mit allen denkbaren Belegungen gefüllt. Es muss noch getestet werden, ob dies auch korrekte Schlüssel sind, d.h. ob keine Zahl doppelt vorhanden ist.

  public void doSomething(int[] a) {
    for (int i = 0;  i < a.length-1;  i++)
      for (int j = i+1;  j < a.length;  j++)
        if (a[i] == a[j]) return;    // doppelt belegt -> Abbruch
    String s = cipher(CODE, a);
    if (s.indexOf(CONTAIN) >= 0)
      System.out.println(s);
  }
Nun wird der Code (CODE) mit der Permutation chiffriert und ausgegeben. Um nicht hunderte von Textzeilen manuell durchsuchen zu müssen, ob sie einen sinnvollen Text ergeben, werden nur solche Texte ausgegeben, die ein bestimmtes Wort enthalten (z.B. CONTAIN = "advent"). Durch den Aufruf von
bruteforce(new int[6], 0);
werden von den 720 (= 6!) möglichen Permutationen nur 6 ausgegeben, die das Wort "advent" enthalten. Man findet schnell die richtige heraus, die mit eingefügten Leerzeichen den Text "advent advent dein handy brennt erst die antenne dann die tasten und am ende der ganze kasten" ergibt.

Ein Applet zum Ausprobieren

Mit diesem Applet könnt ihr ein bisschen probieren wie die Chiffrierung und Dechiffrierung funktioniert. Auch das Knacken des Codes aus Aufgabe 36 ist möglich.

Erstellt von Markus Durzinsky, aktualisiert 10. Januar 2003
Für Fragen, Probleme oder Anregungen stehe ich gerne zur Verfügung