nun ich möchte hier ein kleines Projekt vorstellen und auch mit Euch ein bischen über dieses Thema (siehe Title) diskutieren und philosophieren.
Eigentlich wollte ich es in die Kategorie "Theorie und Konzeption" einstellen, nun leider gibt es diese Kategorie nicht mehr. Da es sich letztendlich um ein Programm handelt, stelle ich es mal hier rein. Wenn einer meint, dass es hier nicht reinpasst, kann er es ja verschieben.
Nun es geht hier um das Thema "Steganographie"
Nun werden vielleicht nicht alle was das ist. Darum zitiere ich mal die
Einleitenden Worte aus der "Wikipedia"
Wer das weiter lesen möchte kann dort nachsehen:...das Wort "Steganographie" kommt aus dem Griechischen und heißt übersetzt "verborgenes Schreiben". Sie wird oft definiert als "die Kunst und Wissenschaft der Kommunikation auf einem Weg, welcher die Existenz der Nachricht verbirgt". Somit ist Sinn und Zweck die "Vertuschung" von Informationen. Die Sicherheit einer geheimen steganographischen Botschaft liegt also darin, dass dem Angreifer die Existenz einer solchen nicht auffällt...
http://de.wikipedia.org/wiki/Steganographie
Ich habe mich die letzten Tage aus einem inneren Drang heraus damit auseinandergesetzt. Ich lag mal ziehmlich nachdenklich in meinem Bett
und dachte über Bilder nach. Da kam mir der Gedanke "Verstecken von Informationen in Bildern". Irgendwie dachte ich über Wasserzeichen und digitale Signatur nach. Das hat mich so sehr beschäftigt, das ich nicht einschlafen konnte. Und habe dann in meinem Kopf ein Verfahren entwickelt, Informationen auf relativ einfache Art in Bildern zu verstecken.
Erst dachte ich und dabei war ich richtig euphorisch, ich hätte etwas endeckt, was irgendwie neu war, jedenfalls kam mir das so vor. Also mußte ich unbedingt ein Programm dazu schreiben. Es ließ mich einfach nicht los. Ich bin davon überzeugt, dass meine Methode ziemlich sicher ist und nicht geknackt werden kann, auch wenn das Verfahren bis ins kleinste Detail der Öffentlichkeit bekannt ist. Vielleicht belehrt mich jemand eines besseren. Wenn ich von "sicher" spreche meine ich damit, dass es nicht möglich ist die Information aus dem "Informationsträgerbild" zu extrahieren ohne das "Originalbild" zu besitzen. Was ich hier eingestehen muß, die Information ist nicht gegen Zerstöhrung geschützt. Aber das könnt Ihr weiter untern in der Beschreibung nachlesen. Und vielleicht können wir das Verfahren dahingehend gemeinsam verbessern. Vielleicht hat auch jemand noch ganz andere Ansätze dafür. Jedenfalls möchte ich zunächst meine Methode hier vorstellen. Zusätzlich meine beiden Programme, die ich mit genau dieser Methode in einem Bild versteckt habe.
Das "Originalbild" und das "Informationsträgerbild" werde ich hier zur Verfügung stellen und Euch dazu animieren die Zip-Datei
in diesem Bild mit Hilfe meines Verfahrens, was ich weiter unten beschreiben werde zu extrahieren. In der Zip-Datei sind dann die beiden Programme zum "verstecken - Encoding" und "extrahieren - Decoding".
Zusatzlich werde ich noch ein "Informationsträgerbild" zur Verfügung stellen. Und ich bin mir ziehmlich sicher, das die enthaltene Information
keiner extrahieren oder knacken kann
Wenn es jemand schafft, Hut ab! Und ich sehe ein, dass mein Methode nicht sicher ist. Der jenige muß mir nur sagen was in der dort enthaltenen Textdatei geschrieben steht. Und es wäre schön, wenn er uns hier erzählt wie er es geschafft hat. Aber ich behaupte mal, es gibt keine Chance!
So jetzt kommt ein beschreibender Text zur Methode und dann die Bilder:
Code: Alles auswählen
### XSIPS XenSimpleStega ###
-- (c) 2005 by xensonsoft --
-- Informationen in einem PNG-Bild verstecken --
1. Was ist ein digitales Bild?
Ein digitales Bild setzt sich aus einzelnen Bildpunkten zusammen (Pixel).
Somit kann ein Bild z.B. eine Abmessung von 1024 x 1024 Bildpunkten (Pixel) haben. Jeder einzelne
Pixel setzt sich wiederum aus den drei Grundfarben R (Rot), G (Grün) und B (Blau) zusammen.
Jede Grundfarbe kann einen Wert zwischen 0 (kein Farbanteil) und 255 (maximaler Farbanteil) annehmen.
Jeder Farbanteil läßt sich somit in genau einem Byte unterbringen.
Pro Pixel werden also für die Farbinformation 3 Bytes benötigt.
Die Kompination aus diesen drei Werten nehmen wir dann als eine bestimmte Farbe wahr.
Ein Pixel wird also folgendermaßen beschrieben:
Definition seiner Position:
z.B.: x = 0, y = 0
Definition seiner Farbe:
z.B.: R = 255, G = 255, B = 255 (weiß)
Schemaaufbau eines digitalen Bildes mit 4 x 4 Pixeln:
.|-----------------|..|-----------------|..|-----------------|..|-----------------|.
.| x = 0 , Y = 0 |..| x = 1 , Y = 0 |..| x = 2 , Y = 0 |..| x = 3 , Y = 0 |.
.| R G B |..| R G B |..| R G B |..| R G B |.
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
.| 000 | 128 | 064 |..| 000 | 128 | 064 |..| 000 | 128 | 064 |..| 000 | 128 | 064 |.
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
.|-----------------|..|-----------------|..|-----------------|..|-----------------|.
.| x = 0 , Y = 1 |..| x = 1 , Y = 1 |..| x = 2 , Y = 1 |..| x = 3 , Y = 1 |.
.| R G B |..| R G B |..| R G B |..| R G B |.
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
.| 064 | 128 | 064 |..| 064 | 128 | 064 |..| 064 | 128 | 064 |..| 064 | 128 | 064 |.
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
.|-----------------|..|-----------------|..|-----------------|..|-----------------|.
.| x = 0 , Y = 2 |..| x = 1 , Y = 2 |..| x = 2 , Y = 2 |..| x = 3 , Y = 2 |.
.| R G B |..| R G B |..| R G B |..| R G B |.
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
.| 032 | 128 | 064 |..| 032 | 128 | 064 |..| 032 | 128 | 064 |..| 032 | 128 | 064 |.
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
.|-----------------|..|-----------------|..|-----------------|..|-----------------|.
.| x = 0 , Y = 3 |..| x = 1 , Y = 3 |..| x = 2 , Y = 3 |..| x = 3 , Y = 3 |.
.| R G B |..| R G B |..| R G B |..| R G B |.
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
.| 000 | 128 | 100 |..| 000 | 128 | 100 |..| 000 | 128 | 100 |..| 000 | 128 | 100 |.
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
2. Wie können Informationen in einem Bild versteckt werden, ohne dass sie bemerkt werden?
In der Natur gibt es das sogenanntes Phänomen des Rauschens oder der Unschärfe, bei dem ein Zustand
niemals eindeutig definiert werden kann. Dennoch empfinden wir diese Zustände als eindeutig, das Rauschen einer
Information nehmen wir hierbei gar nicht war. Es unterliegt einem Tolleranzbereich den wir
immer als gleichen Informationsgehalt ansehen werden. Erst wenn der Tolleranzbereich verlassen wird, können
wir überhaupt erst einen unterschied feststellen. In der analogen Natur ist uns das Rauschen immer gegenwärtig.
Bei der digitale Informationsverarbeitung stellt das Rauschen allerdings ein Problem dar. Informationen müssen
100% eindeutig sein und dürfen keinen Tolleranzschwankungen ausgesetzt sein. Als kleinste Informationseinheit in der
digitalen Welt kennen wir das BIT. Es kann nur zwei Zusände annehmen 0 oder 1 (Strom an oder Strom aus). Diese zwei
Zustände sind eindeutig definiert und können nur mit Hilfe von mathematischen Algorythmen oder Prüfsummenverfahren
sichergestellt werden. Eine digitale Information, welche z.B. ein einzelnes Zeichen beschreibt bestehet aus einer
Anordung von 8 BITs (einem Byte). Der Buchstabe 'A' wird als 01000001 in BIT-Darstellung beschrieben. Würde diese
BIT-Folge einem Rauschen unterliegen und nur ein einzelnes BIT seine Wertigkeit verändern, könnten wir kein 'A' mehr erkennen
und ein ganz anderes Zeichen wäre erkennbar. Wir kippen nun z.B. das vorletzte BIT (01000001 --> 01000011) und aus
dem 'A' wird nun ein 'C'. Wir sehen sehen also, dass wir in der digitalen Informationsverarbeitung absolut kein Rauschen
gebrauchen können. Bei unserem Vorhaben, Informationen in einem Bild zu verstecken, machen wir uns allerdings das Rauschen
zu Nutze. Da ein Bild vom Betrachter immer "analog" verarbeitet wird. Spielt es für ihn überhaupt keine Rolle
ob die einzelnen Pixel einer Unschärfe oder einem Rauschen in ihrer Farbzusammensetzung ausgesetzt sind. Es hat für den
Betrachter überhaupt keine erkennbare Auswirkung auf das Bild. Es ist also z.B. völlig egal, ob der Pixel so
.|-----------------|.
.| x = 0 , Y = 0 |.
.| R G B |.
.|-----|-----|-----|.
.| 000 | 128 | 064 |.
.|-----|-----|-----|.
oder so
.|-----------------|.
.| x = 0 , Y = 0 |.
.| R G B |.
.|-----|-----|-----|.
.| 001 | 127 | 063 |.
.|-----|-----|-----|.
aussieht. Wenn diese Schwankungen der Farbinformationen in einem gewissen Tolleranzbereich bleiben, macht es für den
Betrachter keinen unterschied. Auch wenn er beide Bilder gegenüberstellt wird er keinen "sichtbaren" unterschied feststellen
können. Mit dieser Erkenntnis werden wir also nun unsere Informationen im Rauschen der Farbe verstecken. Dazu müssen wir
uns ein geeignetes Verfahren überlegen, schließlich soll die Information später auch wieder extrahiert werden können.
Wir sprechen jetzt hier immer vom "Originalbild", in dem wir unsere Informationen verstecken werden und dem daraus
resultierenden "Informationsträgerbild". Um die Information später überhaupt wieder sichtbarmachen zu können, benötigt
man zwingend das "Originalbild". Es gibt "meines Wissens" ohne dieses Original keine Möglichkeit
die Information zu extrahieren. Sie wird dann immer im Rauschen der Farbe verborgen bleiben. Auch wenn eins der beiden Bilder
"Originalbild" oder "informationsträgerbild" in irgendeiner Form Veränderungen ausgesetzt wird, sei es durch
verlustbehaftet Kompression oder Änderung der Abmessungen, Vergrößerungen oder Verkleinerung des Bildes,
ist es unmöglich die Information zu extrahieren. Also bitte die Bilder niemals verändern!!
Das "Originalbild" dient als Vorlage für das "Informationsträgerbild". In das "Originalbild" wird Rauschen eingearbeitet
und letztendlich als "Informationsträgerbild" gespeichert. Zur Informationsextrahierung wird das "Originalbild" benötigit
um das Rauschen filtern zu können, in dem die Informationen steckten, das Rauschen ist zozusagen unser
Information, die wir ohne das "Originalbild" nicht bemerken, geschweigedenn extrahieren könnten.
Nun gehen wir folgendermaßen bei der Einbettung unserer Informationen in das "Originalbild" vor. Wir nehmen z.B. eine
Textdatei mit Ihalt als unsere "Quellinformation". Die Textdatei wird Byte für Byte durchgearbeitet, bis das Ende
erreicht ist. Jedes Byte, das wir aus ihr ermitteln, zerlegen wir in seine einzelnen BIT-Bestandteile. Was uns
pro Byte jeweils 8 BIT beschehrt. Nun gehen wir jedes BIT einzeln durch. Gleichzeitig gehen wir durch unser "Originalbild"
und ermitteln für jeden Pixel (beginnent bei x = 0, y = 0 und endend bei x = xn, y = yn) von links nach rechts, nächste Zeile
usw. den Farbwert und zerlegen ihn in seine Gundfarben (RGB). Pro Farbwert speichern wir jeweils immer 2 BIT ab. Und zwar
eines im Farbanteil R (Rot) und eines im Farbanteil B (Blau). Was wir mit Farbanteil G (Grün) machen, werde ich später noch
erklären. Wir benötigen also 4 Pixel um 1 Byte speichern zu können. Nun ermitteln wir immer ob ein BIT = 0 (nicht gesetzt)
oder BIT = 1 (gesetzt) ist. Handelt es sich um ein gesetztes BIT (1), dann verändern wir den jeweiligen Farbanteilswert
um +/-1. Haben wir einen Farbwert von 0 erhöhen wir ihn um +1, und bei einem Farbwert von 255 erniedrigen wir um -1. Bei
allen anderen Werten lassen wir den Zufall entscheiden (etweder um +1 erhöhen oder um -1 erniedrigen). Ein gesetztes BIT
wird also immer als Veränderung im Farbanteilswert gegenüber dem "Originalwert" repräsentiert. Und keine Veränderung
bedeutet kein gesetztes BIT (0). So hangeln wir uns also durch die Textdatei und durch unser "Originalbild". Die
Veränderungen im "Originalbild" werden dann später als "Informationsträgerbild" gespeichert.
Schema Information im "Originalbild" verstecken
z.B. Buchstabe: 'A' --> binär: '01000001'
"Originalbild"
.|-----------------|..|-----------------|..|-----------------|..|-----------------|.
.| x = 0 , Y = 0 |..| x = 1 , Y = 0 |..| x = 2 , Y = 0 |..| x = 3 , Y = 0 |.
.| R G B |..| R G B |..| R G B |..| R G B |.
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
.| 000 | 128 | 064 |..| 000 | 128 | 064 |..| 000 | 128 | 064 |..| 000 | 128 | 064 |.
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
0 1 0 0 0 0 0 1 <-- binärer Buchstabe 'A'
"Informationsträgerbild"
.|-----------------|..|-----------------|..|-----------------|..|-----------------|.
.| x = 0 , Y = 0 |..| x = 1 , Y = 0 |..| x = 2 , Y = 0 |..| x = 3 , Y = 0 |.
.| R G B |..| R G B |..| R G B |..| R G B |.
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
.| 000 | 128 | 065 |..| 000 | 128 | 064 |..| 000 | 128 | 064 |..| 000 | 128 | 063 |. <-- Information eingearbeitet
.|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|..|-----|-----|-----|.
Pixel: x = 0, Y = 0
R = 000 BIT (0 nicht gesetzt) --> R = 000
B = 064 BIT (1 gesetzt) --> B = 065 (Zufall +/-1)
Pixel: x = 1, Y = 0
R = 000 BIT (0 nicht gesetzt) --> R = 000
B = 064 BIT (0 nicht gesetzt) --> B = 064
Pixel: x = 2, Y = 0
R = 000 BIT (0 nicht gesetzt) --> R = 000
B = 064 BIT (0 nicht gesetzt) --> B = 064
Pixel: x = 3, Y = 0
R = 000 BIT (0 nicht gesetzt) --> R = 000
B = 064 BIT (1 gesetzt) --> B = 063 (Zufall +/-1)
Natürlich können wir jede andere Art von Dateien z.B. MP3-Files in einem Bild verstecken. Das Bild muß von den Abmessungen
her nur so groß sein, damit die Datei dort auch komplett hineinpasst! Das verfahren ist das Gleiche. Man geht einfach
Byte für Byte durch die Datei und leget die BIT-Information in den Farbanteilswerten ab.
Den Dateinamen der "Quellinformationsdatei" arbeiten wir mit dem gleichen Verfahren im Farbanteil G (Grün)
eine. Wobei wir hier für ein Byte 8 Pixel benötigen!! Das Ende des Dateinamens kennzeichnen wir mit einem '#'
3. Wie können wir die versteckten Informationen wieder sichtbar machen?
Im Grunde ist das ganz einfach. Wir nehmen die "Originalbilddatei" und vergleichen sie mit der
"Informationsträgerdatei". Wir gehen beide Bilder Pixel für Pixel durch und vergleichen die Farbwerte
R_Original mit R_Informationsträger und B_Original mit B_Informationsträger. Stimmen die Werte überein,
dann ist das BIT = 0 (nicht gesetzt) andernfalls ist BIT = 1 (gesetzt). Das machen wir solange, bis wir
8 BIT zusammen haben, was ein Byte ergibt. Dieses Byte schreiben wir dann in eine Datei und wiederholen den
Vorgang solange bis wir das letzte Pixel beider Bilder erreicht haben. Den Dateinamen für die "Quellinformationsdatei"
extrahieren wir auf die selbe Art (aus Grün). Wenn wir das '#' erreicht haben, wissen wir, der Dateiname ist vollständig.
Schema Information aus "Informationsträgerbild" extrahieren
Pixel: x = 0, Y = 0
R = 000 <--> R = 000 ? --> BIT (0 nicht gesetzt) --> 0
B = 064 <--> B = 065 ? --> BIT (1 gesetzt) --> 1
Pixel: x = 1, Y = 0
R = 000 <--> R = 000 ? --> BIT (0 nicht gesetzt) --> 0
R = 064 <--> R = 064 ? --> BIT (0 nicht gesetzt) --> 0
Pixel: x = 2, Y = 0
R = 000 <--> R = 000 ? --> BIT (0 nicht gesetzt) --> 0
B = 064 <--> R = 064 ? --> BIT (0 nicht gesetzt) --> 0
Pixel: x = 3, Y = 0
R = 000 <--> R = 000 ? --> BIT (0 nicht gesetzt) --> 0
B = 064 <--> R = 063 ? --> BIT (1 gesetzt) --> 1
--> 01 00 00 01 --> 'A'
Michael Eberhardt / Epfendorf, 15.05.2004
Originalbild XSIPS:

Informationsträgerbild XSIPS (enthält Zip-File):

Und zuletzt das Bild für die sportlichen unter Euch!!

So, nun zum Schluß möchte ich Euch anregen, einfach ein bischen zu diskutieren. Allgemein oder speziell über das Thema Steganographie.
P.S.: Eventuell gibts später den Sourcecode zu denen beiden Programmen,
weil da kann man gerade von der Geschwindigkeit noch einiges optimieren, aber da sind viele von Euch besser auf der Höhe als ich.
Jetzt sollt Ihr aber erst mal selber ein bischen knobeln!
Viel Spaß, und ich wünsch mir eine rege Diskussion!!
Gruß
Michael
