Vigenère-Verschlüsselung

Erklärung

Die Vigenère-Verschlüsselung ist ein Verschlüsselungsverfahren, dass im 16. Jahrhundert aufkam. Es ist ähnlich zur Caesar-Verschlüsselung, arbeitet jedoch mit mehreren Caesar-Alphabeten, sodass es zur Gruppe der polyalphabetischen Substitutionsverfahren zählt.

Statt wie bei der Caesar-Verschlüsselung nur einen Buchstaben bzw. eine Zahl als Schlüssel anzugeben, verwendet man bei der Vigenère-Verschlüsselung mehrere Buchstaben. Als Beispiel nehmen wir hier "test". Der Schlüssel wird nun über die zu verschlüsselnde Nachricht, hier "guten morgen", geschrieben. Der Schlüssel wird dabei so oft wie nötig wiederholt.

testt esttes
guten morgen

Jeder Buchstabe wird nun mit der Caesar-Verschlüsselung verschlüsselt. Der Caesar-Schlüssel für einen Buchstaben ist dabei der darüber stehende Buchstabe. Das g wird mit dem Schlüssel t (entspricht dem Schlüssel 19) bei Caesar zum z. Das u mit dem Schlüssel e (entspricht dem Schlüssel 4) zum y.

testt esttes
guten morgen
↓↓↓↓↓ ↓↓↓↓↓↓
zylxg qgkzif

Statt immer den Umweg über die Caesar-Verschlüsselung zu gehen, kann man auch das sogenannte Vigenère-Quadrat nutzen. In diesem sind alle Caesar-Alphabete untereinander notiert:

  | abcdefghijklmnopqrstuvwxyz
------------------------------
a | abcdefghijklmnopqrstuvwxyz
b | bcdefghijklmnopqrstuvwxyza
c | cdefghijklmnopqrstuvwxyzab
d | defghijklmnopqrstuvwxyzabc
e | efghijklmnopqrstuvwxyzabcd
f | fghijklmnopqrstuvwxyzabcde
g | ghijklmnopqrstuvwxyzabcdef
h | hijklmnopqrstuvwxyzabcdefg
i | ijklmnopqrstuvwxyzabcdefgh
j | jklmnopqrstuvwxyzabcdefghi
k | klmnopqrstuvwxyzabcdefghij
l | lmnopqrstuvwxyzabcdefghijk
m | mnopqrstuvwxyzabcdefghijkl
n | nopqrstuvwxyzabcdefghijklm
o | opqrstuvwxyzabcdefghijklmn
p | pqrstuvwxyzabcdefghijklmno
q | qrstuvwxyzabcdefghijklmnop
r | rstuvwxyzabcdefghijklmnopq
s | stuvwxyzabcdefghijklmnopqr
t | tuvwxyzabcdefghijklmnopqrs
u | uvwxyzabcdefghijklmnopqrst
v | vwxyzabcdefghijklmnopqrstu
w | wxyzabcdefghijklmnopqrstuv
x | xyzabcdefghijklmnopqrstuvw
y | yzabcdefghijklmnopqrstuvwx
z | zabcdefghijklmnopqrstuvwxy

  | abcdefghijklmnopqrstuvwxyz
------------------------------
a | abcdefghijklmnopqrstuvwxyz
b | bcdefghijklmnopqrstuvwxyza
c | cdefghijklmnopqrstuvwxyzab
d | defghijklmnopqrstuvwxyzabc
e | efghijklmnopqrstuvwxyzabcd
f | fghijklmnopqrstuvwxyzabcde
g | ghijklmnopqrstuvwxyzabcdef
| …………………………………………………………………

Um vom Klartext zum Geheimtext zu kommen, geht man wieder buchstabenweise vor. Man sucht die Zelle des Vigenère-Quadrats, an der sich die mit dem Klartextbuchstaben beschriftete Spalte, und die mit dem Schlüsselbuchstaben beschriftete Zeile kreuzen. Da das Vigenère-Quadrat symmetrisch ist, kann auch in der Spalte der Schlüsselbuchstabe und in der Zeile der Klartextbuchstabe gesucht werden.

Als Beispiel sucht man die Zeile, die mit g beschriftet ist, und die Spalte, die mit t beschriftet ist, und kommt zum z:

  | abcdefghijklmnopqrstuvwxyz
------------------------------
… | …………………………………………………………………
f | fghijklmnopqrstuvwxyzabcde
g | ghijklmnopqrstuvwxyzabcdef
h | hijklmnopqrstuvwxyzabcdefg
… | …………………………………………………………………

Beim Entschlüsseln muss man entsprechend umgekehrt vorgehen und in der Spalte, die mit t beschriftet ist, die Zelle mit z suchen. Um zum Klartext zu gelangen, muss man nun nur noch die Zeilenbeschriftung ablesen.

Testen

Wenn du dich nicht nur auf Kleinbuchstaben begrenzen möchtest, kannst du hier ein eigenes Klartextalphabet eingeben.

Die besten Schlüssel bestehen aus zufälligen Buchstabenkombinationen.

Eingabe
Ausgabe

Code

Wie immer erstellen wir ein Objekt, das alle Funktionen bündeln soll. In diesem Fall nennen wir es Vigenere.

Wir benötigen für dieses Verschlüsselungsverfahren eine Funktion, die überprüft, ob der übergebene Schlüssel ein legaler Schlüssel ist, eine Funktion, die verschlüsselt, und eine, die entschlüsselt.

Schauen wir uns zuerst die erste Funktion näher an. Sie erhält als Parameter den Schlüssel und das Alphabet.

Die Funktion soll einen übergebenen Schlüssel korrigieren, und den neuen Schlüssel zurückgeben. Diesen neuen Schlüssel halten wir in der Varaiable newKey fest, die zu Anfang der Funktion noch leer ist, und am Ende zurückgegeben werden soll.

Für jeden Buchstaben des Schlüssels wird überprüft, ob er Teil des Alphabets ist. Ist er dies, wird er newKey angehängt, ansonsten wird er einfach ignoriert. So kann der Schlüssel korrigiert werden.

Weiter zur Funktion zum Verschlüsseln. Sie erhält die zu verschlüsselnde Nachricht, den Schlüssel, ein Alphabet, das als Standard das lateinische Alphabet ist, und einen Wahrheitswert, was mit Klartextbuchstaben passieren soll, die nicht im Alphabet aufgeführt werden.

Zunächst wird der Schlüssel, wenn nötig, korrigiert.

Dann erstellen wir eine Variable, die den Geheimtext speichern soll. Am Ende der Funktion wird sie entsprechend ausgegeben.

Wir iterieren nun über jeden Buchstaben des Klartexts.

Ist der Buchstabe ein Leerzeichen, so hängen wir dieses an die Variable output an, und gehen zum nächsten Buchstaben über.

Andernfalls schauen wir, an welcher Stelle im Alphabet der betrachtete Buchstabe vorkommt. Kommt er gar nicht vor, fügen wir ihn abhängig vom Parameter skip als Klartext an, oder überspringen ihn, und gehen zum nächsten Buchstaben.

Ist der betrachtete Buchstabe aber kein Leerzeichen, und im Alphabet vorhanden, so berechnen wir den aktuellen Schlüssel. Dieser ist natürlich abhängig davon, welcher Schlüsselbuchstabe sozusagen über dem betrachteten Buchstaben steht.

Um festzustellen, welcher Schlüsselbuchstabe momentan der richtige ist, wird in einer Variablen der Index des aktuellen Schlüsselbuchstabens festgehalten. Diese wird vor der Schleife auf 0 initialisiert.

Und nach jedem erfolgreich verschlüsselten Buchstaben um 1 erhöht.

Ansonsten wird ähnlich wie bei Caesar die neue Stelle im Alphabet berechnet.

Und abschließend dem output angefügt.

Weiter zur Methode zum Entschlüsseln. Sie erhält die gleichen Parameter wie die Methode zum Verschlüsseln

Und macht auch im Grunde auch das gleiche. Sie iteriert über jeden Buchstaben, fängt Sonderfälle wie Leerzeichen ab, merkt sich den aktuellen Schlüsselbuchstaben, und verschlüsselt die Buchstaben nacheinander.

Der Unterschied bei dieser Methode ist die Richtung des Verschiebens, und wie die Stelle des neuen Buchstabens innerhalb des Alphabets gehalten wird.

Das wars! 🎉

Weiterlesen