Polyalphabetische Verfahren
Polyalphabetische Verfahren arbeiten immernoch anhand von modifizierten Alphabeten, nutzen jedoch mehrere Alphabete bei der selben Verschlüsselung, wohingegen das Caesar Verfahren durchgehend das selbe Alphabet nutzt.Das Vigenere Verfahren ist ein Verfahren, dass von Blaise de Vigénere erfunden worde. Es ähnelt dem Caesar-Verfahren in gewisser Hinsicht, dennoch wird für jeden Buchstaben ein eigenes Caesar-Verfahren genutzt, um es so auszudrücken. Statt die eingangs gewählte Zahl, bei der Caesar zumeist die 3 nutzte, als Verschiebung für alle Buchstaben zu wählen, wird bei diesem Verfahren für jeden Buchstaben eine andere Verschiebung des Alphabetes gewählt, um eine Vielfalt und Komplexität einzubringen, von der damals gedacht wurde, sie sei unentschlüsselbar.
Um diese immer unterschiedlichen Verschiebungen beim Namen nennen zu können, muss der Begriff des Schlüssels fallen.
Ein Schlüssel ist ein Codewort, ohne dass ein verschlüsselter Text im Optimalfall nicht zu verstehen ist, selbst bei Kenntnis des Algorithmus (siehe: Kerkhoffs Maxime).
Gegeben sei "bashimon" als Schlüssel, der zu verschlüsselnde Text sei "bashimon".
Der erste Buchstabe des Textes ist somit das "b".
Jetzt wird das "b" mit dem Buchstaben ersetzt, der bei einem Alphabet, das mit dem ersten Buchstaben des Schlüsselswortes "bashimon" beginnt (also wieder "b"), an der Stelle des "b"s im normalen Alphabet ist. Dies ist "c".
Die endültige Verschlüsselung wäre "cakoqyca".
Implementiert sieht das Ganze wie folgt aus:
(define (vigenere satz key)
(cond
((null? satz) ‘())
(else (cons (integer->char(+ 97 (modulo (+ (char->integer(first satz)) (modulo (char->integer(first key)) 97))26))) (vigenere (rest satz)(rest key)))))) (define (start satz key)
(list->string(vigenere (string->list satz) (keycheck satz (string->list key)))))
(define (keycheck satz key)
(cond
((>= (length key) (length (string->list satz))) key)
(else (keycheck satz (append schlüssel key)))))
Eine kleine Erklärung:
Zunächst wird unsere Startfunktion aufgeteilt in eine Schlüssel-Funktion und eine Vigenere-Funktion.
Die Schlüssel Funktion "keycheck" überprüft, ob die Länge des Schlüssels der Länge des Textes gerecht wird, oder ob dieser irgendwann zu kurz wäre.
Er fügt den Schlüssel in diesem Fall einer Kopie seiner selbst hinzu, bis die Länge mind. genauso groß ist, wie die des Textes.
Die Vigenere Funktion gliedert sich in folgende Unterfunktionen:
1. Der String wurde bereits als Liste erhalten, sodass dieser Schritt nicht mehr nötig ist.
2. Die einzelnen char's des Schlüssels werden in integer umgewandelt. Dabei wird nach ASCII aus den Zahlen der Buchstaben, der Buchstabe des Schlüssels in eine Zahl umgewandelt.
3. Der aktuellen Zahl des Schlüssels, mit der gearbeitet wird, werden 97 abgezogen (aufgrund der ASCII-Tabelle ein notwendiger Schritt, um das Alphabet in die uns bekannte Zahlenfolge a = 0, b = 1 usw. zu wandeln)
4. Dem wird die Verschiebung die gerade zum Schlüssel passt hinzuaddiert
5. Auf dies wird wiederrum modulo 26 angewendet, sodass wir herausfinden, welcher Buchstabe für die Substitution "herhält"
6. Dem widerrum wird 97 hinzuaddiert, um zurück zur ASCII-Tabelle zu kommen, womit das Programm später substituiert
7. Die Substitution findet statt, und die Schritte wiederholen sich, bis die ursprüngliche Liste leer ist.
Ein kleiner Nachtrag: Alle bis hierhin erwähnte Verfahren sind symmetrische Kryptosysteme, da wir davon ausgehen, dass beide Seiten (Verschlüssler und Entschlüssler) den selben Schlüssel benötigen.
Asymmetrisch wäre dies, wenn es einen privaten Schlüssel gäbe, den nur der "Erfinder" kennt, und einen öffentlichen Schlüssel, mit dem jeder verschlüsseln kann. Nur der mit dem privaten Schlüssel kann entschlüsseln.