33.9 One-Time-Pad (Implementierung)
 
Was ist One- Time-Pad? Im Prinzip ist eine Verschlüsselung mit One-Time-Pad nichts anderes als eine Verschlüsselung nach Vigenère mit dem entscheidenden Einschränkung, der Schlüssel hat die gleiche Länge wie der Originaltext und sollte zufällig gewählte Zeichen enthalten.
 

In der Praxis ist die Addition von zwei Zeichen mod 26 recht unpraktisch. Stattdessen benutzt man auf der "Bitebene" (wenn also alle Zeichen als Folge von 0en und 1en aufgelöst sind) mit dem Schlüsselwort, ebenfalls eine Folge von 0en und 1en eine XOR-Verknüpfung statt. Dabei gilt die Vorschrift
ci=mi XOR ki (vgl. dazu die Hausaufgaben)

XOR ist die entweder oder Operation, d.h. a XOR b ist genau dann wahr, wenn a wahr und b falsch oder wenn a falsch und b wahr sind.
 

Beispiel Wir schreiben ein Java-Programm, das eine One-Time-Pad Verschlüsselung mittels XOR realisiert.
Dabei sollen zwei maximal 100 Zeichen umfassende Strings, die nur aus 0en und 1en bestehen, eingelesen werden (Klartext und Schlüssel, beide gleich groß)). Als Ergebnis soll der verschlüsselte String ausgegeben werden.
 
  XOR läßt sich mit dem ^-Operator in Java realisieren. Wir schreiben im Moment keine Verschlüsselungsmethode für die Klasse Krypt.java, da wir die Struktur der bisherigen Methoden noch nicht einhalten können. Wir verweisen hier auf das nachfolgende Projekt.
   
Download:
XOROneTime
Pad. java
import info1.*;
public class XOROneTimePad{

  public static void main(String[] args){
      String klarTextS,schluesselS;
      String geheimTextS="";
      //klarTextS, schluesselS und geheimTextS sind Strings -
      //gearbeitet wird aber mit Boolschen 'Buchstaben')
      boolean[] klarText = new boolean[10];
      boolean[] schluessel = new boolean[10];
      boolean[] geheimText = new boolean[10];

      //Klartext einlesen
      System.out.print("Eingabe Klartext  : ");
      klarTextS=Console.in.readWord();
      //Schlüssel einlesen
      System.out.print("Eingabe Schluessel: ");
      schluesselS=Console.in.readWord();

      //Folge aus Nullen und Einsen in Bool-Arrays einlesen
      for(int n=0;n<10;n++){
         klarText[n] = klarTextS.charAt(n)=='1'?true:false;
         schluessel[n] = schluesselS.charAt(n)=='1'?true:false;
      }

      for(int n=0;n<10;n++){
        geheimText[n]=(klarText[n]^schluessel[n]);
        geheimTextS=geheimTextS+(char)(geheimText[n]?'1':'0');
      }
      System.out.println("Geheimtext        : "+geheimTextS);
  }
}

Eingabe Klartext : 1001111101
Eingabe Schluessel: 1010101011
Geheimtext : 0011010110

 

   
Sind AND oder OR Alternativen Man könnte auf die Idee kommen ob man nicht auch mit AND- oder einer OR-Verknüpfung auch verschlüsseln könne. Die Antwort muss nein heißen. Die Verschlüsselung ist nicht bijektiv und demnach lässt sich ein z.B. mit AND verschlüsselter Text nicht mehr entschlüsseln. So wird der Klartextbuchstabe 0 mit dem Schlüsselbuchstabe 0 ebenso zu 0 verschlüsselt, wie der Klartextbuchstabe 1. Es sind also nicht mehr alle Forderungen Shannons an einen Verschlüsselungsalgorithmus einhalten.

 

Interessante Links Applets zu diversen Verschlüsselungsverfahren:
http://members.magnet.at/wilhelm.m.plotz/Bin/CipherClerk.html

Enigma - Applet:
http://homepages.tesco.net/~andycarlson/enigma/enigma_j.html

Bletchlex-Park
(1)
http://www.bletchleypark.org.uk/
(2) http://www.codesandciphers.org.uk/

 

zu 33.10 Übungen
zur Startseite www.pohlig.de  (C) MPohlig 2004