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