Stegano



  • Hi

    Ich möchte mir einen Steganographie-Algorythmus schreiben und habe dazu folgende fragen:

    ich habe ein pixel char i[3]; (Was sie drei RGB- Farbkomponenten beinhaltet)
    wie kann ich in diesem Pixel ein ASCI-Zeichen, z.b.: 'a' verstecken?

    --> Beispiel soll ersteinmal nur für ein einziges Pixel dienen!



  • zerofx schrieb:

    Algorythmus

    sagt mir jetzt grade nichts, aber ich versuchs trotzdem mal.

    Beide Informationen (Farbe und Buchstabe) bekommst du nicht unter, aber du kannst ja etwas wegschmeissen, z.B. die letzten 2 Bits von jedem Farbanteil, das wird nicht viel auffallen.



  • Klar geht das !
    Du hast ja nen Zeiger auf deinen RGB Wert. Der Zeiger zeigt auf einen zusammenhängenden 24 Bit Speicherbereich. Jetzt brauchst du dich nur noch zu entscheiden, ab welchem Bit ( 0 bis 16 für ASCII, 0 bis 17 für ANSI ) dein Buchstabe anfangen soll. 😉



  • Ja, danke, soweit bin ich mir auch klar, aber wie kann ich das realisieren? konkretes Beispiel?

    Ich meine: von mir aus können es auch x-Pixel sein, um den einen ASCI Wert unterzubekommen.



  • dEr kRyPtOgRaFiKeR schrieb:

    Klar geht das !
    Du hast ja nen Zeiger auf deinen RGB Wert. Der Zeiger zeigt auf einen zusammenhängenden 24 Bit Speicherbereich. Jetzt brauchst du dich nur noch zu entscheiden, ab welchem Bit ( 0 bis 16 für ASCII, 0 bis 17 für ANSI ) dein Buchstabe anfangen soll. 😉

    Von Steganographie kann man dann aber nicht mehr sprechen, wenn ein ganzer Farbkanal für das "Verstecken" eines Zeichens verwendet wird.
    Man sollte lieber die zwei oder drei niederwertigsten Bits jedes Farbkanals für das Verstecken verwenden.

    Edit:

    unsigned char pixel[3]={55,78,240};
    unsigned char zeichen=97;
    pixel[0]=(pixel[0]&(~7))|(zeichen>>5);
    pixel[1]=(pixel[1]&(~3))|((zeichen&0x18)>>3);
    pixel[2]=(pixel[2]&(~7))|(zeichen&7);
    

    Ich erhebe sicherheitshalber mal keinen Anspruch auf Richtigkeit des Beispiels.
    Aber es sollte zwei Bits im grünen Farbkanal verstecken (angenommen pixel[1] ist grün) und jeweils drei in den anderen beiden Kanälen.



  • Das gefällt mir schoneimal.
    Noch eine gegenfrage: wie kann ich es wieder entschlüsseln?
    Und wo kann ich mir brauchbare Infos über die binären(?) Operatoren beschaffen?



  • Bzw, wie müsste ich Änderungen vornehmen, wenn ich ein byte auf 2, 4 oder x Pixel verteile?

    mfg



  • Ich hatte mir folgendes vorgestellt:

    ich setzte das letzte bit jedes bytes auf 0 und überschreibe es dann mit dem jeweiligen bit von meinem char-Wert.
    --> Also bekomme ich ein byte in 8 Bit unter und zwar: RGB RGB RG

    --> wie realisiert man das?



  • unsigned char pixel[9]; //jeweils drei Pixel
    unsigned char zeichen; //unser zu versteckendes Zeichen
    for (int i=0;i<8;i++)
    {
     pixel[i]=(pixel[i]&(~1))|((zeichen&(1<<i))>>i);
     /* ~ kehrt alle Bits in der binären Darstellung um:
        1 (00000001) wird also zu (11111110).
        & liefert im Ergebnis für jedes Bit, das in beiden Operanden gesetzt war, eine 1
        Beispiel: 55 (00110111) & 11111110 ergibt 00110110
        Dies erreicht also, dass das letzte Bit immer auf 0 gesetzt wird.
        << schiebt die ganze Bitfolge nach links, >> nach rechts
        Beispiel: i=5, zeichen=97 (01100001)
        1 (00000001) << 5 ist 00100000; 01100001&00100000 ist 00100000
        00100000 >> 5 ist wieder 1. Das ganze liefert also das Bit an (i+1)-letzter Stelle
        & liefert im Ergebnis für jedes Bit, das in einem oder beiden der Operanden gesetzt war, eine 1
        00110110 | 00000001 liefert dann 00110111 als Endergebnis.*/
    }
    


  • Lies dir erstmal die Grundlagen zu den Bit-Operatoren durch:
    http://de.wikipedia.org/wiki/Bitweiser_Operator
    Und dann kannst du nochmal konkret Fragen zu der Steganographie stellen.



  • Nanyuki schrieb:

    Von Steganographie kann man dann aber nicht mehr sprechen, wenn ein ganzer Farbkanal für das "Verstecken" eines Zeichens verwendet wird.
    Man sollte lieber die zwei oder drei niederwertigsten Bits jedes Farbkanals für das Verstecken verwenden.

    Natürlich kann man das. Es ist doch nirgends verbindlich definiert, wie viele Bits für ein Zeichen zu reservieren sind. Das kann man sich selbst aussuchen.

    zerofox schrieb:

    Ich hatte mir folgendes vorgestellt:

    ich setzte das letzte bit jedes bytes auf 0 und überschreibe es dann mit dem jeweiligen bit von meinem char-Wert.
    --> Also bekomme ich ein byte in 8 Bit unter und zwar: RGB RGB RG

    --> wie realisiert man das?

    mach dir doch erstmal klar, wie eine 8-bit zahl binär aussieht.

    unsigned char ein_byte		= 255;	// 1111 1111
    	unsigned char bitmaske		= 127;  // 0111 1111
    	unsigned char eins_setzen	= 128;	// 1000 0000
    
    	unsigned char neues_byte = 0;
    
    	// letztes bit 0 setzen
    	neues_byte = ein_byte & bitmaske; // ergebnis: 1111 1111
    
    	// letztes bit 1 setzen
    	neues_byte = neues_byte | eins_setzen; // ergebnis: 0111 1111
    

    http://de.wikipedia.org/wiki/Bitweiser_Operator
    http://de.wikipedia.org/wiki/Bitweise_Verschiebung
    http://www2.informatik.uni-halle.de/lehre/c/c_operbm.html
    🙂
    MfG d.k



  • Ok, vielen Dank, dass hat mir sehr weiter geholfen!

    mfg zerofx



  • dEr kRyPtOgRaFiKeR schrieb:

    Natürlich kann man das. Es ist doch nirgends verbindlich definiert, wie viele Bits für ein Zeichen zu reservieren sind. Das kann man sich selbst aussuchen.

    Das ist zwar nicht definiert, aber Steganographie ist ja die Kunst, geheime Nachrichten in einem Medium unauffällig zu verstecken.
    Wenn man von irgendeinem Foto ausgeht und dann einen ganzen Farbkanal mit beliebigen Werten überschreibt, wird das einem Betrachter durchaus auffallen.



  • Nanyuki schrieb:

    Das ist zwar nicht definiert, aber Steganographie ist ja die Kunst, geheime Nachrichten in einem Medium unauffällig zu verstecken.
    Wenn man von irgendeinem Foto ausgeht und dann einen ganzen Farbkanal mit beliebigen Werten überschreibt, wird das einem Betrachter durchaus auffallen.

    Iwo, nüschts fällt auf. Ich übertrage ein Top-Modell mit dicken Ballons 😃
    und einen verrauschten Hintergrund mit manipulierten Pixeln.
    Also, wenn das keine Kunst ist 😉



  • 14 Pixel a 3 Byte.
    Wie lautet die versteckte Nachricht ?

    001100010011001100110110
    011101111101001000000101
    111111111001100101000000
    011111111101101100010101
    111101101001101100000000
    011111111001101111000001
    111111111100100000000000
    111101111101001110000001
    011110111001100001000100
    111111111101101110000101
    011110111101111001000000
    111011111101110101010001
    011101111101101011000100
    111111111101101001010001

    Tip: Der erste Pixel ist der 'Header'.

    MfG d.k.



  • Selbsternannte Krypto-Spezies begreifen das wohl nie :

    Cyphertext ohne Hinweis auf das Chiffrierverfahren kann alles heißen und alles ist auch die einzige Lösung.

    Der Hinweis auf den "Header" ist völlig sinnfrei.

    Frag Bob + Alice, die kennen sich damit aus. 👍



  • kannste mal sehen, selbst solche 14 poplige pixel scheinen für dich unknackbar zu sein



  • Hast es also immer noch nicht begriffen ? 👎


Anmelden zum Antworten