25.3 Übungen
 
Aufgabe 1 Geben Sie den vom Programm XOR.java gelieferten Geheimtext als Originaltext im gleichen Programm unter Verwendung des gleichen Schlüssels wieder ein, so erhalten Sie wieder den ursprünglichen Originaltextes. Wandeln Sie das Programm XOR.java zu XOR2.java so um, dass diese Eigenschaft verdeutlicht wird. 
Beweisen Sie diese Eigenschaft. Der Beweis wird wieder einfach, wenn man dazu eine Tabelle benutzt.
 
Aufgabe 2 Der '^'-Operator von Java ist überladen; er lässt sich zusätzlich auf Ganzzahlen und somit auf char-Werte anwenden.
Welches Zeichen liefert 'A' XOR 'B'? Prüfen Sie das Ergebnis indem Sie 'per Hand' den ASCII-Kode von 'A' und 'B' binär darstellen, die XOR Operation ausführen und den so erhalten ASCII-Kode als Zeichen darstellen.
 
Aufgabe 3 Schreiben Sie für die Klasse EnCrypt eine Methode xor(...) mit der Signatur:

xor(String orinigalText, String schluessel) : String

das den übergebenen Geheimtext mittels des übergebenen Schlüssels mit xor verschlüsselt, also das i-te Zeichen des Originaltextes mit dem i-ten Zeichen des Schlüssels mit Hilfe der XOR-Operation zum i-ten Zeichen des Geheimtextes macht und den gesamten Geheimtext als String zurückgibt.  
 

Aufgabe 4 Schreiben Sie die Methode xor (...) für die Klasse DeKrypt.
 
Aufgabe 5 Schreiben Sie für die Klassen EnCrypt und DeCrypt die Methoden oneTimePad(...) mit der Signaturen:

oneTimePad(String originalText, String schluessel) : String

oneTimePad(String geheimText, String schluessel) : String

Der Schlüssel enthält eine zufällige Folge von 0en und 1en.

Hilfe:
Hilfreich ist eine Methode, die eine Folge von 0en und 1en in 8-Zeichen - Pakete zerlegt und dieses Pseudo-Byte in ein
int-Zahl umwandelt, die dann wieder als char-Zeichen interpretiert, weiter verwenden kann.

Der nachfolgende Quellkode zeigt, wie man ein Pseudo-Byte in ein char umwandeln kann.

public class BinToInt {

  // interpretiert eine als String übergebene Folge von
  // 0en und 1en als Binärdarstellung einer int-Zahl und gibt
  // diese als Rückgabewert zurück. Falls das Eingabeformat nicht passt
  // wirft die Methode eine Ausnahme, die am besten mit try-catch beim
  // Aufruf der Methode abgefangen wird.
  public static int binToInt(String string) throws NumberFormatException{
     int zahl=0;
       for (int i = 0; i < 8; i++){
         zahl += (Integer.parseInt(string.substring(i,i+1))*Math.pow(2,7-i));
       }
     return zahl;
  }
  public static void main (String[] args) {
     String schluessel = "01000001";
     try {
        char zeichen = (char)binToInt(schluessel);
        System.out.println(zeichen);
     }
     catch(NumberFormatException nfe){
        System.err.println("Falsches Eingabeformat");
     }
  }
}
  Anmerkung: Warum führt

zahl = String.charAt(i);

nicht zum Erfolg? Warum ist der Umweg nötig? Nun, wenn String.charAt(i) z.B.  '1' ist, dann wird in zahl der ASCII-Kode von 1 gespeichert, aber nicht der Wert 1, wie wir es wünschen. Deshalb verwenden wir die Methode substring(i,i+1). , die uns eine das einzelne Zeichen als einelementiges String-Objekt liefert, mit Integer.parseInt(..) schließlich bekommen wir den gewünschten Wert.
 

Anmerkung Für die Aufgaben 3 bis 4 sind kleine Testprogramme zu erstellen, die die neuen Methoden der Klassen EnCrypt und DeCrypt  testen.
 
zu 25.3 Lösungen
zu 26 RSA-Verschlüsselung
26.1 RSA - die Idee
zur Startseite www.pohlig.de  (C) MPohlig 2006