JavaScripts › Verschlüsselungen
Der RC4 Algorithmus
Verschlüsselt einen Text mit dem Stromchiffre RC4 — sichtbar in allen Zwischenschritten, von den Zeichen-Bytes bis zur fertigen Zahlenfolge.
RC4 ist eine sogenannte Stromchiffre: Aus einem Schlüssel erzeugt das Verfahren eine lange, scheinbar zufällige Folge von Zahlen — den Schlüsselstrom — und verrechnet diese Zahlen einzeln mit den Zeichen des Textes. Dieses Script macht genau das im Browser und zeigt dabei jeden Zwischenschritt an. Eingeschickt wurde es seinerzeit von unserem User Vollautomatisch; im Kopf des Codes nennt sich Marius Schulz als Autor, und dieser Kommentarblock soll laut seiner Bedingung im Script erhalten bleiben.
Die Bedienung folgt den Feldern von oben nach unten: Ihr tragt links den Text und rechts den Schlüssel ein und wandelt beides mit den zwei Knöpfen darunter in Zahlenfolgen um — jedes Zeichen wird zu seiner Nummer in der Zeichentabelle. Ein Klick auf „Verschlüsseln / Entschlüsseln“ rechnet daraus die Zahlenfolge des Geheimtextes. Der letzte Knopf macht aus einer Zahlenfolge wieder lesbaren Text. Die beiden Umwandlungsknöpfe könnt ihr auch überspringen: Sind die Byte-Felder leer, füllt das Script sie beim Verschlüsseln selbst.
Zum Entschlüsseln geht ihr denselben Weg rückwärts: Die Zahlenfolge des Geheimtextes kommt in das Feld „Bytes des Textes“, derselbe Schlüssel in das Schlüsselfeld, dann wieder auf „Verschlüsseln / Entschlüsseln“ und zum Schluss auf „Bytes in Klartext umwandeln“. Dass Ver- und Entschlüsseln derselbe Knopf sind, liegt an der Rechenart: Text und Schlüsselstrom werden mit dem XOR-Operator verknüpft, und XOR hebt sich beim zweiten Mal selbst wieder auf.
RC4 wurde 1987 von Ronald L. Rivest bei RSA Security entworfen und zunächst geheim gehalten; 1994 tauchte eine Beschreibung des Verfahrens öffentlich auf. Wegen seiner Kürze und Geschwindigkeit steckte es jahrelang in WLAN-Verschlüsselung (WEP) und in SSL/TLS. Heute gilt RC4 als gebrochen: Der Schlüsselstrom ist statistisch nicht gleichmäßig genug, und aus diesen Verzerrungen lassen sich Klartexte rekonstruieren. Seit RFC 7465 aus dem Jahr 2015 ist RC4 in TLS ausdrücklich verboten. Nehmt dieses Script also zum Verstehen und Ausprobieren, nicht zum Schutz echter Geheimnisse — für die gibt es geprüfte Verfahren wie AES.
Wer weitere historische Verfahren nachbauen möchte: Die Enigma bildet die Walzenmaschine des Zweiten Weltkriegs nach, das Vigenere Quadrat zeigt die klassische polyalphabetische Substitution, und Atbash sowie die ROT13 Verschlüsselung sind die beiden einfachsten Vertreter überhaupt.
Die Byte-Felder werden nur dann automatisch gefüllt, wenn sie leer sind. Ändert ihr Text oder Schlüssel nachträglich, leert die beiden Felder oder klickt die Umwandlungsknöpfe erneut.
So funktioniert das Script
Das Script besteht aus drei Funktionen: prepareValue() rechnet zwischen Text und Zahlenfolge hin und her, RC4() enthält den eigentlichen Algorithmus, und encrypt() holt die Werte aus dem Formular, ruft RC4() auf und schreibt das Ergebnis zurück. Ganz unten werden die vier Knöpfe mit diesen Funktionen verbunden. Alles steckt in einer sofort ausgeführten Funktion, damit die Namen nicht mit anderen Scripts der Seite kollidieren.
const felder = document.getElementById("rc4-form").elements;
Eine Zeile, die im ganzen Script Arbeit spart: elements ist die Sammlung aller Formularfelder. Über den name aus dem HTML kommt man direkt an ein Feld heran — felder.bytesKey.value ist also der Inhalt des Textfeldes mit name="bytesKey". Das alte Script benutzte dafür noch die Schreibweise document.RC4Form.bytesKey, die zwar in Browsern immer noch funktioniert, aber seit langem verpönt ist.
const bytes = [];
for (let i = 0; i < value.length; i++) {
bytes[i] = value.charCodeAt(i);
}
Das ist der Kern von prepareValue() in der Richtung „Text zu Zahlen“. charCodeAt(i) liefert die Nummer, unter der das Zeichen an Position i in der Zeichentabelle steht: Ein großes A ist die 65, ein kleines a die 97, ein Leerzeichen die 32. Mit bytes.join(" ") werden die Zahlen anschließend durch Leerzeichen getrennt in das Ausgabefeld geschrieben. Die Gegenrichtung macht String.fromCharCode() — dieselbe Tabelle, nur andersherum gelesen.
let j = 0;
for (let i = 0; i < 256; i++) {
j = (j + S[i] + parseInt(key[i % key.length], 10)) % 256;
const tmp = S[i];
S[i] = S[j];
S[j] = tmp;
}
Hier beginnt RC4. Vorher wurde ein Feld S mit den Zahlen 0 bis 255 in der richtigen Reihenfolge gefüllt. Diese Schleife mischt es nun durch: Für jede Position i wird eine zweite Position j aus dem Schlüssel berechnet, und die beiden Einträge tauschen ihre Plätze — genau dafür ist die Hilfsvariable tmp da, sonst würde man beim Tauschen einen der beiden Werte überschreiben. Der Ausdruck key[i % key.length] läuft dabei immer wieder von vorn durch den Schlüssel, wenn dieser kürzer als 256 Zeichen ist. Am Ende steht in S eine Reihenfolge der Zahlen 0 bis 255, die vollständig vom Schlüssel abhängt. Dieser Schritt heißt in der Fachsprache Schlüsselaufbereitung (englisch key scheduling).
i = (i + 1) % 256;
j = (j + S[i]) % 256;
const tmp = S[i];
S[i] = S[j];
S[j] = tmp;
const rnd = S[(S[i] + S[j]) % 256];
cryptedText[x] = (rnd ^ text[x]);
Das ist der Schlüsselstrom, der eigentliche Trick von RC4. Für jedes Zeichen des Textes rücken die beiden Zeiger i und j weiter, wieder werden zwei Einträge in S getauscht, und aus der Summe der beiden getauschten Werte wird eine dritte Position gelesen. Der dort stehende Wert rnd ist die Zufallszahl für dieses eine Zeichen. Das Zeichen mit ^ zu verknüpfen bedeutet: XOR, also bitweises „entweder oder“. Diese Rechnung ist ihre eigene Umkehrung — verknüpft man das Ergebnis noch einmal mit derselben Zahl, kommt der Ausgangswert zurück. Deshalb sind Ver- und Entschlüsseln hier ein und dieselbe Funktion.
Das % 256 ist der Rest bei der Division durch 256. Es sorgt dafür, dass alle Zeiger im Feld bleiben: Aus 256 wird wieder 0, aus 257 wird 1. Man kann sich das wie ein Zifferblatt mit 256 Stunden vorstellen.
if (felder.bytesText.value === "" || felder.bytesKey.value === "") {
prepareValue(felder.text.value, true, true);
prepareValue(felder.key.value, false, true);
}
Diese Bequemlichkeit steckt in encrypt(): Sind die Byte-Felder leer, werden sie aus Text und Schlüssel selbst gefüllt. Die beiden Wahrheitswerte hinter dem Wert steuern, was prepareValue() tun soll — der zweite entscheidet zwischen Text- und Schlüsselfeld, der dritte zwischen den beiden Richtungen „Text zu Zahlen“ und „Zahlen zu Text“.
Zum Anpassen: Die Beschriftungen und die Vorbelegung der Felder stehen im HTML und können frei geändert werden. An der Rechnung selbst sollte man dagegen nichts drehen — jede Änderung an RC4() ergibt ein anderes Verfahren, das mit keinem anderen RC4-Programm mehr zusammenpasst. Wer den Algorithmus beobachten will, baut sich lieber eine Ausgabe ein, die den Inhalt von S nach der Schlüsselaufbereitung anzeigt.
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.