22.5 Anwendung: Steganographie

 

  Jede Botschaft wird bei ihrem Austausch vom Sender codiert und vom Empfänger decodiert. Dies gilt übrigens auch für den Austausch von gesprochenen Botschaften. Man mache sich das am besten klar, wenn ein deutscher Geschäftsmann einem japanischen Kollegen in deutscher Sprache etwas mitteilen will und der japanische Kollege des Deuten nicht mächtig ist. Die Kommunikation kann nicht gelingen, obwohl beide über ähnliches Wissen verfügen. Indem der deutsche Geschäftsmann spricht codiert er seine Botschaft, er übersetzt das was er 'im Kopf hat' in 'tanzende Luftmoleküle' also in gesprochenen deutschen Text. Der Empfänger müsste das Trommeln der Moleküle auf sein Trommelfell decodieren, um den Inhalt der Botschaft in seinen Kopf zur Weiterverarbeitung zu bekommen.
Die hier beschriebene Problematik erinnert uns an Interpretation also Codierung und Decodierung von Daten wie wir es ausführlich bei den Lösungen der letzten Hausaufgaben gesehen haben. Eine Datei "theseus.bmp" wird erst durch die Interpretation zu einem Bild. Was wir über Datenströme bis jetzt gelernt haben, wollen wir in diesem Kapitel dazu benutzen eine geheime Botschaft in einem Bild zu verstecken. Eine Botschaft zwischen einem Sender und einem Empfänger vor Dritten zu verheimlichen, nennt man Steganographie, wobei das griechische Wort steganos bedeckt und graphein schreiben bedeuten. Der Autor Simon Singh beschreibt in seinem Buch 'Geheime Botschaften' wie schon die Griechen Steganographie als Waffe einsetzten:

 
Eine Empfehlung Broschiert - 458 Seiten - Dtv
Erscheinungsdatum: Dezember 2001
ISBN: 3423330716
 

Der Perserkönig Xerxes wollte 480 v. Chr. Griechenland, namentlich Athen und Sparte in einem Überraschungsangriff seinem Reich einverleiben. ... Einem Griechen jedoch, der aus seiner Heimat verstoßen worden war und in der persischen Stadt Susa lebte, war die Aufrüstung der Perser nicht entgangen. Demaratos, so hieß der Grieche, lebte zwar im Exil, doch tief in seinem Herzen fühlte er sich Griechenland noch immer verbunden. So beschloss er, den Spartanern eine Nachricht zu schicken und sie vor Xerxes' Invasion zu warnen. Die Frage war nur , wie er diese Botschaft übermitteln sollte, ohne dass sie in die Hände der persischen Wachen gelangen würde. Herodot schreibt:

Da er das auf andere Weise nicht konnte - er musste fürchten, dabei ertappt zu werden -, half er sich durch eine List. Er nahm nämlich eine zusammengefaltete kleine Schreibtafel, schabte das Wachs ab und schrieb auf das Holz der Tafel, was der König vorhatte. Darauf goss er wieder Wachs über die Schrift, damit die Wachen an den Straßen die leere Tafel unbedenklich durchließen. Sie kam auch an, doch man wusste nicht, ewas man damit anfangen sollte, bis, wie man sagt, Kleomenes' Tochter Gorgo, die Gemahlin des Leonidas, dahinter kam und riet, das Wachs abzukratzen, damit man dann die Schrift auf dem Holz fände. Das tat man und nachdem man die Nachricht gefunden und gelesen hatte, schickte man diese auch den anderen Griechen.

Soweit Herodot. Der Rest ist Geschichte. Die Griechen lockten die ankommenden persischen Schiffe, deren Kommandanten vom Sieg ihres vermeintlichen Überraschungsangriffs überzeugt waren, in die Bucht von Salamis bei Athen. Die zahlenmäßig unterlegene griechische Flotte konnte darauf hin die gänzlich überraschte persische Flotte demütigend schlagen.
 

Verstecken Digitale Bilder sind  Gegenstände, die sich zum Verstecken von geheimen Botschaften eignen. Wir wollen hierzu nicht ausgefeilten Technik kennen lernen, es geht hier mehr um das Prinzip.
 

Auf den ersten Blick scheinen sich die beiden links gezeigten Bilder theseus1.bmp (oben) und theseus2.bmp (unten) nicht zu unterscheiden. Genauer wird der Unterschied, wenn wir uns die Bilder auf unseren Rechner herunterladen und vergrößert anschauen.

Im Theseus2-Bild erscheinen rote Punkte, die im Theseus1-Bild fehlen. Tatsächlich versteckt sich dahinter eine "Botschaft".

Wir wollen uns anschauen, wie wir die Botschaft mit Hilfe eines Java-Programms in dem Theseus-Bild unterbringen. 

Download:
Steganographie. java
import java.io.*;
public class Steganographie {
 public static void main(String[]args) throws IOException {
  String text="";
  String eingefuegterText = "Java ist toll";
  int z=0, i = 0, k = 0;
  File datei = new File("../Bilder/Theseus1.bmp"); 
  FileReader leseStrom=new FileReader(datei);
  while(z!=-1) {                                   
   z = leseStrom.read();
   if (i > 20000 &&(i-20000)%10==0 && k <          
       eingefuegterText.length()){
    text += eingefuegterText.charAt(k); k++;
   }
   else {
     text += (char)z;
   }
   i++;                                            2
  }
  File datei2 = new File("../Bilder/Theseus2.bmp");
  FileWriter speicherStrom = new FileWriter(datei2);
  PrintWriter schreibeStrom = new PrintWriter(speicherStrom);
  schreibeStrom.println(text);                               
  schreibeStrom.close();                                     
  System.out.println("fertig");
 }
}
 
Bemerkungen Das Programm liest die Datei, ohne Rücksicht auf die Dateiendung in einen Zeichenkette ein.  Genauer müssten wir sagen, Java interpretiert die Daten, die in Theseus1.bmp gespeichert sind als einen gewöhnlichen ASCII-Text. Dies geschieht dadurch, dass die 1 Byte große Pakete, die read() dem Lesestrom entnimmt, vom Javaprogramm  als  char interpretiert wird. Aus diesen Zeichen wird die Zeichenkette aufgebaut, wobei ab einer bestimmen Stelle -  wir wollen vermeiden, dass der Header 'verletzt wird' - in regelmäßigen Abständen die Zeichen durch 'echte' Buchstaben ersetzt werden. Diese Buchstaben bilden die geheime Botschaft, die in unserem Falle nicht anders als "Java ist toll" heißen kann :-). Die ansonsten unverändert gebliebene Datei wird von unserem Programm wieder mit der Endung bmp gespeichert, so dass geeignete Bildprogramme, diese wieder als Bilder interpretiert werden können. Die in das Bild gestreute Zeichen erscheinen dann als Veränderung einzelner Farb-Pixel.
  Neu ist noch der gelb unterlegte Bereich. Dem Ausgabestrom (ein Objekt Klasse PrintWriter) werden wir später noch einmal begegnen. Während wir ihn hier durch die Übergabe eines FileWriter-Objektes quasi auf die 'Festplatte lenken' werden wir ihm später ein anderes Ziel geben.  Der Vorteil beim Benutzen von PrintWriter-Objekten besteht darin, dass die Klasse PrintWriter ihren Objekten eine Methode print(String text)  zur Verfügung stellt, die es erlaubt ganze Zeichenkette auf einen Schlag in den SchreibeStrom zu speisen.
 
Download:
TextFinden.java
Das Programm TextFinden.java leistet nun das umgekehrte. Es liest den Geheimtext aus dem Bild aus. Klar ist, dass das nur leicht ist, wenn man weiß, an welchen Stellen die 'echten' Buchstaben stehen.
 
 
import java.io.*;
public class TextFinden {
   public static void main(String[]args) throws IOException {
      String text="";
      int z = 0, i = 0, k = 0;
      File datei = new File("../Bilder/Theseus2.bmp");
      FileReader dateiLeser=new FileReader(datei);
      while(z!=-1) {
         z = dateiLeser.read();
         if (i > 20000 &&(i-20000)%10==0 && k < 13) {
             text += (char)z;
             k++;
         }
         i++;
      }
      System.out.println(text);
   }
}
 
zu den Hausaufgaben
zur Startseite www.pohlig.de  (C) MPohlig 2003