Dechiffrierung

Algorithmus zum Dechiffrieren

Das Dechiffrieren ist eigentlich (genau wie das Chiffrieren) eine Vertauschung von bestimmten Zeichen. Es kann also theoretisch die selbe Methode benutzt werden, die den Code erstellt hat. Dazu muss nur der Schlüssel angepasst werden. Die Permutation (a[] mit der Länge n) verschiebt das Zeichen an der Stelle i auf die Stelle a[i]. Da a eine bijektive Abbildung ist gilt für die inverse Abbildung b genau:

  b[a[i]] = i

Wenn das für alle i=0..n-1 berechnet wird, ist b vollständig bestimmt und kann zusammen mit dem Code an die Chiffrierungs-Methode übergeben werden. Hier nochmal die Chiffrierung:


  public static String cipher(String s, int[] a) {
    String h = "";  int pos = 0;
    while (pos <= s.length()) {
      for (int i = 0;  i < a.length;  i++) {
        if (pos + a[i] <= s.length()) {
          h += s.charAt(pos + a[i] - 1);
        }
      }
      pos += a.length;
    }
    return h;
  }

Da die Werte in a bei 1 beginnen, muss jedes mal mit a[i]-1 gerechnet werden. Die Methode zum Invertieren der Permutation sieht dann so aus:


  public static int[] getInverseOrder(int[] a) {
    int[] b = new int[a.length];
    for (int i = 0;  i < a.length;  i++) {
      b[a[i] - 1] = i + 1;
    }
    return b;
  }

Dechiffrierung Zur Erinnerung: Wenn der Text nicht durch die Länge der Permutation teilbar ist, werden die Zeichen einfach weggelassen. Das muss bei der Dechiffrierung beachtet werden. Genauer müssen diese Zeichen wieder eingefügt, der Code (mit inverser Permutation) chiffriert und dann die Zeichen wieder entfernt werden.


  public static String decipher(String s, int[] a) {
    int len = s.length() % order.length;    // Längendifferenz
    int pos = s.length() - len;             // Beginn des Reststrings
    if (len > 0) {
      StringBuffer b = new StringBuffer(s);
      for (int i = 0;  i < a.length;  i++)
        if (a[i] > len)
          b.insert(pos+i, ' ');
      s = b.toString();
    }
    int[] b = getInverseOrder(a);
    return cipher(s, b).substring(0, pos+len);
  }

Aus dem gegebenen Code
eeiLbgt ru ereWnchiasathm,mnn hkca ineMneekkhr ,ei m t sedGekhcne
mit dem Schlüssel (3,5,2,1,4) wird dadurch
Lieber guter Weihnachtsmann, mach ken Mikenke, her mit de Gschenke

Das ist alles zum Dechiffrieren von Zeichenketten mit bekannter Permutation. Das "knacken" von Code mit unbekanntem Schlüssel ist hier (dechiffrieren, brute force) beschrieben.

Ein Applet zum Ausprobieren

Das Programm kann eine zufällige Permutation erstellen, seitenweise Text chiffrieren und dechiffrieren (der Zeilenumbruch ist ja auch nur ein Zeichen: '\n'). Bei der verwendetten Permutationslänge (des automatisch erstellten Schlüssels) gibt es mehr als 10100 (in Worten: ein google) Möglichkeiten für den Schlüssel! Dies sollte brute force Attacken erschweren, sofern der Hacker kein im Text enthaltenes Wort kennt.

Sorry, your browser does not support Java applets.

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