![]() |
Steganographie
Hallo,
Wir nehmen in der Schule gerade Steganographie durch. Das Programm soll eine Textdatei einlesen und sie im Binärcode wieder ausgeben. Dann soll man eine Bilddatei einfügen können und den Code aus dem Textdokument dadrin verstecken. Der Aufbau meines Programmes ist laut meines Lehrers richtig, er konnte keinen Fehler finden. Allerdings versteckt es den Text nicht im Bild (Habe es mit einem komplett weißen Bild überprüft). Ich weiß nicht woran es liegt. Ich habe mit showmessage schon überprüft, ob er meine Variable letter auch hochsetzt, da sind keine Probleme. Auch bei x und y zählt er hoch, allerdings wundert es mich, dass er zb. von 1-15 zählt und dann wieder bei 1 beginnt und neu anfängt. Könnte das der Fehler sein? Bei letter hat er nach dem ersten Durchgang einfach aufgehört. Ich arbeite mit Delphi 2005, falls das von Interesse ist. Wäre super, wenn mir jemand helfen könnte! :)
Delphi-Quellcode:
procedure TForm1.Button6Click(Sender: TObject);
var x,y,laenge,letter : integer; r,g,b : byte; color : longint; begin laenge := length(memo2.Text); letter := 1; for y := 1 to 100 do begin for x := 1 to 100 do begin color := colortorgb(image1.Canvas.Pixels[x,y]); r := getRValue(color); g := getGValue(color); b := getBValue(color); if (r mod 2) <> (strtoint(memo2.lines.text[letter])) then begin if r mod 2 = 1 then r := r-1 else r := r+1; end; if letter = laenge then begin image1.canvas.pixels[x,y] := RGB(r,g,b); exit; end; letter := letter + 1; if (g mod 2) <> (strtoint(memo2.text[letter])) then begin if g mod 2 = 1 then g := g-1 else g := g+1; end; if letter = laenge then begin image1.canvas.pixels[x,y] := RGB(r,g,b); exit; end; letter := letter + 1; if (b mod 2) <> (strtoint(memo2.text[letter])) then begin if b mod 2 = 1 then b := b-1 else b := b+1; end; if letter = laenge then begin image1.canvas.pixels[x,y] := RGB(r,g,b); exit; end; letter := letter + 1; image1.canvas.pixels[x,y] := RGB(r,g,b); end; end; |
AW: Steganographie
Im Memo2 stehen also nur 0en und 1en drin?
Hmm, falsch sieht es wirklich nicht aus. Was sagt denn der Debugger, wenn du dir da die Werte ansieht und die Befehle, welche ausgeführt werden? Speicherst du das Bild dann auch ab und um was für ein Bild handelt es sich denn? > es muß ein Bitmap mit mindestens 24 Bit Farbtiefe sein. PS:
Delphi-Quellcode:
entspricht
if r mod 2 = 1 then
r := r - 1 else r := r + 1;
Delphi-Quellcode:
r := r xor 1;
|
AW: Steganographie
Hallo,
Ja, im Memo2 Feld befinden sich nur 0 und 1en. Es ist ein Bitmap Bild, 24 Bit Farbtiefe heißt wohl rot, grün, blau (je 8 Bit?). Ja, so eins ist das. Das Bild wird in ein image Feld geladen und ist dort auch die ganze Zeit sichtbar. Also wird es wohl gespeichert oder? Also das Programm hat auch noch ein Part, wo man die RGB Werte auslesen lassen kann und ändern kann, das funktioniert. Kann also ein pinkes Pixel schwarz machen und so. Nur mit dem Text geht es halt nicht. Und jetzt hab ichs noch einmal probiert und es geht. Komisch, vorhin und in der Schule ging es nicht... Aber danke, vor allem für den Tipp wie ich es kürzer schreiben kann! :) |
AW: Steganographie
Vor allem solltest du den Quelltext formatieren.
Schau mal welche Variante du besser und schneller erfassen kannst. Mit dem eigenen Code geht das dann auch viel besser. Variante a
Delphi-Quellcode:
Variante b
procedure machwas;
begin for idx:=0 to 100 do begin ShowMessage(IntToStr(idx)); if idx>50 then ShowMessage('Toll') else ShowMessage('nee'); end; ShowMessage(IntToStr(idx)); end;
Delphi-Quellcode:
Und wenn der Formatierer es unterstützen würde, würde ich es auch gerne so haben wollen
procedure MachWas;
begin for idx := 0 to 100 do begin ShowMessage( IntToStr( idx ) ); if idx > 50 then ShowMessage( 'Toll' ) else ShowMessage( 'ja' ); end; ShowMessage( IntToStr( idx ) ); end;
Delphi-Quellcode:
EDIT: ich habe deinen Quelltext mal durch den Delphi-Formatter gejagt und stelle jetzt sofort fest, dass auf jeden Fall das da am Schluss noch ein
procedure MachWas;
begin for idx := 0 to 100 do begin ShowMessage( IntToStr( idx ) ); if idx > 50 then ShowMessage( 'Toll' ) else ShowMessage( 'ja' ); end; ShowMessage( IntToStr( idx ) ); end;
Delphi-Quellcode:
fehlt
end;
Delphi-Quellcode:
procedure TForm1.Button6Click( Sender : TObject );
var x, y, laenge, letter : integer; r, g, b : byte; color : longint; begin laenge := length( memo2.Text ); letter := 1; for y := 1 to 100 do begin for x := 1 to 100 do begin color := colortorgb( image1.Canvas.Pixels[x, y] ); r := getRValue( color ); g := getGValue( color ); b := getBValue( color ); if ( r mod 2 ) <> ( strtoint( memo2.lines.Text[letter] ) ) then begin if r mod 2 = 1 then r := r - 1 else r := r + 1; end; if letter = laenge then begin image1.Canvas.Pixels[x, y] := RGB( r, g, b ); exit; end; letter := letter + 1; if ( g mod 2 ) <> ( strtoint( memo2.Text[letter] ) ) then begin if g mod 2 = 1 then g := g - 1 else g := g + 1; end; if letter = laenge then begin image1.Canvas.Pixels[x, y] := RGB( r, g, b ); exit; end; letter := letter + 1; if ( b mod 2 ) <> ( strtoint( memo2.Text[letter] ) ) then begin if b mod 2 = 1 then b := b - 1 else b := b + 1; end; if letter = laenge then begin image1.Canvas.Pixels[x, y] := RGB( r, g, b ); exit; end; letter := letter + 1; image1.Canvas.Pixels[x, y] := RGB( r, g, b ); end; end; |
AW: Steganographie
Ach ja, wie hast du denn geprüft, ob sich was verändert?
Eine Farbänderung von 1 ist mit blosem Auge nicht unbedingt erkennbar. Und wenn man sich nochmal diesen Code vornimmt.
Delphi-Quellcode:
PS: um eine größere/sichtbarere Änderung zu erziehlen
if (r mod 2) <> (strtoint(memo2.lines.text[letter])) then
begin if r mod 2 = 1 then r := r-1 else r := r+1; end;
Delphi-Quellcode:
(oder 64, bzw. 128)
if (r mod 2) <> (strtoint(memo2.lines.text[letter])) then
begin if (r div 32) mod 2 = 1 then r := r - 32 else r := r + 32; end; und nochmal verkürtzt (mit 1);
Delphi-Quellcode:
PS:
if (r mod 2) <> (strtoint(memo2.lines.text[letter])) then
begin if r mod 2 = 1 then r := r-1 else r := r+1; end; // inneres IF rausgekürzt if (r mod 2) <> strtoint(memo2.lines.text[letter]) then begin r := r xor 1; end; // nun das äußere IF r := (r and not 1) or (strtoint(memo2.lines.text[letter]) and 1); // und da in Memo2 eh nur 0 oder 1 drinsteht r := (r and not 1) or strtoint(memo2.lines.text[letter]); das mathematische "r mod 2" entspricht dem binären "r and 1" Da es sich hier um Bitmanipilationen handelt, ist es eigentlich passender, wenn man auch Bitoperationen verwendet, anstatt von Mathematischen. "r xor 1", "r and 1" oder "r or 1" verändern nur das letzte Bit "r and NOT 1" verändert alle Bits, bzw. läßt nur das letzte Bit übrig und löscht den Rest Aktuell fragt ihr ab ob sich das letzte Bit enes Farbwertes von dem gewünschten Bit unterscheidet, wenn ja, dann wird nochmal nachgesehn, ob das Bit an oder aus ist und wird dann umgeschaltet ... kürzer geht es, wenn man einfach direkt das letzte Bit auf den gewünschten Wert setzt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz