Steganographie....Verstecken statt Verschlüsseln

  • Hallo zusammen,
    bei der Steganographie geht es darum, eine geheime Nachricht in einem anderen, offensichtlich harmlosen Objekt zu "verstecken" im Sinne von überdecken.
    Dabei werden Daten oft in Bildern versteckt, man kann aber auch in MP3´s oder in anderen Dateiformaten Informationen unterbringen, ohne dass man den "geheimen" Inhalt erkennt.
    Der folgende fast 1 kb große Text

    Zitat

    Hallo, diese Nachricht ist im AutoIt-Icon versteckt!
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.


    ist im rechten Icon enthalten, das linke ist das Orginal-Icon!
    -

    Sieht man den Unterschied der Icons? Nein, genau DAS ist die Absicht! Ein offensichtlich harmloses Objekt enthält weitere Daten...

    Wie funktioniert das?
    Beispiel 32- oder 24-Bit Grafiken:
    Ein Pixel besteht aus 3 Farbanteilen, Blau, Grün, Rot, welche jeweils einen Wert von 0 bis 255 (8 Bit=1 Byte) annehmen können. Man stellt die Farbe hexadezimal als 0xBBGGRR dar. Nun ist es so, daß kleine Änderungen in der Farbe von Menschen nicht wahrgenommen werden können, ein Mensch kann keinen Unterschied zwischen der Farbe 0xA3B3C3 und 0xA0B0C0 erkennen. Die "niederwertigen" Bits sind also für den optischen Eindruck völlig irrelevant. Mit Geräuschen verhält sich das ebenso. Kompressionsverfahren wie z.B. MP3 nutzen das aus, indem "unhörbare" (bei Bildern "unsichtbare") Anteile einfach weggelassen werden.
    Bei der Steganografie wird hingegen dieser "unwichtige" Anteil an den Farben durch z.B. eine geheime Nachricht ersetzt!
    Dabei wird die Nachricht in (in meinem Beispiel) 2 Bit lange Teilstücke aufgeteilt, und diese Teilstücke anstatt der "unwichtigen" niederwertigen Bits in den Farben eingesetzt.

    Aufgabe: Der Buchstabe M soll in einem knallgrünen Bild versteckt werden.
    Der Buchstabe M (Ascii 77, Ascii-Tabelle in der AutoIt-Hilfe im Anhang) sieht Binär also folgendermassen aus 01001101. Dieser Binärstring wird nun in 2 Bit große Teilstücke aufgeteilt:
    M => 77 => 01001101 =>01 00 11 01

    Als Farbe nehmen wir der Einfachheit halber an, die ersten Pixel des Bildes seien knallgrün Farbe 0x00FF00. Dabei besteht der Blau-Anteil der Farbe aus 0x00, Grün aus 0xFF und Rot aus 0x00. Binärdarstellung von grünen Pixeln:
    00000000 11111111 00000000 (Erstes Pixel) 00000000 11111111 00000000 (zweites Pixel) usw.
    Nun löschen wir die untersten beiden Bits in jedem Farbanteil, und ersetzen sie mit den Teilstücken unseres Buchstabens:
    00000001 11111100 00000011 (Erstes Pixel) 00000001 11111111 00000000 (zweites Pixel) usw.

    Bild speichern, fertig...Das Bild ist immer noch knallgrün, aber hat nun "Inhalt". Unser Buchstabe M sitzt "unsichtbar" in diesem Bild. Wie kann man den wieder herausholen?
    Umgekehrter Weg, bei jedem Farbanteil die letzten beiden Bits extrahieren, aus 4 dieser 2er-Blöcke wird ein 8-Bit Ascii-Buchstabe...isn´t that easy?

    Im folgenden Script habe ich als Bilddatei das AutoIt-Icon 3-fach vergrößert dargestellt.

    Spoiler anzeigen

    Als "Nachricht" kann man alles mögliche verstecken, z.B. andere Dateien (*.EXE, *.XLS, *.TXT *.MP3). Wobei man nicht festgelegt ist, mit welchen Bits und wo in der Containerdatei welche Daten wie gespeichert werden...
    Um der Freundin einen heissen Liebesbrief zu schicken, reicht es ab heute, ihr einen harmlosen Smilie mit entsprechendem Inhalt zu senden....

    Fehlt nur noch die Steganographie.UDF....ich habe eine , aber wo bleibt dann der Anreiz für euch ? Baut selbst etwas eigenes...eine digitale Signatur eurer Bilder oder MP3´s mit integriertem Coverbild und Lyrics, HAPPY PROGRAMMING!

    Wer das Script einigermassen nachvollzogen hat, der bemerkt, daß die GUI nur zum Anzeigen der Bilder nötig ist. Das "Blitten" und das Ersetzen der Bits findet im Speicher statt! Also auch etwas für "nicht GDI+-Fuzzis :thumbup:

    //EDIT 24.04.2014
    Eine schöne Umsetzung der Steganographie mittels sehr schnellem Assembler-Codes gibt es vom User Xenon

  • Interessanter Idee auf jedenfall.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Er hat doch geschrieben. dass er eine hat nur veröffentlicht er sie halt nicht.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Zitat

    Sieht sehr gut aus, vielleicht machst du eine UDF daraus zum verstecken und wiederfinden

    Ja, der Witz ist ja dabei, daß man nur die Dateien einlesen muß, Byteweise verknüpfen und wieder schreiben. Das sollte mit dem vorliegenden Script eigentlich jeder selbst hinbekommen.
    Alles andere sollte man für die eigenen Bedürfnisse zurechtlegen. Es geht ja auch darum, daß ein "Angreifer" nicht sofort über die Nachricht stolpert. So könnte man statt 2 nur 1 Bit ändern, die Schreibreihenfolge verändern, Die Bits vorher rotieren oder oder oder...
    Weiterhin würde es Sinn machen, den Dateinamen und die Dateigröße direkt mit in den Container zu schreiben. Dann könnte man auch z.B. Exe-Files in einem Bild "verstecken".
    Oder im Vorfeld eine Analyse des Bildes durchführen! Mal angenommen, das Bild hätte einen komplett weißen 0xFFFFFF Hintergrund und wäre nur im mittleren Bereich "bunt". Dann würde jeder "Angreifer" in einem Hexeditor oder mit einem fähigen Bildbearbeitungsprogramm sehen, daß "irgendetwas faul ist"....
    Also würde man die Daten nur im "bunten" Teil verstecken.

    Das Thema wird immer interessanter, da die weltweiten Geheimdienste mittlerweile extrem empfindlich auf "Verschlüsselung" reagieren. Die Nahost- und asiatischen Geheimdienste laufen zzt Amok, weil die systeminterne Verschlüsselung der Datendienste und Telefonate von z.B. Blackberry-Handys komplett über deren kanadischen Server läuft. Die Schlüssel sind natürlich nicht öffentlich. Die Frage ist, was man mit den verschlüsselten Daten (die man natürlich innerhalb von RiM (Hersteller der Blackberrys) alle problemlos entschlüsseln kann) anfängt...
    Es wird so sein wie bei Skype, dort bekommt derjenige einen Dechiffrierschlüssel, der ausreichnd zahlt. Das halte ich für legitim, denn Skype Ltd. ist kein Wohlfahrtsverein, sondern ein marktwirtschaftliches Unternehmen!
    Östereich hat einfach beschlossen, Skype nur zuzulassen, wenn Regierungsbehörden den Zugriff auf die Verschlüsselung bzw. Entschlüsselung der Nutzerdaten bekommen. Ansonsten keine Lizenzen für Gespräche....sagen wir so, "man hat sich geeinigt", Skype darf telefonieren und die Regierung mithören^^. Indien hat auch den Fuß in der Skype-Tür...

    Da mittlerweile sowieso jede Mail und SMS gescannt und jedes Telefongespräch mitgehört wird, ist es wesentlich unverfänglicher, dem Kollegen in Bagdad die Bilder von Tante Friedas 75. Geburtstag zu schicken, als eine per AES1024 (;)) verschlüsselte Nachricht. (die btw. sowieso entschlüsselt werden kann). Ausserden kann man sich einen Spass draus machen, und "hinter" alle versendeten oder gespeicherten Bilder (Bundestrojaner lässt grüssen) ein freundliches FU! ,,I,, oder gleich ein Ascii-Art
    autoit.de/wcf/attachment/11023/
    einbauen, dann ist es für die Datenschnüffler nicht ganz so langweilig 8o

    Zitat

    Da könnte mann bestimmt was mit ASM rumbaun oder ? Aber so weit bin ich noch nicht

    Abber sischäärr...Mach einfach nen Thread auf, ich stosse dann dazu^^ Je mehr mitmachen und Ideen einbringen, desto besser....

  • Super versteck Methode. Es funktioniert auch nur, weil das Menschliche Auge so begrenzt ist.
    Trotzdem hast du es super gut mit AutoIt hinbekommen.
    Jetzt darf man keinem Bild mehr trauen ;)

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • @leviathan, eigentlich hast du ja Recht, genau deswegen predige ich schon seit Jahrzehnten die Verwendung LANGER Schlüssel und nicht immer nur diese Drecks-Kleinkram "In den nächsten Jahren unknackbar"-Scheiße!
    Nimm einen 10 MB großen Zufallsschlüssel, brenn den in ein ROM und lass damit einige Runden Bits rotieren. In Hardware gegossen, fertig.
    Warum das niemand macht? Na, weil die Forschung im Bereich Verschlüsselung ursprünglich hauptsächlich von Militärs gefordert und auch finanziert wurde (und immer noch wird). Wenn dann aber hochbrisante Dokumente mit den Namen der Kinder oder der Ehefrau (Nancy und Anna) "verschlüsselt" werden müssen, weil der Herr General sich kein längeres Passwort merken kann, dann weisst du woher der Wind weht.
    Traurig, aber wahr...Der Algorithmus MUSS zwangsläufig umkehrbar d.h. "knackbar" sein, ansonsten könnte man die verschlüsselten Daten niemals wiederherstellen. Wenn die Hälfte des "Passwortes" bekannt ist, ("...Ich glaube es war Carol-Ann...oder Caroline...aber bestimmt irgendwas mit Carol....") dann haben es die Dechiffrierer leichter^^

    Aber in Zeiten, in denen Telefongespräche abgehört, sämtliche Telekommunikation aufgezeichnet und gescannt wird, und der "Apparat" immer undurchsichtiger wird, mache ich mir wenig Gedanken über die "Knackbarkeit" einer Verschlüsselung. Ich habe noch nie den Inhalt einer Mail verschlüsselt, was wohl daran liegt, dass ich weder korrupt bin, noch permanent irgendwelche krummen Dinger drehe. Meine "Geheimnisse" bleiben bei mir und bei dem, den sie was angehen! Jeder kann mich gerne alles fragen, ich werde dann je nach Sympathie lügen wie gedruckt oder die Wahrheit sagen, aber das bestimme ICH! Ich weiss auch, das ich mit dieser Einstellung ganz oben auf der Liste der Schäubles dieser Welt stehe, so jemanden, der sich im Ernstfall mit ALLEN Mitteln wehrt, können die überhaupt nicht gebrauchen.
    Daher gefällt mir der "Spirit" der Steganografie, es ist wesentlich spannender, ein "Geheimnis" in einem öffentlich zugänglichen Bereich für jedermann "herausfindbar" zu haben, als abzuwarten, bis ein Computer eine "verschlüsselte" Mail knackt. Kinder spielen auch viel lieber "verstecken" als "verschlüsseln" ;)

  • Also ich versteh das Script immernochnicht ganz...
    Wo wird z.b. das 2. Icon wieder eingelesen ?

  • Zeile 86-102 extrahiert aus jedem Farbanteil eines Pixels (also B G + R) die untersten beiden Bits, diese werden im $char_array[] gespeichert
    In Zeile 104-111 werden aus jeweils 4 der aufeinanderfolgenden, im $char_array[] gespeicherten beiden Bits ein Byte. 2+2+2+2=8

    Vom Wert dieses Bytes wird der Ascii-Code des Buchstabens bestimmt.

    Guck mal im 1. Post (habe ab "Aufgabe" versucht das besser zu erklären), wie aus dem 8 Bit großen M die 4 Zweiergruppen Bits werden.
    Genau dasselbe machen wir jetzt Rückwärts, also aus den 2er-Gruppen wieder ein Byte

  • Zitat

    Okay, so kann ich ja jetzt ganze codes verstecken, doch wie mache ich es ausführbar?

    [autoit]

    ;Beispiel: extrahieren und ausführen einer geheimen Datei aus einem Bild

    [/autoit][autoit][/autoit][autoit]

    ;Inhalt(e) aus dem Bild extrahieren
    $inhalt=_Extract_Secret_from_Pic("beispiel.bmp") ;diese Funktion gehört in die Steganographie-UDF^^

    [/autoit][autoit][/autoit][autoit]

    ;Inhalt in Datei schreiben
    filewrite($inhalt[0],binarytostring($inhalt[1]))
    ;Datei ausführen
    shellexecute($inhalt[0])

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _Extract_Secret_from_Pic($file)
    ;Hier sollte der Code hin, um die "geheime" Datei aus dem Bild zu extrahieren
    ;mal angenommen, wir hätten den Namen einer EXE-Datei (Hello.exe) und auch die EXE-Datei
    ;in dem Bild versteckt, z.B. mit:
    ;$Zu_versteckender_String="hello.exe"+chr(0)+(fileread("hello.exe")
    ;
    ;dann hätten wir nach dem Extrahieren wieder den Namen
    ;und auch die EXE-Datei
    dim $inhalt[2]
    $inhalt[0]="Hello.exe"
    $inhalt[1]="0x4D5A80000100000004001000FFFF00004001000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0A240000000000000000504500004C010200F0A3824A0000000000000000E0000E010B010144000200000002000000000000001000000010000000200000000040000010000000020000010000000000000004000000000000000030000000020000C232000002000000001000000010000000000100000000000000000010000000000000000000000000200000AC000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E746578740000003B000000001000000002000000020000000000000000000000000000200000602E69646174610000AC000000002000000002000000040000000000000000000000000000400000C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006A00FF156620400050E81D0000004869212049276D20746865206578616D706C652070726F6772616D21006A00FF15962040006A00FF15622040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005620000000000000000000003C200000622000008E20000000000000000000004A2000009620000000000000000000000000000000000000000000004B45524E454C33322E444C4C00005553455233322E444C4C00006E2000007C200000000000006E2000007C2000000000000000004578697450726F63657373000000476574436F6D6D616E644C696E6541009E200000000000009E2000000000000000004D657373616765426F78410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
    return $inhalt
    endfunc

    [/autoit]
  • Wenn ich das richtig verstanden hab, dann benötigt man bei deinem Algo das Original Icon nicht mehr um den Text wiederzubekommen.

    Damit würde die Sicherheit des Verfahrens allein davon abhängen ob der Algo bekannt ist.


    Ich kenn Steganographie nur in der Art, dass man auch beide Bilder wieder zum "entschlüsseln" benötigt.
    Weil man davon ausgehen muss, dass dem "Feind" der Algorithmus in die Hände fällt.

  • Zitat

    Damit würde die Sicherheit des Verfahrens allein davon abhängen ob der Algo bekannt ist.

    Ja, deshalb mein Tip, das Verfahren auf eigene Bedürfnisse anzupassen.

    Man könnte natürlich auch einen "Schlüssel" d.h. eine Orginaldatei dazu benutzen, das steganographierte Bild abzugleichen. Ich stelle mir das so vor, wie eine "Lochkarte", die nur bestimmte Bereiche des Bildes "durchsichtig" macht.
    Verknüpft man nun Orginal mit steganografiertem Bild (XOR), dann bleiben nur diejenigen Pixel sichtbar, die "hinter den Löchern" sind. Wenn nun aber das gesamte Bild steganografiert wird (bei den unwichtigen Pixeln wird zufälliger "Müll" eingetragen) dann sieht der Angreifer zwar, daß das gesamte Bild stehganografiert ist, aber welche Pixel in der Nachricht enthalten sind, sieht er nicht. Das lässt sich natürlich noch auf die Spitze treiben, indem für jede Farbe eine eigene Maske verwendet wird.
    Derjenige, der die Nachricht entschlüsseln möchte, ist ohne das "Orginal" (dieses "Bild" hat natürlich keinen optischen Bezug mehr, es ist ein Schlüssel) aufgeschmissen. Er müsste bei jedem Pixel entscheiden, ob der Blau/Grün/Rotanteil "durchsichtig" ist, und dann für jede dieser Farben getrennt entsteganographieren. Ob die enthaltenen Bits in der Nachricht verwendet werden, weiss er nicht, er hätte also bei 3 Pixeln (72 Byte) nur eine Wahrscheinlichkeit von der Summe der Permutationen von 9 "bits", das richtige "Bit" zu erhalten. Allein die Permutationen liegen bei 4 Pixeln = 12 Byte bei irgendwas mit > 40 Millionen (mal drei, da wir für jede Farbe eine eigene Maske haben).
    Das ist im Prinzip ähnlich wie beim TSP (Travelling Salesman Problem). Für einige wenige Städte (bis zu 20) ist die Route noch zu Brouteforcen, danach ist Ende. Wir reden hier aber von Bildern mit weit mehr als 20 Byte. Wer Lust hat, kann ja mal die Permutationen für das 32x32x4 Bit AutoIt-Logo aus dem Beispiel ausrechnen. Wenn jede Farbe ihre eigene Maske hat natürlich^^

    Da nur die untersten 2 Bit jeder Farbe verwendet werden, können bei den Masken natürlich die oberen 6 Bit beliebig sein. Man könnte somit auch die Maske bei irgendeinem Freehoster abspeichern. Das muss nicht mal ein Bild sein, jede andere Datei ist als Schlüssel verwendbar.

    Damit man versteht was ich meine, werde ich ein neues Beispiel machen, gute Idee :thumbup:

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (17. August 2010 um 13:55)