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
111111111101101001010001Tip: 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 ?