25 One Time Pad
25.1 Verschlüsseln mit XOR
 
  Auf der untersten Ebene eines Rechners bestehen Daten, seien es Befehle oder Werte, immer aus einer Folge von 0-en und 1-en. Erst eine Interpretation macht daraus eine Anweisung, eine Ganzzahl, einen String etc.  Die 0 und die 1 kann man aber auch als die boolschen Werte wahr bzw. falsch interpretieren, auf die man die von der Boolschen Algebra bekannten logischen Operationen anwenden kann. Eine solche logische Operation die zwei boolsche Werte zu einem neuen boolschen Wert verknüpft ist die Operation XOR. Es handelt es sich um das 'ausschließliche oder'. Wir wollen uns nun anschauen, wie wir mit XOR verschlüsseln können. 
 

 

Definiert wird eine logische Operation wie XOR über eine Tabelle.
 
Operative Definition von XOR
a b aXORb
0 0 0
0 1 1
1 0 1
1 1 0
 
Dass es 'vernünftig ist, diese Operation XOR zu nennen, wird deutlich, wenn man die 1 als wahr und die 0 als falsch interpretiert. So wird aXORb genau dann wahr, wenn entweder a oder b wahr falsch sind.
 
  Wie sieht nun eine Verschlüsselung mit dieser logischen Operation aus? Wir nehmen eine Folge von 0en und 1en, sie stellen den Originaltext dar. Etwa die 8 Zeichen:

01010101

Als Schlüssel wählen wir eine gleichgroße Folge von 0en und 1en, etwa

11001100

Den Geheimtext erhalten wir wenn wir die Vorschrift ci=mi XOR ki anwenden. wobei mi das i-te Zeichen im Originaltext und ki das i-te Zeichen im Schlüssel sind. Sie liefern über XOR mit einander verknüpft das , ci, das i-te Zeichen des Geheimtextes. In unserem Beispiel bekommen wir den Geheimtext

10011001

Interessant ist, dass beim Verschlüsseln des so erhaltenen Geheimtextes mit der gleichen Methode und dem gleichen Schlüssel man wieder den Originaltext bekommt.  Als Übung weise man dies für unser Beispiel nach.
 

  Wir stellen ein kleines Programm dar, das die Eingaben zweier Folge von 1en und 0en für den Originaltext und für den Schlüssel erwartet. Aus den Eingaben werden Felder von false-Werten (falsch in Java) und true-Werten (wahr in Java) erzeugt. Aus den beiden Feldern wird der Geheimtext als Feld von false- und true-Werten nach dem oben beschrieben Algorithmus erzeugt. Diese Feld wird dann in eine Folge von 0en und 1en konvertiert, ausgegeben. Bei der Eingabe des Schlüssel ist darauf zu achten, dass seine Länge mindestens so groß ist, wie die Länge des Originaltextes.
 
Download:
XOR.java
import info1.*;
public class XOR {

  public static void main (String[] args) {
    System.out.print("Originaltext: ");
    String originalText = Console.in.readWord();
    String schluesselText;
    String geheimText = "";
    do{
       System.out.print("Schluessel:   ");
       schluesselText = Console.in.readWord();
    } while(schluesselText.length()<originalText.length());
    
    int feldLaenge = originalText.length();
    
    boolean[] original = new boolean[feldLaenge];
    boolean[] schluessel  = new boolean[feldLaenge];
    boolean[] geheim = new boolean[feldLaenge];
    
    for(int i = 0; i < feldLaenge; i++){
      if (originalText.charAt(i) == '1') {
        original[i] = true;
      }
    }
    for(int i = 0; i < feldLaenge; i++){
      if (schluesselText.charAt(i) == '1') {
        schluessel[i] = true;
      }
    }
    for (int i = 0; i < feldLaenge; i++) {
      geheim[i] = original[i]^schluessel[i];
    }
    for (int i = 0; i < feldLaenge; i++) {
       geheimText += geheim[i]?'1':'0';
    }
    System.out.println("Geheimtext:   "+geheimText);
  }
}
Bemerkung zum Quellkode Bei der Deklaration eines Feldes aus boolschen Werten, wird ohne explizite Initialisierung alle Werte auf false gesetzt, weshalb man nur die 1 an den entsprechenden Stellen als true setzen muss.

Der XOR-Operator hat in Java die Gestalt '^',
 

zu 25.2 XOR - One Time Pad
zur Startseite www.pohlig.de  (C) MPohlig 2006