JavaScripts › Verschlüsselungen
Vigenere Quadrat
Verschlüsselt Texte nach Vigenère: Jeder Buchstabe des Schlüssels verschiebt einen Buchstaben des Textes um einen anderen Betrag.
Dieses Script von unserem User Vollautomatisch verschlüsselt und entschlüsselt Texte nach dem Verfahren von Vigenère. Anders als bei einfachen Geheimschriften wird nicht jeder Buchstabe immer durch denselben anderen ersetzt: Der Schlüssel wird Zeichen für Zeichen über den Text gelegt, und jeder seiner Buchstaben gibt an, um wie viele Stellen der darunterliegende Buchstabe im Alphabet weiterrückt. Ein A verschiebt um null Stellen, ein B um eine, ein C um zwei — und so weiter. Ist der Schlüssel zu Ende, beginnt er wieder von vorn.
Zum Ausprobieren tragt ihr eure Nachricht in das große Feld und einen Schlüssel in das Feld darunter ein; „Verschlüsseln“ schreibt das Ergebnis in das Ergebnisfeld. Zum Entschlüsseln kopiert ihr den Geheimtext zurück in das Nachrichtenfeld, tragt denselben Schlüssel ein und klickt auf „Entschlüsseln“. Stellt ihr die Schlüsselart auf „zufällig“, würfelt das Script für jeden Buchstaben ein eigenes Zeichen aus und trägt den so entstandenen Schlüssel selbst ein — den müsst ihr euch dann natürlich merken, sonst ist die Nachricht für immer verloren.
Drei weitere Schalter verändern die Ausgabe: „5er-Gruppen“ wirft alle Leer- und Satzzeichen weg und teilt den Geheimtext in Blöcke zu fünf Buchstaben — so wurden Funksprüche früher übermittelt, weil die Wortlängen sonst zu viel verraten. Unter „Schreibweise“ wählt ihr zwischen Großbuchstaben, Kleinbuchstaben und gemischter Schreibung. Steht das Alphabet auf „modifiziert“ oder die Schreibweise auf „gemischt“, rechnet das Script nicht mit 26, sondern mit 52 Zeichen: Groß- und Kleinbuchstaben zählen dann als verschiedene Buchstaben, was die Zahl der Möglichkeiten deutlich erhöht. Unter der Bühne steht das namensgebende Vigenère-Quadrat — die Tabelle aller 26 verschobenen Alphabete, mit der man das Verfahren früher von Hand ausgeführt hat.
Das Verfahren trägt den Namen des französischen Diplomaten Blaise de Vigenère (1523–1596), beschrieben wurde es allerdings schon 1553 von Giovan Battista Bellaso. Weil die Häufigkeitsanalyse — das übliche Werkzeug gegen einfache Buchstabenersetzung — hier ins Leere läuft, galt es Jahrhunderte lang als unknackbar. Erst Mitte des 19. Jahrhunderts fanden Charles Babbage und, unabhängig davon und als Erster veröffentlicht, der preußische Offizier Friedrich Kasiski einen Weg: Wiederholungen im Geheimtext verraten die Länge des Schlüssels, und danach zerfällt der Text in mehrere einfache Verschiebechiffren. Für heutige Rechner ist das eine Sache von Sekundenbruchteilen — als Versteck vor neugierigen Blicken taugt das Verfahren, für sensible Daten nicht.
Wer tiefer einsteigen will, findet bei Wikipedia eine ausführliche Darstellung; sehr empfehlenswert ist auch das Buch „Geheime Botschaften“ von Simon Singh. Im selben Fach liegen die Enigma, die dieselbe Grundidee mit rotierenden Walzen weitertreibt, das XcxxsV-Verschlüsselungsprogramm mit einer größeren Zeichentabelle, der moderne RC4 Algorithmus sowie mit Atbash und ROT13 die beiden schlüssellosen Klassiker.
Darunter das Vigenère-Quadrat: In jeder Zeile ist das Alphabet um eine Stelle weitergerückt. Der Schlüsselbuchstabe wählt die Zeile, der Klartextbuchstabe die Spalte — im Kreuzungspunkt steht der Geheimtextbuchstabe.
So funktioniert das Script
Das Script hat vier Teile: verschluesseln() und entschluesseln() mit der eigentlichen Rechnung, changeAlphabet(), das die Quadrat-Tabelle unter der Bühne aufbaut, und leeren() für den dritten Knopf. Ganz unten werden die Knöpfe und die beiden Alphabet-Schalter mit diesen Funktionen verbunden. Beide Rechenfunktionen sind fast gleich aufgebaut — sie unterscheiden sich in einem einzigen Rechenzeichen.
let buchstaben;
if (felder.gross[2].checked === true) { buchstaben = GEMISCHT; }
else { buchstaben = KLEIN; text = text.toLowerCase(); }
if (felder.fremd[1].checked === true) { buchstaben = GEMISCHT; }
Zuerst legt das Script fest, mit welchem Zeichenvorrat gerechnet wird. KLEIN ist das gewöhnliche Alphabet mit 26 Kleinbuchstaben, GEMISCHT hängt die 26 Großbuchstaben an und kommt so auf 52 Zeichen. felder ist die Sammlung aller Formularfelder; felder.gross sind die drei Schalter der Schreibweise, und [2] ist davon der dritte. Wird mit dem kleinen Alphabet gerechnet, wandert der ganze Text vorher mit toLowerCase() in Kleinschreibung — sonst würde das Script die Großbuchstaben gar nicht wiederfinden.
while (losungswort.length < text.length) { losungswort = losungswort + losungswort; }
Der Schlüssel muss mindestens so lang sein wie der Text. Diese Zeile hängt ihn deshalb so lange an sich selbst an, bis er lang genug ist: Aus Kaktus wird KaktusKaktus, dann KaktusKaktusKaktusKaktus und so fort. Genau das ist die Schwäche des Verfahrens — der Schlüssel wiederholt sich, und diese Wiederholung ist es, die ihn angreifbar macht. Direkt darüber steht im Script eine Sicherheitsabfrage: Ist gar kein Schlüssel eingetragen, erscheint ein Hinweis und die Funktion bricht ab. Ohne sie würde die Schleife eine leere Zeichenkette endlos an sich selbst hängen und der Browser einfrieren.
const cut = text.charAt(i);
const index_cut = buchstaben.indexOf(cut);
const los = losungswort.charAt(l);
const index_los = buchstaben.indexOf(los);
Das Herzstück der Schleife: cut ist der Buchstabe des Textes an Position i, los der Schlüsselbuchstabe an Position l. indexOf() sagt, an welcher Stelle die beiden im Alphabet stehen — für ein a die 0, für ein b die 1. Beachtet die zwei getrennten Zähler: i läuft über den ganzen Text, l nur über die Zeichen, die tatsächlich verschlüsselt werden. Steht an Position i ein Leerzeichen oder ein Komma, liefert indexOf() nämlich −1, das Zeichen wird unverändert übernommen und l bleibt stehen — der Schlüssel wird also nicht für Satzzeichen verbraucht.
const buchstabe = (index_cut + index_los + 4 * buchstaben.length) % buchstaben.length;
const buchstabe_verschluesselt = buchstaben.charAt(buchstabe);
Und das ist die ganze Vigenère-Chiffre: Die Position des Klartextbuchstabens plus die Position des Schlüsselbuchstabens, alles im Kreis gerechnet. Das % buchstaben.length ist der Rest bei der Division durch die Alphabetlänge und sorgt dafür, dass es hinter dem z wieder beim a weitergeht. Der Zuschlag 4 * buchstaben.length ändert am Ergebnis nichts — er hält die Zahl beim Entschlüsseln nur zuverlässig im positiven Bereich, denn dort steht an derselben Stelle ein Minus statt des Plus. Das ist der einzige Unterschied zwischen den beiden Funktionen: Verschlüsseln addiert, Entschlüsseln subtrahiert.
for (let mache_gruppe = 1; mache_gruppe <= ausgabe.length; mache_gruppe++) {
const mach_ab = ausgabe.charAt(mache_gruppe - 1);
ausgabe_2 += mach_ab;
if (mache_gruppe % 5 === 0) { ausgabe_2 += " "; }
}
Die Fünfergruppen entstehen ganz zum Schluss: Das Script geht den fertigen Geheimtext Zeichen für Zeichen durch und setzt nach jedem fünften ein Leerzeichen. Eine Schleife davor hat vorher alles entfernt, was nicht im Alphabet steht. Wollt ihr Dreier- oder Zehnergruppen, müsst ihr nur die 5 in dieser Zeile austauschen.
for (let i = 0; i < alphabet.length; i++) {
ausgabe += alphabet.join(" ") + "<br>";
speicher = alphabet[0];
alphabet.shift();
alphabet[alphabet.length] = speicher;
}
So entsteht die Quadrat-Tabelle. alphabet ist hier eine Liste einzelner Buchstaben. In jedem Durchgang wird die Liste mit join(" ") zu einer Zeile zusammengefügt, dann nimmt shift() den vordersten Buchstaben heraus und hängt ihn hinten wieder an. Nach 26 Durchgängen steht jedes der 26 verschobenen Alphabete einmal da — genau die Tabelle, die man zum Rechnen von Hand braucht. Die beiden Alphabet-Schalter rufen dieselbe Funktion mit 0 beziehungsweise 1 auf und zeigen so das 26- oder das 52-stellige Quadrat.
Zum Anpassen: Die Vorbelegung von Nachricht und Schlüssel steht im HTML und darf frei geändert werden, ebenso die Beschriftungen. Wer eine feste Schreibweise möchte, kann die Schaltergruppen weglassen — dann müssen aber auch die zugehörigen Abfragen im Script verschwinden, weil felder.gross[2] sonst ins Leere greift.
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.