JavaScripts › Verschlüsselungen
Zaunpfahl-Verschlüsselung
Schreibt den Text im Zickzack über mehrere Zeilen und liest ihn zeilenweise wieder ab — mit Bild des Zauns zum Mitverfolgen.
Die Zaunpfahl-Verschlüsselung — im Englischen rail fence cipher — gehört zu den Umstellungsverfahren. Anders als bei Caesar oder Atbash wird kein Buchstabe durch einen anderen ersetzt; es bleiben exakt dieselben Buchstaben, nur ihre Reihenfolge wird vertauscht. Der Text wird dazu im Zickzack über mehrere Zeilen geschrieben, wie eine Latte, die an einem Zaun auf und ab läuft, und anschließend Zeile für Zeile wieder abgelesen.
Der Schlüssel ist die Anzahl der Zeilen. Bei drei Zeilen und dem Wort GEHEIMNIS entsteht das Bild rechts im Zaun-Fenster: In der ersten Zeile stehen G, I und S, in der mittleren E, E, M, I, in der untersten H und N. Zeilenweise abgelesen ergibt das GISEEMIHN. Wer die Zeilenzahl kennt, kann den Weg rückwärts gehen; wer sie nicht kennt, muss raten — und weil es selten mehr als eine Handvoll sinnvoller Zeilenzahlen gibt, ist das schnell erledigt.
Genau das macht das Verfahren als Lehrstück interessant: Ein Umstellungsverfahren ist gegen die klassische Häufigkeitsanalyse immun, denn die Buchstabenverteilung bleibt ja unverändert — im Geheimtext ist genauso viel E enthalten wie im Klartext. Dafür ist es gegen simples Durchprobieren völlig wehrlos. Erst die Kombination von Ersetzung und Umstellung ergibt etwas, das man ernst nehmen kann; moderne Verfahren wechseln beides über viele Runden ab.
Dieses Script behält alle Zeichen einschließlich Leerzeichen, damit die Umwandlung in beide Richtungen exakt aufgeht. Klassisch entfernt man vor dem Verschlüsseln alle Leer- und Satzzeichen und schreibt in Fünfergruppen — sonst verrät die Wortstruktur zu viel. Wer das nachbilden will, findet den nötigen Handgriff unten in der Erklärung.
So funktioniert das Script
Alle drei Funktionen des Scripts — verschlüsseln, entschlüsseln, zeichnen — bauen auf derselben Vorarbeit auf: einer Liste, die für jede Textstelle die zugehörige Zeile nennt. Wer diesen einen Gedanken hat, hat das ganze Verfahren.
for (let i = 0; i < laenge; i++) {
weg.push(zeile);
if (zeile === 0) richtung = 1;
else if (zeile === zeilen - 1) richtung = -1;
zeile += richtung;
}
Das ist der Zickzack in fünf Zeilen. richtung ist +1 beim Abwärtslaufen und −1 beim Aufwärtslaufen. An der obersten Zeile (Nummer 0) wird die Richtung auf abwärts gestellt, an der untersten auf aufwärts — dazwischen bleibt sie, wie sie ist. Für „GEHEIMNIS" bei drei Zeilen entsteht die Liste [0,1,2,1,0,1,2,1,0]. Beachtet, dass die Prüfung vor dem Weiterzählen steht: Sonst würde der Weg über den Rand hinauslaufen.
for (let i = 0; i < text.length; i++) {
faecher[weg[i]] += text.charAt(i);
}
return faecher.join("");
Verschlüsseln ist damit fast trivial: Jedes Zeichen wandert in das Fach seiner Zeile, und am Ende werden die Fächer der Reihe nach aneinandergehängt. Aus ["GIS", "EEMI", "HN"] wird "GISEEMIHN".
for (let zeile = 0; zeile < zeilen; zeile++) {
for (let i = 0; i < weg.length; i++) {
if (weg[i] === zeile) {
ergebnis[i] = text.charAt(gelesen);
gelesen++;
}
}
}
Das Entschlüsseln ist der interessantere Teil, weil man den Geheimtext nicht einfach rückwärts lesen kann. Der Kniff: Der Zickzackweg hängt nur von der Länge des Textes ab, und die kennt man auch vom Geheimtext. Also wird derselbe Weg noch einmal gebaut, und dann läuft ein Zeiger von vorn durch den Geheimtext, während die äußere Schleife die Zeilen der Reihe nach abarbeitet. Jedes gelesene Zeichen wird an die Position gelegt, an der der Weg gerade diese Zeile berührt. Ein Array mit fester Größe (new Array(text.length)) macht das möglich, weil man dort an beliebiger Stelle schreiben darf.
strich += weg[i] === zeile ? text.charAt(i) : "·";
Das Zaunbild entsteht aus derselben Liste: Für jede Zeile wird der ganze Text durchlaufen, und es erscheint entweder das Zeichen — wenn der Weg gerade hier vorbeikommt — oder ein Punkt als Platzhalter. Weil die Ausgabe in einem <pre> steht, bleiben alle Zeichen gleich breit und die Spalten stehen sauber untereinander.
Zum Anpassen: Für die klassische Handhabung entfernt ihr vor dem Verschlüsseln alles außer Buchstaben und macht Großbuchstaben daraus — text.toUpperCase().replace(/[^A-Z]/g, ""). Fünfergruppen bekommt ihr mit ergebnis.replace(/(.{5})/g, "$1 "). Denkt daran, dass sich die Umwandlung dann nicht mehr vollständig umkehren lässt: Leerzeichen und Satzzeichen sind endgültig weg, was in der Kryptografie ausdrücklich erwünscht ist.
Script für die eigene Homepage
Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.