steganography problem



  • hallo,

    hab da nun ein programm geschrieben, welches text in bild kopiert. nur hab ich ein problem fuer das auslesen, mir faellt keine geeignete methode ein. das einlesen geschieht folgendermaszen: es wird ein byte aus dem image geholt und ein byte von dem text. das eine byte vom text wird auf 8 bit verteilt und jedes dieser acht bit wird auf ein byte von dem image geschrieben, in dem das lsb geaendert wird, falls noetig. das output sieht z.b so aus:

    $ ./crypt img.bmp ab
    READED BYTE: 0x8c - BIT is 0 - BYTE is EVEN: 0x8c->Writing new BYTE: 0x8c
    READED BYTE: 0x0 - BIT is 0 - BYTE is EVEN: 0x0->Writing new BYTE: 0x0
    READED BYTE: 0x0 - BIT is 1 - BYTE is EVEN: 0x0-> Writing new BYTE: 0x1
    READED BYTE: 0x8c - BIT is 1 - BYTE is EVEN: 0x8c-> Writing new BYTE: 0x8d
    READED BYTE: 0x0 - BIT is 0 - BYTE is EVEN: 0x0->Writing new BYTE: 0x0
    READED BYTE: 0x0 - BIT is 0 - BYTE is EVEN: 0x0->Writing new BYTE: 0x0
    READED BYTE: 0x8c - BIT is 0 - BYTE is EVEN: 0x8c->Writing new BYTE: 0x8c
    READED BYTE: 0x0 - BIT is 0 - BYTE is EVEN: 0x0->Writing new BYTE: 0x0
    READED BYTE: 0x0 - BIT is 0 - BYTE is EVEN: 0x0->Writing new BYTE: 0x0
    READED BYTE: 0x8c - BIT is 0 - BYTE is EVEN: 0x8c->Writing new BYTE: 0x8c
    READED BYTE: 0x0 - BIT is 1 - BYTE is EVEN: 0x0-> Writing new BYTE: 0x1
    READED BYTE: 0x0 - BIT is 1 - BYTE is EVEN: 0x0-> Writing new BYTE: 0x1
    READED BYTE: 0x8c - BIT is 0 - BYTE is EVEN: 0x8c->Writing new BYTE: 0x8c
    READED BYTE: 0x0 - BIT is 0 - BYTE is EVEN: 0x0->Writing new BYTE: 0x0
    READED BYTE: 0x0 - BIT is 0 - BYTE is EVEN: 0x0->Writing new BYTE: 0x0
    READED BYTE: 0x8c - BIT is 1 - BYTE is EVEN: 0x8c-> Writing new BYTE: 0x8d
    

    so nun steht z.b "ab" in dem bild, aber wie bekomme ich den am besten dort wieder heraus. ich habe mir ueberlegt eine art marke zu setzen, start und end. aber ich weisz nicht ob das eine geeignete sache ist.



  • Ich verstehe nicht ganz was dur ereichen willst.
    Darum bitte ich dich dein Anfangsdaten zu posten und danach die enddaten die du haben willst.
    Des mit marken versteh ich überhaupt nicht was du damit meinst

    mfg



  • Ich tippe mal darauf, das er Daten (Informationen) in einem Bild verstecken will. Dafür ändert er bestimmte, nicht für die Farbgebung essentielle Informationen im Bild. Das hat er scheinbar geschafft. Seine Frage nun ist: "wie holt man die Daten (Informationen) dort wieder raus"? Irgendwie muss das Programm ja erkennen, was die versteckten Informationen sind und was im "Original" zum Bild gehört. Das kann man per "Marker" machen. D.h. man erklärt dem Programm, wenn folgendes Zeichen "x" als Bit vorkommt, dann sind die nachfolgenden Zeichen bis Bit "y" versteckte Informationen.

    Würde ich mal so interpretieren.

    MfG guest0815



  • bei der steganographie haben doch normalerweise beide personen das gleiche bild, in welchem die bytes verglichen werden, oder?



  • bei der steganographie haben doch normalerweise beide personen das gleiche bild, in welchem die bytes verglichen werden, oder?

    wenn beide personen das gleiche bild haben, warum sollte man sie dann miteinander vergleichen?



  • www.codeproject.com/cpp/HideIt.asp+hide+text+in+pictures+bit+byte&hl=de

    das hilft dir sicherlich weiter, bin da nicht so ganz durchgestiegen 🙂



  • Googelt mal nach Romana Machado, der Extropianerin, die hat die Steganographie erfunden, vor etlichen Jahren, glaube es war '95 oder '96, in den "Anfaengen des Web", die hat das sogar mit einer Skriptsprache hingekriegt! 😉

    Das Prinzip ist genauso einfach, wie es sich anhoert: Man nehme einen Text, zerlege ihn in Bits, und ueberschreibe die Bits eines Images, jeweils bloss ein Bit pro Farbwert pro Pixel, weil das praktisch nicht auffaellt. Man muss natuerlich bei der Komprimierung solcher Bilder dafuer sorgen, dass nach der Entkomprimierung wieder dieselben Bilddaten vorliegen.

    Zum Herauslesen macht man es einfach umgekehrt: Man liest die jeweils unteren Bits pro Farbwert pro Pixel wieder aus und schreibt sie in eine Datei. Voila!!

    Marker zu setzen ist daher kaum notwendig. Man koennte natuerlich z.B. SOT am Anfang und EOT am Ende kodieren (Steuercodes siehe ASCII Steuerzeichen-Tabelle). Oder nur am Ende ein paar Nullbytes. Am besten ist es natuerlich, wenn man die Daten vor dem steganographischen Verfahren verschluesselt, damit die Daten nicht von Fremden ausgelesen werden koennen. Bei der Verschluesselung kann man dann z.B. irgendwo ein Laengenfeld unterbringen.

    Steganographie ermoeglicht es, beliebige Daten sogar vor Geheimdiensten zu verstecken. In Chatrooms oder auf Webforen kann man dann Bilder einstellen, die Steganographische Daten enthalten, waehrend man z.B. uebers Essen oder den Hund plaudert. 😃

    Wollte mich auch mal damit beschaeftigen, bin aber noch nicht dazu gekommen.



  • habs mir mal genauer angeschaut, also du änderst ja von jedem byte des bildes, das letzte bit mit einem bit vom text, also du erhöhst oder setzt es eins runter somit wird das bild minimal in der farbgebung je nach dem was man für eine farbtiefe hat verändert. raussuchen machst du es genau so wie du es rein gemacht hast, nur musst du wissen wann schluss ist, drum schreibst du in den header, oder besser gesagt in die really bilddata, die size von dem text, und somit weißt du wann es zu ende ist, gegebenenfalls noch ein passwort und den datein namen.



  • Hier ist uebrigens noch ein lustiges Textverschluesselungsprogramm, das vielleicht jemandem gute Dienste leisten kann:

    http://www.ekkehardmorgenstern.de/projects.html
    http://www.ekkehardmorgenstern.de/projekte.html



  • danke pradox u. power off fuer die hilfe. pradox leider geht dein link oben nicht, hasst du einen gueltigen?

    habs mir mal genauer angeschaut, also du änderst ja von jedem byte des bildes, das letzte bit mit einem bit vom text, also du erhöhst oder setzt es eins runter somit wird das bild minimal in der farbgebung je nach dem was man für eine farbtiefe hat verändert. raussuchen machst du es genau so wie du es rein gemacht hast, nur musst du wissen wann schluss ist, drum schreibst du in den header, oder besser gesagt in die really bilddata, die size von dem text, und somit weißt du wann es zu ende ist, gegebenenfalls noch ein passwort und den datein namen.

    hm, kann ich normalerweise nicht, das original bild bekommt keiner zu gesicht, muesste ich also in das neue image packen. also koennt ich ja nach den 54 bytes an bitmap header, die text size angeben und danach den zu crypteten text. da ich den header gern im rohzustand, wie er war, behalten wollte.

    ok



  • xoko schrieb:

    hm, kann ich normalerweise nicht, das original bild bekommt keiner zu gesicht, muesste ich also in das neue image packen. also koennt ich ja nach den 54 bytes an bitmap header, die text size angeben und danach den zu crypteten text. da ich den header gern im rohzustand, wie er war, behalten wollte.

    ok

    haeh?? Pack die Textlaenge doch mit in den Textstrom, denn Du in das Bild unterbringen willst:

    #include <stddef.h>    /* fuer size_t */
    #include <stdio.h>     /* fuer printf() */
    
    typedef unsigned char Byte;
    
    #pragma pack(1)
    typedef struct Text {
      Byte text[65536];
    };
    #pragma pack()
    
    void setText( Text* target, const char* source ) {
       const Byte* s  = (const Byte*) source;
       Byte*       d0 = target->text;
       Byte*       d  = target->text;
       Byte*       e  = d + 65536;
       size_t      size;
       d += 2; /* Header ueberspringen */
       while ( *s != (Byte) '\0' ) {
          if ( d < e ) *d++ = *s++; else break;
       } 
       size = (size_t) ( d - d0 );
       d[0] = (Byte)( size >> 8 );  /* hi byte der Laenge */
       d[1] = (Byte) size;          /* lo byte der Laenge */
    }
    
    void getText( char* target, size_t tgt_sz, const Text* source ) {
       Byte* s = source->text;
       char* d = target;
       char* e = target + ( tgt_sz - 1U );
       size_t size = ( (size_t) s[0] << 8 ) | ( (size_t) s[1] );
       s += 2;  /* Header ueberspringen */
       while ( size != 0U ) {
          if ( d < e ) *d++ = (char) *s++; else break;
       }
       *d = '\0';
    }
    
    void test( void ) {
       Text txt;
       char buf[100];
       setText( &txt, "Hallo" );
       printf( "txt.text[0..7] = %02X %02X %02X %02X %02X %02X %02X %02X\n",
          txt.text[0], txt.text[1], txt.text[2], txt.text[3],
          txt.text[4], txt.text[5], txt.text[6], txt.text[7] );
       getText( buf, sizeof(buf), &txt );
    }
    


  • nix haeh?!

    haeh?? Pack die Textlaenge doch mit in den Textstrom, denn Du in das Bild unterbringen willst:

    lieszt du pfeife auch den text den du quotest?!

    also koennt ich ja nach den 54 bytes an bitmap header, die text size angeben und danach den zu crypteten text.



  • xoko schrieb:

    lieszt du pfeife auch den text den du quotest?!

    also koennt ich ja nach den 54 bytes an bitmap header, die text size angeben und danach den zu crypteten text.

    Hab ich nicht kapiert, was Du damit sagen wolltest -- wozu einen Bitmap-Header?? Die Bitmap hat doch einen Header.

    Ausserdem ... um die Uhrzeit ... 😉




Anmelden zum Antworten