Beispiele zur Kryptographie

In diesem Abschnitt sollen unsere Java-Kenntnisse für ein wichtiges Thema der Informatik, der Kryptographie, verwendet werden. Dabei beziehen wir uns zunächst auf sehr einfache Verfahren. Außerdem laufen alle Programme „auf der Konsole“ - die Verwendung einer grafischen Benutzeroberfläche wird erst in einem späteren Abschnitt („AWT - Applikationen“) behandelt.

Was ist Kryptographie?

Unter Kryptographie versteht man allgemein das Verschlüsseln von Daten. Kryptographische Verfahren wurden Jahrhunderte lange bei Kriegswesen und Diplomatie verwendet. Seit der Mitte des 20. Jahrhunderts fußt die Kryptographie auf mathematischen Erkenntnissen. Seit dem letzten Drittel des vorigen Jahrhunderts wurde die Kryptographie - bedingt durch die rasche Entwicklung der Computer und durch die neuen Möglichkeiten der Kommunikationswege - stürmisch weiter entwickelt.

Im Bereich des e-commerce spielt die Kryptographie in folgenden drei Bereichen eine entscheidende Rolle:

Einfache Chiffrier-Verfahren

Verschiebechiffre

Unter einem Verschiebechiffre verstehen wir einen Algorithmus, der die Buchstaben des Alphabets durch einen Buchstaben ersetzt, der zum Klartext-Buchstaben eine gleichbleibende Entfernung hat. Nach seinem Erfinder wird dieses Verfahren auch eine Caesar Chiffre genannt.

Im folgenden Beispiel (caesar1.java) wird eine Zeichenkette von der Tastatur eingelesen. Anschließend werden alle Buchstaben in Großbuchstaben verwandelt. Dann findet die Verschiebung um eine bestimmte (gleich bleibende) Anzahl von Buchstaben im Alphabet statt. Schließlich wird der verschlüsselte Text in eine Textdatei ausgegeben.

import java.io.*;
 
public class caesar1 {
 
    static byte geheim[] = new byte[100];
 
    public static void main (String args[]) throws IOException{
        InputStreamReader datenstrom = new InputStreamReader(System.in);
        BufferedReader dateneingabe = new BufferedReader(datenstrom);
        String s = dateneingabe.readLine();
        verschluessle(s, args[0]);
        ausgabe();
    }
 
    public static void verschluessle (String s, String a) {
        geheim = s.getBytes();
        for (int i=0;i<geheim.length;i++) {
            if (geheim[i]>90) geheim[i]-=32;
            geheim[i]+=Integer.parseInt(a);
            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);
    }
}

Im Programm wird die Zahl, um die alle Zeichen verschoben werden sollen, beim Aufruf als Befehlszeilenargument übergeben (args[0]). Der Klartext wird über die Standard-Eingabe eingegeben. Damit erhalten wir beispielsweise folgenden Programmlauf:

alfred@duron:~/java/kurs> java caesar1 3 
Informatik ist schoen

LQIRUPDWLN#LVW#VFKRHQ

Wie man sich leicht überlegen kann, ist die Verschiebechiffre sehr leicht zu knacken. Man braucht höchstens 26 Versuche, um den Chiffretext wieder in Klartext zu verwandeln:

alfred@duron:~/java/kurs> java caesar1 23
LQIRUPDWLN#LVW#VFKRHQ

INFORMATIK:IST:SCHOEN

Im Durchschnitt ist nur die halbe Anzahl von Versuchen, nämlich 13, notwendig, um die Chiffre zu entschlüsseln. Damit ist eine ernstzunehmende Verschlüsselung mit einer Verschiebechiffre unmöglich.

Substitutionschiffre

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:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ZINFORMATKSCHUDLEGBJPQVWXY

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.

Die Vigenère-Chiffre

Häufigkeitsanalysen

Buchstaben zählen ;-)

Analyse der Substitutionschiffre

Analyse der Vigenère Chiffre