AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

verschlüsseln

Ein Thema von Saminem · begonnen am 5. Nov 2010 · letzter Beitrag vom 12. Nov 2010
Antwort Antwort
Saminem

Registriert seit: 18. Aug 2010
14 Beiträge
 
#1

verschlüsseln

  Alt 5. Nov 2010, 08:54
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
  Mit Zitat antworten Zitat
Benutzerbild von pustekuchen
pustekuchen

Registriert seit: 27. Aug 2010
265 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: verschlüsseln

  Alt 5. Nov 2010, 11:01
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.
Delphi programming is awesome.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#3

AW: verschlüsseln

  Alt 5. Nov 2010, 11:11
Da sind wohl einfach noch zu viele Probleme drin, bevor ich jetzt alles erklär...
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

Geändert von Blup ( 5. Nov 2010 um 14:12 Uhr) Grund: Funktion und Oberfläche getrennt
  Mit Zitat antworten Zitat
Saminem

Registriert seit: 18. Aug 2010
14 Beiträge
 
#4

AW: verschlüsseln

  Alt 11. Nov 2010, 19:11
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.
  Mit Zitat antworten Zitat
Joe_the_Junkie
(Gast)

n/a Beiträge
 
#5

AW: verschlüsseln

  Alt 11. Nov 2010, 22:43
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.

MfG

Joe

Edit: Ist DOCH kommentiert. Zwar total schlecht unr irgendwie lustig aber Kommentiert
Angehängte Dateien
Dateityp: zip Bildcode.zip (285,2 KB, 8x aufgerufen)

Geändert von Joe_the_Junkie (11. Nov 2010 um 22:51 Uhr) Grund: Falsche Angaben
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#6

AW: verschlüsseln

  Alt 12. Nov 2010, 09:37
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.

        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:
        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.

          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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: verschlüsseln

  Alt 12. Nov 2010, 11:26
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:13 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