JavaScriptsVerschlüsselungen

Enigma

Eine Nachbildung der Chiffriermaschine Enigma mit Walzen, Ringstellung, Umkehrwalze und Steckerbrett — vollständig im Browser.

Dieses umfangreiche Script von unserem User Vollautomatisch bildet die Chiffriermaschine Enigma nach — und zwar nicht nur ihr Ergebnis, sondern ihren Aufbau: drei Rotoren aus einem Vorrat von acht, dazu eine vierte Griechenwalze, vier verschiedene Umkehrwalzen, Ring- und Grundstellung für jede Walze sowie das Steckerbrett. Wer die Maschine verstehen will, kann hier jede einzelne Einstellung anfassen und sofort sehen, was sie am Geheimtext ändert.

Die Bedienung: Nachricht in das obere Feld tippen, auf „Verschlüsseln / Entschlüsseln“ klicken, fertig — das Ergebnis erscheint im Feld darunter. In der Tabelle wählt ihr für jede der drei Walzenpositionen eine Walze aus (dieselbe Walze kann nur einmal stecken), daneben ihre Walzenlage, also den Buchstaben im Sichtfenster, und ihre Ringstellung. Unter der Tabelle liegen Griechenwalze, Umkehrwalze, die Gruppierung der Ausgabe und die Steckerverbindungen. Letztere schreibt ihr als Buchstabenpaare mit Leerzeichen dazwischen, zum Beispiel ab cd ef — dann tauschen a und b, c und d sowie e und f vor und nach dem Walzensatz ihre Plätze.

Ein Punkt, über den jeder einmal stolpert: Die Walzen drehen sich beim Verschlüsseln weiter, genau wie bei der echten Maschine. Nach dem Verschlüsseln stehen in den Feldern „Walzenlage“ deshalb andere Buchstaben als vorher. Zum Entschlüsseln müsst ihr sie erst wieder auf die Ausgangswerte zurückstellen, den Geheimtext in das Nachrichtenfeld kopieren und dann denselben Knopf drücken. Weil die Enigma eine sogenannte involutorische Maschine ist, ist Entschlüsseln derselbe Vorgang wie Verschlüsseln — bei identischer Einstellung kommt der Klartext zurück. Was nicht zurückkommt, sind Leerzeichen und Satzzeichen: Das Script entfernt Leerzeichen und ersetzt Punkt durch x, Komma durch y, Fragezeichen durch ud und Doppelpunkt durch xx, Umlaute werden zu ae, oe, ue und ß zu ss. Ähnliche Ersatzregeln gab es auch im Funkverkehr, weil die Maschine nur 26 Tasten hatte.

Die Enigma geht auf ein Patent von Arthur Scherbius aus dem Jahr 1918 zurück und wurde ab 1923 zunächst kommerziell verkauft, später vom deutschen Militär in großer Stückzahl eingesetzt. Die hier auswählbaren Bauteile spiegeln diese Geschichte: Die Walzen I bis V gehörten zur Standardausstattung, VI bis VIII kamen bei der Kriegsmarine dazu, und die dünne Griechenwalze (Beta oder Gamma) zusammen mit den dünnen Umkehrwalzen thin B und thin C gehört zur vierwalzigen Marine-Enigma M4. Jede Walze hat eine Übertragskerbe an einer bestimmten Stelle — bei Walze I beim R, bei II beim F, bei III beim W, bei IV beim K, bei V beim A; die Walzen VI bis VIII haben deren zwei, bei A und bei N. Erreicht eine Walze diesen Buchstaben, schiebt sie die nächste um eine Stelle weiter.

Gebrochen wurde die Enigma zuerst von polnischen Mathematikern um Marian Rejewski, die ab 1932 die innere Verdrahtung rekonstruierten, und ab 1939 von den Codeknackern in Bletchley Park, wo Alan Turing und Gordon Welchman die elektromechanische „Bombe“ zur Schlüsselsuche entwarfen. Geholfen hat ihnen eine bauartbedingte Schwäche, die auch in diesem Script steckt: Weil der Strom über die Umkehrwalze zurückläuft, kann ein Buchstabe nie in sich selbst verschlüsselt werden — und das schränkt die Möglichkeiten drastisch ein. Für heutige Rechner ist die Maschine ohnehin kein Hindernis mehr; ein gewöhnlicher PC probiert die Walzenstellungen in Sekunden durch. Diese Nachbildung ist also ein Anschauungsstück für ein Stück Technikgeschichte, kein Werkzeug zum Schutz von Daten.

In derselben Abteilung liegen das Vigenere Quadrat, dessen Grundidee — wechselnde Alphabete — die Enigma mechanisch weiterdenkt, das XcxxsV-Verschlüsselungsprogramm, der RC4 Algorithmus als moderneres Verfahren sowie die beiden Einsteiger-Chiffren Atbash und ROT13.

Verschlüsselungen Baujahr 2007 läuft in deinem Browser
Rotor I II III IV V VI VII VIII Walzenlage Ringstellung
Langsamer Rotor
Normaler Rotor
Schneller Rotor
Griechenwalze
Umkehrwalze
Gruppierung

Die Walzen drehen sich beim Verschlüsseln weiter. Vor dem Entschlüsseln müssen die Felder „Walzenlage“ wieder auf ihren Ausgangswert gestellt werden — sonst kommt Buchstabensalat zurück.

Eingesandt von Vollautomatisch

So funktioniert das Script

Das Script ist mit rund 200 Zeilen das umfangreichste in diesem Fach, folgt aber einem klaren Bauplan: Oben stehen die Verdrahtungen aller Walzen als feste Zeichenketten. Darunter liegen kleine Hilfsfunktionen — walzenstellung() und ringstellung() drehen eine Walze um eine Stelle, steckered() erledigt das Steckerbrett, walzenSetzen() liest die gewählte Bestückung aus dem Formular. Die Funktion enigma() setzt alles zusammen und schickt jeden Buchstaben durch die Maschine. Ganz unten werden die Auswahllisten mit ihren 26 Einträgen gefüllt und die Bedienelemente verdrahtet.

const alphabet = "abcdefghijklmnopqrstuvwxyz";
const I    = "ekmflgdqvzntowyhxuspaibrcj";
const II   = "ajdksiruxblhwtmcqgznpyfvoe";
const B    = "yruhqsldpxngokmiebfzcwvjat";

So wird eine Walze im Programm dargestellt: als einmal durchgemischtes Alphabet. Man liest sie wie eine Übersetzungstabelle — an erster Stelle von Walze I steht ein e, also wird aus einem a ein e; an zweiter Stelle steht k, aus b wird also k. Das sind die historischen Verdrahtungen der echten Walzen, weshalb dieses Script dieselben Geheimtexte erzeugt wie das Original. B ist eine Umkehrwalze; bei ihr fällt auf, dass die Zuordnung paarweise ist: Aus a wird y, und aus y wird wieder a.

for (let k = 0; k < alphabet.length; k++) { verschiebung[k] = alphabet.indexOf(walze.charAt(k)) - k; }
cut = verschiebung[0];
verschiebung.shift();
verschiebung[alphabet.length - 1] = cut;

Das ist walzenstellung(), der Dreh der Walze um eine Position. Zuerst rechnet die Schleife die Walze in eine Liste von Verschiebungen um: nicht mehr „an Position 0 steht ein e“, sondern „an Position 0 wird um 4 Stellen weitergezählt“. Dann nimmt shift() die erste Verschiebung heraus und hängt sie hinten wieder an — die ganze Walze ist eine Stelle weitergerückt. Aus den Verschiebungen wird anschließend wieder eine Buchstabenkette. ringstellung() daneben macht dasselbe in die andere Richtung und bildet damit den Ring nach, mit dem sich bei der echten Maschine der Buchstabenkranz gegen die Verdrahtung verdrehen ließ.

const position = stecker.lastIndexOf(buchstabe);
if ((position === 0) || (stecker.charAt(position - 1) === " ")) { return stecker.charAt(position + 1); }
return stecker.charAt(position - 1);

Das Steckerbrett in drei Zeilen. Die Eingabe ab cd wird gar nicht erst in eine Tabelle umgebaut — das Script sucht den Buchstaben einfach in der Zeichenkette. Steht er ganz vorn oder direkt hinter einem Leerzeichen, ist er der erste Partner eines Paares, und der gesuchte Tauschpartner ist das Zeichen dahinter. Sonst ist er der zweite Partner und der Partner steht davor. Kommt der Buchstabe überhaupt nicht vor, gibt die Funktion ihn unverändert zurück — dann ist er eben nicht gesteckert.

const letter = steckered(message.charAt(i));
const nachWalze3 = w3.charAt(alphabet.indexOf(letter));
const nachWalze2 = w2.charAt(alphabet.indexOf(nachWalze3));
const nachWalze1 = w1.charAt(alphabet.indexOf(nachWalze2));
const nachUWalze = uW.charAt(alphabet.indexOf(nachGriechenWalze));
const nachWalze1R = alphabet.charAt(w1.indexOf(nachGriechenWalzeR));

Hier läuft der Strom durch die Maschine, und man kann seinen Weg Zeile für Zeile mitlesen: erst durchs Steckerbrett, dann durch die schnelle, die mittlere und die langsame Walze, gegebenenfalls durch die Griechenwalze, dann in die Umkehrwalze. Von dort geht es denselben Weg zurück — daran erkennbar, dass charAt und indexOf die Rollen tauschen: Auf dem Hinweg wird die Walze als Tabelle vorwärts gelesen, auf dem Rückweg rückwärts. Zum Schluss geht es noch einmal übers Steckerbrett. Genau diese Umkehr macht die Maschine zu ihrer eigenen Gegenmaschine — und sorgt zugleich dafür, dass nie ein Buchstabe auf sich selbst abgebildet wird, denn der Rückweg kann nicht auf demselben Kontakt enden, auf dem er losgelaufen ist.

w3 = walzenstellung(w3);
felder.walzenlage3.value = alphabet.charAt((alphabet.indexOf(felder.walzenlage3.value) + 1) % alphabet.length);

if (turnoverIII.indexOf(felder.walzenlage3.value) >= 0) {
  w2 = walzenstellung(w2);
  ...
}

Das Weiterdrehen, und zwar vor jedem einzelnen Buchstaben. Die schnelle Walze rückt immer eine Stelle vor, und das Auswahlfeld darüber wird gleich mitgezählt — deshalb dreht sich die Anzeige auf dem Bildschirm sichtbar mit. turnoverIII enthält den Übertragsbuchstaben der gewählten Walze; steht sie auf ihm, rückt auch die mittlere Walze weiter, und in derselben Art kann diese die langsame mitnehmen. Das ist dasselbe Prinzip wie beim Kilometerzähler im Auto — nur dass hier jede Walze ihren Übertrag an einer anderen Stelle hat.

for (let i = 0; i < message.length; i++) {
  ausgabe += message.charAt(i);
  if (((i + 1) % faktor === 0) && (i !== (message.length - 1))) { ausgabe += " "; }
}

Zum Schluss die Gruppierung: Der fertige Geheimtext wird alle faktor Zeichen durch ein Leerzeichen unterbrochen, wobei faktor aus den Schaltern 3er bis 6er kommt. Die zweite Bedingung verhindert ein überflüssiges Leerzeichen am Ende. Funksprüche wurden früher in solchen Gruppen übermittelt, weil sich beim Morsen so leichter zählen und übertragen ließ.

Zum Anpassen: Die Vorbelegung der Nachricht, die Beschriftungen und die vorausgewählten Walzen stehen im HTML und dürfen frei geändert werden. Auch die Ersetzungsregeln für Satzzeichen ganz oben in enigma() lassen sich gefahrlos erweitern. Die Walzen-Zeichenketten dagegen sind historische Verdrahtungen — wer daran dreht, baut eine Maschine, die es nie gab, und deren Ergebnisse zu keiner anderen Enigma-Nachbildung mehr passen.

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.

Mehr aus der Kategorie Verschlüsselungen