Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   verschlüsseln (https://www.delphipraxis.net/155722-verschluesseln.html)

Saminem 5. Nov 2010 07:54

verschlüsseln
 
Hallo
Mein Problem ich verstecke ein text in ein bild
Delphi-Quellcode:
procedure TForm1.verstecken;
var y,m,x,f,g:integer; P1:pbytearray; Maske,temp,v,a:byte;
begin
  Maske:=254;
  m:=1;
  f:=7;
  g:=0;
  len:=Length(Memo1.Text);
  v:=byte(Memo1.Text[m]);


    For y:=0 to hoehe do begin
      P1:=Image1.picture.Bitmap.ScanLine[y];
        For x:=0 to (breite*3-3) do begin
          temp:=p1[x] and Maske;
          f:=f-g;
          a:=v shr f;
          P1[x]:=temp or a;
            if g<7 then inc(g) else begin
              g:=0;
              inc(m);
            end;
          if m>=len then exit;
              Memo1.clear
        end;
        image1.Refresh;
    end;
  end;
dann will ich es auslesen
Delphi-Quellcode:
procedure Tform1.finden;
  var y,m,x,f,g,q:integer; P2:pbytearray; Maske,temp,v,a,s:byte;w :string;
  begin
  Maske:=1;
  m:=1;
  f:=7;
  g:=0;
  w:='';


    For y:=0 to hoehe do begin
      P2:=Image1.picture.Bitmap.ScanLine[y];
        For x:=0 to (breite*3-3) do begin
        temp:=P2[x] or Maske;
        f:=f-g;
        temp:=temp shl f;
        s:= P2[x] or temp;
        w:= w + chr(s);
        if g>7 then inc(g) else begin
              f:=7; inc(m);
              If m>=len then exit
              end;
              Image1.Refresh;
              Memo1.Text:=w;



  end;
  end;
  end;
Leider gibt er mir dan nicht brauchbares aus bitte um hilfe danke

pustekuchen 5. Nov 2010 10:01

AW: verschlüsseln
 
Zitat:

Zitat von Saminem (Beitrag 1059794)
Hallo
Mein Problem ich verstecke ein text in ein bild

Wenn es ein Problem ist warum machst du es dann? Eine deutlichere Formulierung deines Problems wäre hilfreicher.

Blup 5. Nov 2010 10:11

AW: verschlüsseln
 
Da sind wohl einfach noch zu viele Probleme drin, bevor ich jetzt alles erklär... :coder:
Delphi-Quellcode:
const
  MASKE1 = $FE;
  MASKE2 = $01;

procedure Encode(ABitmap: TBitmap; const AText: AnsiString);
var
  m, mMax, x, xMax, y, yMax, g: Integer;
  a, v: Longword;
  P: PByteArray;
begin
  mmax := Length(AText);
  m := 0;
  {die ersten 32 Bit enthalten die Länge des Textes}
  v := mmax;
  g := 32;
  {richtiges Pixelformat sicherstellen}
  ABitmap.Pixelformat := pf24Bit;
  xMax := ABitmap.Width - 1;
  yMax := ABitmap.Height - 1;
  try
    for y := 0 to yMax do
    begin
      P := ABitmap.ScanLine[y];
      for x := 0 to xMax * 3 do
      begin
        {nächstes Byte holen}
        if g = 0 then
        begin
          Inc(m);
          if m > mmax then
            Exit;
          v := Ord(AText[m]);
          g := 8;
        end;
        {nächstes Bit auswählen}
        Dec(g);
        a := v shr g;
        P[x] := (P[x] and MASKE1) or (a and MASKE2);
      end;
    end;
  finally
    ABitmap.Modified := True;
  end;
end;

function Decode(ABitmap: TBitmap): AnsiString;
var
  x, xMax, y, yMax, m, mMax, g: Integer;
  a, v: Byte;
  P: PByteArray;
begin
  Result := '';
  if ABitmap.Pixelformat <> pf24Bit then
    Exit;

  xMax := ABitmap.Width;
  yMax := ABitmap.Height;
  mMax := (xMax * yMax * 3) div 8;

  if mMax < 4 then
    Exit;

  SetLength(Result, mmax);
  Dec(xMax);
  Dec(yMax);

  v := 0;
  g := 0;
  m := 0;
  for y := 0 to yMax do
  begin
    P := ABitmap.ScanLine[y];
    for x := 0 to xMax * 3 do
    begin
      a := P[x] and Maske2;

      v := (v shl 1) or a;
      Inc(g);

      {nächstes Byte}
      if g = 8 then
      begin
        Inc(m);
        Result[m] := AnsiChar(v);
        v := 0;
        g := 0;
      end;
    end;
  end;

  {Die ersten 4 Zeichen enthalten die tatsächliche Länge des Textes.}
  mMax := 0;
  for m := 1 to 4 do
    mMax := (mMax shl 8) + Byte(Result[m]);

  Result := Copy(Result, 5, mMax);
end;
Delphi-Quellcode:
procedure TForm1.BtnVersteckenClick(Sender: TObject);
begin
  Encode(Image1.Picture.Bitmap, Memo1.Text);
  Memo1.clear
end;

procedure TFTest.BtnFindenClick(Sender: TObject);
begin
  Memo1.Text := Decode(Image1.Picture.Bitmap);
end;
Edit: Funktion und Oberfläche getrennt

Saminem 11. Nov 2010 18:11

AW: verschlüsseln
 
Sry habe mein Problem nicht gut erklärt.
Erst mal zu mir bin 16 Jahre alt und gehe auf ein Gymnasium(Oberstufe 11).
Nun haben wir in Informatik den Arbeitsauftrag gekriegt einen Text in einem Bild zu verstecken.
Unser Lehrer hat uns gesagt wie wir das ungefähr machen sollen im Delphi Code kommentiert(hoffe verständlich);).
Nun sollten wir den Text wieder aus dem Bild rauskriegen.
Und da habe ich Probleme mit.
Deswegen kann ich auch nicht kontrollieren ob ich das Richtige verstecke.
Hier schon mal die Procedure zum "verstecken" so hab ich es jetzt genant.
Und vorher nochmal bitte nicht so was (für euch zwar nicht aber für mich) kompliziertes ändern(mein erstes Jahr mit Delphi,
10 fast nur Scratch und Excell nur wenige stunden Delphi) und wenn doch bitte immer mit Kommentaren.
Delphi-Quellcode:
procedure TForm1.verstecken;
var y,m,x,f,g,len:integer; //f und g Variabel zum shr; y und x Position im Bild; m Variabel position im Memo;len länge memo
    P1:pbytearray; // P1 ist Pbytearray byte an der Position
    Maske,temp,v:byte; // Maske,temp,v um den letzten Bit zu filtern
begin
  Maske:=254; // damit alle Bits 1 sind außer das letzte
  m:=1; // Erster Buchstabe im Memo
  f:=7; // weil man um 7 nach rechts shr
  g:=0; // um ein byte zu füllen immer ein weniger
  len:=Length(Memo1.Text); //länge des memo


    For y:=0 to hoehe-1 do begin // im bild codieren
      P1:=Image1.picture.Bitmap.ScanLine[y]; // scannt das image an der stelle y
        For x:=0 to (breite*3) do begin // an der stelle x das byte verändern
          v:=ord(Memo1.Text[m]); // Buchstabe in Zahl und dann ins byte
          f:=7; // damit f immer wieder null wird
          temp:=p1[x] and Maske; //p1 byte und maske um das letzte bit 0 zu setzen
          f:=f-g; // da man im nächsten byte die 2te stelle 0 setzt
          v:=v shr f; // um das erste bit des buchstaben zu bekommen
          P1[x]:=temp or v; // um das byte mit dem letzten bit verändert wieder ins memo zu schreiben
            if g<7 then inc(g) else begin // damit man immer nur maximal nach 6 shiftet
              g:=0; // g wieder 0 setzen
              f:=7; // eigentlich überflüssig da man oben schon f auf 7 setz als soppelte sicherheit ;)
              inc(m); // um neuen Buchstaben zu bekommen
              end;

          if m>=len then // verhindert das diese schleife das ganze bild verändert
           exit; // Aktion um diese Procedure zu beenden
        end; // Annmerkung hoehe und breite schon im private deklariet
    end;
  end;
Wie ihr sieht habe ich hier und da etwas verändert.
Hoffe ihr könnt mir Helfen da ich morgen eine 3 stündige Klausur über das Thema Codieren schreibe.
Die Procedure zum finden habe ich wieder gelöscht da ich vermute Fehler gemacht zu haben.

Joe_the_Junkie 11. Nov 2010 21:43

AW: verschlüsseln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Ich hab mal vor langer langer Zeit ein kleines Programm geschrieben, dass einen Text in einem Bild versteckt. Ist zwar nicht das gelbe vom Ei, aber es funktioniert.
Ich habs mal angehängt.

Ist leider unkommentiert, aber vlt kommste auch so damit klar.
Leider besitze ich auch kein Delphi mehr, da mein Augenmerk im Moment
nur auf C++(Uni) und PHP liegt, daher mache ich auch nicht mehr am Quelltext.:zwinker:

MfG

Joe

Edit: Ist DOCH kommentiert. Zwar total schlecht unr irgendwie lustig aber Kommentiert ;-)

Blup 12. Nov 2010 08:37

AW: verschlüsseln
 
Normalerweise trennt man die Darstellung, Ein- und Ausgabe im Formular von der fachlichen Logik.
Das dient der Übersichtlichkeit und erleichtert die Fehlersuche.
Außerdem kann man den Code so später an anderer Stelle wiederverwenden.

Delphi-Quellcode:
  Maske:=254; // damit alle Bits 1 sind außer das letzte
{...}
Eigentlich ist die eine Konstante und sollte auch als solche deklariert werden.

Delphi-Quellcode:
  f:=7; // weil man um 7 nach rechts shr
{...}
An dieser Stelle überflüssig, da die Variable immer überschrieben wird, sollte der Compiler auch melden.

Delphi-Quellcode:
len:=Length(Memo1.Text); //länge des memo
{...}
Eine wichtige Information, die du aber nicht im Bild speicherst.
Schon aus diesem Grund wird es schwierig den Text wieder aus dem Bild zu extrahieren.
Siehe in meinem Beispiel weiter oben.
Da es sich nur um reinen Text handelt, kannst du am Ende des Textes auch ein Null-Zeichen (Binär #0) speichern,
um das Ende zu markieren. Besonders schön ist das aber auch nicht.

Delphi-Quellcode:
For y:=0 to hoehe-1 do begin
{...}
Wo kommen den auf einmal "hoehe" und "breite" her?
Globale Variablen? Pfui!
Entweder du definierst lokale Variablen
Delphi-Quellcode:
hoehe := Image1.picture.Bitmap.Height;
breite := Image1.Picture.Bitmap.Width;
oder benutzt gleich diese Property.

Delphi-Quellcode:
        For x:=0 to (breite*3) do begin // an der stelle x das byte verändern
<- Fehler
Die Variable x wird hier zu groß. Die Zeile besteht im Pixelformat pf24Bit aus (breite *3) Byte, da die Zählung mit 0 beginnt:
Delphi-Quellcode:
        For x:=0 to (breite*3) - 1 do begin // an der stelle x das byte verändern
<- Richtig
Warum rückst du an dieser Stelle eigentlich den Code ein?

Delphi-Quellcode:
          f:=7; // damit f immer wieder null wird
          temp:=p1[x] and Maske; //p1 byte und maske um das letzte bit 0 zu setzen
          f:=f-g; // da man im nächsten byte die 2te stelle 0 setzt
          v:=v shr f; // um das erste bit des buchstaben zu bekommen
Warum nicht gleich so:
Delphi-Quellcode:
          temp:=p1[x] and Maske; //p1 byte und maske um das letzte bit 0 zu setzen
          v:=v shr (7 - g); // um das jeweilige bit des buchstaben zu bekommen
Damit entfällt f komplett.

Delphi-Quellcode:
          P1[x]:=temp or v; // um das byte mit dem letzten bit verändert wieder ins memo zu schreiben
Das unterste Bit von "temp" ist 0.
Das unterste Bit von "v" enthält die zu speichernde Information (0 oder 1).
Aber die anderen Bits von v sind nicht unbedingt leer und müssen vorher ausmaskiert werden.
Delphi-Quellcode:
 Maske2 = 1;
{nur unterstes Bit in v enthält die Information, Rest vor der verknüpfung löschen}
P1[x]:=temp or (v and Maske2);
Delphi-Quellcode:
          if m>=len then // verhindert das diese schleife das ganze bild verändert
           exit; // Aktion um diese Procedure zu beenden
Fehler, da wird ein zeichen zu wenig gespeichert, da der Text von 1 bis len geht.


Hier noch ein kurzes Beispiel wie man ein zusätzliches Nullzeichen speichern kann, um das Textende zu markieren:
Delphi-Quellcode:
        For x:=0 to (breite*3) - 1 do begin // an der stelle x das byte verändern
          if m <= len then
            v:=ord(Memo1.Text[m]); // Buchstabe in Zahl und dann ins byte
          else
            v := 0;
          temp:=p1[x] and Maske; //p1 byte und maske um das letzte bit 0 zu setzen
          v:=v shr (7 - g); // um das jeweilige Bit des Buchstaben zu bekommen
          P1[x]:=temp or v; // um das byte mit dem letzten bit verändert wieder ins memo zu schreiben
          if g<7 then // damit man immer nur maximal nach 6 shiftet
            inc(g)
          else
          begin
            g:=0; // g wieder 0 setzen
            inc(m); // um neuen Buchstaben zu bekommen
          end;

          if m> (len + 1) then // verhindert das diese schleife das ganze bild verändert
           exit; // Aktion um diese Procedure zu beenden
        end; // Annmerkung hoehe und breite schon im private deklariet

Luckie 12. Nov 2010 10:26

AW: verschlüsseln
 
Nur um das mal klar zu stellen. Es handelt sich hier nicht um eine Verschlüsselung, es wird ja nichts verschlüsselt. Sondern hier werden Informationen versteckt. Dies nennt man Steganographie.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz