![]() |
verschlüsseln
Hallo
Mein Problem ich verstecke ein text in ein bild
Delphi-Quellcode:
dann will ich es auslesen
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;
Delphi-Quellcode:
Leider gibt er mir dan nicht brauchbares aus bitte um hilfe danke
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; |
AW: verschlüsseln
Zitat:
|
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:
Edit: Funktion und Oberfläche getrennt
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; |
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:
Wie ihr sieht habe ich hier und da etwas verändert.
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; 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. |
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 ;-) |
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:
Eigentlich ist die eine Konstante und sollte auch als solche deklariert werden.
Maske:=254; // damit alle Bits 1 sind außer das letzte
{...}
Delphi-Quellcode:
An dieser Stelle überflüssig, da die Variable immer überschrieben wird, sollte der Compiler auch melden.
f:=7; // weil man um 7 nach rechts shr
{...}
Delphi-Quellcode:
Eine wichtige Information, die du aber nicht im Bild speicherst.
len:=Length(Memo1.Text); //länge des memo
{...} 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:
Wo kommen den auf einmal "hoehe" und "breite" her?
For y:=0 to hoehe-1 do begin
{...} Globale Variablen? Pfui! Entweder du definierst lokale Variablen
Delphi-Quellcode:
oder benutzt gleich diese Property.
hoehe := Image1.picture.Bitmap.Height;
breite := Image1.Picture.Bitmap.Width;
Delphi-Quellcode:
<- Fehler
For x:=0 to (breite*3) do begin // an der stelle x das byte verändern
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:
<- Richtig
For x:=0 to (breite*3) - 1 do begin // an der stelle x das byte verändern
Warum rückst du an dieser Stelle eigentlich den Code ein?
Delphi-Quellcode:
Warum nicht gleich so:
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
Delphi-Quellcode:
Damit entfällt f komplett.
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
Delphi-Quellcode:
Das unterste Bit von "temp" ist 0.
P1[x]:=temp or v; // um das byte mit dem letzten bit verändert wieder ins memo zu schreiben
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:
Fehler, da wird ein zeichen zu wenig gespeichert, da der Text von 1 bis len geht.
if m>=len then // verhindert das diese schleife das ganze bild verändert
exit; // Aktion um diese Procedure zu beenden 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 |
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 16:21 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