AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Steganographie

Ein Thema von schokoschnecke · begonnen am 11. Feb 2011 · letzter Beitrag vom 12. Feb 2011
Antwort Antwort
schokoschnecke

Registriert seit: 8. Nov 2010
7 Beiträge
 
#1

Steganographie

  Alt 11. Feb 2011, 14:28
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
37.228 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Steganographie

  Alt 11. Feb 2011, 14:40
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:
if r mod 2 = 1 then
  r := r - 1
else
  r := r + 1;
entspricht
r := r xor 1;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
schokoschnecke

Registriert seit: 8. Nov 2010
7 Beiträge
 
#3

AW: Steganographie

  Alt 11. Feb 2011, 22:38
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!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Steganographie

  Alt 12. Feb 2011, 09:10
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:
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;
Variante b
Delphi-Quellcode:
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;
Und wenn der Formatierer es unterstützen würde, würde ich es auch gerne so haben wollen
Delphi-Quellcode:
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;
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 end; fehlt
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (12. Feb 2011 um 09:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
37.228 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Steganographie

  Alt 12. Feb 2011, 10:42
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:
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;
PS: um eine größere/sichtbarere Änderung zu erziehlen
Delphi-Quellcode:
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;
(oder 64, bzw. 128)

und nochmal verkürtzt (mit 1);
Delphi-Quellcode:
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]);
PS:
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf