Beim Substitutionsverfahren wird jedem Buchstaben im Alphabet ein anderer Buchstabe eindeutig zugeordnet. Das Geheimalphabet ist jedoch weitgehend nicht alphabetisch sortiert. Im folgenden Beispiel verwenden wir den Satz ``INFORMATIK IST SCHOEN UND LEHRER LUEGEN NICHT'' - nach dem Streichen von wiederholt vorkommenden Buchstaben erhalten wir die folgende Substitutionstabelle. Um zu vermeiden, dass am Ende des Alphabets manche Buchstaben auf sich selbst abgebildet werden, setzen wir (willkürlich) an die erste Stelle der Ersetzungsalphabets den Buchstaben ``Z'':
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
Z | I | N | F | O | R | M | A | T | K | S | C | H | U | D | L | E | G | B | J | P | Q | V | W | X | Y |
Das folgende Programm (substitution1.java) verwendet das in der obigen Tabelle angegebene Schlüsselwort: Zunächst werden alle Buchstaben des Schlüsselwortes und der Eingabe in Großbuchstaben umgewandelt. In der Methode verschluessle() wird jeder Byte-Eintrag in der Botschaft durch den entsprechenden Byte-Eintrag des Schlüsselfeldes ersetzt. Da die Indizes des Schlüsselfeldes mit der Zählung ``0'' beginnen, muss von den Byte-Werten der Buchstaben des Klartextes jeweils die Zahl 65 subtrahiert werden ...
import java.io.*; public class substitution1 { static byte geheim[] = new byte[100]; 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 = "zinformatkschudlegbjpqvwxy"; schluessel = sl.getBytes(); for (int i=0;i<26;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; geheim[i]=schluessel[geheim[i]-65]; } } 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); } }
Unter der Voraussetzung, dass im Klartext kein Leerzeichen vorkommt, erhalten wir z.B. folgende Verschlüsselung:
alfred@duron:~/java/kurs> java substitution1 INFORMATIKSCHULARBEIT TURDGHZJTSBNAPCZGIOTJ
Auch die Substitutionschiffre kann mit Hilfe von statistischen Analysen des Geheimtextes rasch entschlüsselt werden: Kennt man beispielsweise die Häufigkeit der Buchstaben im Klartext, so kann aus der Häufigkeit der Geheimbuchstaben sehr rasch eine Zuordnung der Buchstaben des Klartextes zu den Buchstaben des Geheimtextes finden.