Die Caesar-Chiffre und die Substitutionschiffre ordnen jeweils einem Buchstaben des Alphabets einen anderen zu. Sie werden monoalphabetisch genannt. Die Vigenère-Chiffre hingegen verschlüsselt gleichzeitig mehrere Buchstaben des Alphabets. Eine solche Chiffre heißt polyalphabetisch.
Wir überlegen uns die Verschlüsselung anhand eines einfachen Beispiels: Der Satz ``Informatikistschoen'' soll mit Hilfe des Schlüsselwortes ``krypto'' verschlüsselt werden:
I | N | F | O | R | M | A | T | I | K | I | S | T | S | C | H | O | E | N |
K | R | Y | P | T | O | K | R | Y | P | T | O | K | R | Y | P | T | O | K |
Im Algorithmus für die Verschlüsselung wird also für jeden Buchstaben des Klartextes ein anderer Buchstabe des Schlüsselwortes für die Verschiebung herangezogen. Damit ist zu erwarten, dass die Vigenère-Chiffre umso sicherer ist, je länger das Schlüsselwort ist.
import java.io.*; public class vigenere { static byte geheim[] = new byte[200]; static byte schluessel[] = new byte[26]; public static void main (String args[]) throws IOException{ InputStreamReader datenstrom = new InputStreamReader(System.in); BufferedReader dateneingabe = new BufferedReader(datenstrom); String sl = args[0]; schluessel = sl.getBytes(); for (int i=0;i<sl.length();i++) if (schluessel[i]>=90) schluessel[i]-=32; String s = dateneingabe.readLine(); verschluessle(s); ausgabe(); } public static void verschluessle (String s) { geheim = s.getBytes(); for (int i=0; i < geheim.length; i++) { if (geheim[i]>=90) geheim[i]-=32; int k = i % schluessel.length; geheim[i]+= (byte) (schluessel[k]-65); if (geheim[i] > 90) geheim[i]-=26; } } public static void ausgabe () { String s=""; for (int i=0;i<geheim.length;i++) { char interim = (char) geheim[i]; s+= interim; } System.out.println("\n" + s); } }
Beachte die Verwendung der Restklassen-Arithmetik für die Berechnung der aktuellen Position im Schlüsselwort - int k = i % schluessel.length;
. Wir wenden die Verschlüsselung mit dem Schlüsselwort ``krypto'' auf einen bestimmten Klartext (ohne Leerzeichen und Sonderzeichen) an:
alfred@duron:~/java/kurs/krypto> java vigenere krypto diesisteintestundinformatikistschoensagteininformatiklehrerdennlehrerluegennichtsagtderlehrer NZCHBGDVGCMSCKSCWWXWMGFODZIXLHCTFDXBCREIXWXZLUHFWRRXDZOYPTKROELAXVBVPANSQVLCBQRKQPZHNVPAXVBVP