![]() |
Text-Verschlüsselungsprogramm
Hallo!
Ich habe ein Problem mit einem Verschlüsselungsprogramm für Text, das ich selber geschrieben habe; das funktioniert auch so weit. Nur wenn ich einen längeren Text verschlüsseln lassen will, ist der Text, der dann rauskommt immer viel zu kurz. Wenn ich ihn dann entschlüsseln lasse, kommt auch nur ein bruchteil vom Originaltext raus! Was mache ich da falsch? Hier der Code:
Delphi-Quellcode:
Ich hoffe, ihr könnt mir helfen!
unit Ulticrypt_U;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Button1: TButton; Edit3: TEdit; //Feld für das Passwort Label3: TLabel; Memo1: TMemo; //Originaltext Memo2: TMemo; //Verschlüsselter Text Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); //Die Prozedur fürs Verschlüsseln var S, P:string; I, J:integer; begin S:=Memo1.Text; P:=Edit3.Text; J:=1; try for I:=1 to Length(S) do begin S[I]:=Chr(Ord(S[I]) xor Ord(P[J])); inc(J); if J> Length(P) then J:=1; end; Memo2.Text:=S; except ShowMessage(' Sie müssen ein Passwort eingeben!'); end; end; procedure TForm1.Button2Click(Sender: TObject); //Die Prozedur fürs Entschlüsseln var S, P:string; I, J:integer; begin S:=Memo2.Text; P:=Edit3.Text; J := 1; try for I := 1 to Length(S) do begin S[I] := Chr(Ord(S[I]) xor Ord(P[J])); Inc(J); if J > Length(P) then J := 1; Memo1.Text:=S; end; except ShowMessage(' Sie müssen ein Passwort eingeben!'); end; end; end. |
Re: Text-Verschlüsselungsprogramm
Dann wird wahrscheinlich ein Zeichen im verschlüsselten Text #0 (also Zeichen an Textstelle==Zeichen im Passwort) sein, und damit ist der Text für die andere Procedure zu Ende...
|
Re: Text-Verschlüsselungsprogramm
Und was kann ich dagegen machen? Ich kann doch nicht aus dem ganzen Text alle Zeichen raussuchen, die auch im Passwort vorhanden sind!?!?
|
Re: Text-Verschlüsselungsprogramm
Hallo Ultimator,
Du musst mit Streams arbeiten. z.B.
Delphi-Quellcode:
Achtung: Es handelt sich hierbei um eine extrem primitive Verschlüsselung. Die Verschlüsselung hat auch nur Anschauungscharakter. Habe ich mal für eine AG verwendet
procedure TFormCrypt.SaveCrypt(const Filename: TFilename);
var MStream : TMemoryStream; FileStream : TFilestream; aByte : Byte; begin MStream:=TMemoryStream.Create; FileStream:=TFilestream.Create(Filename,fmCreate); Try memText.Lines.SaveToStream(MStream); // Memo in einen MemoryStream speichern MStream.Position:=0; While MStream.Position<MStream.Size do begin MStream.Read(aByte,SizeOf(Byte)); aByte:=aByte xor iKey; // Verschlüsselung FileStream.Write(aByte,SizeOf(Byte)); end; Finally MStream.Free; Filestream.Free; end; end; procedure TFormCrypt.LoadCrypt(const Filename: TFilename); var MStream : TMemoryStream; FileStream : TFilestream; aByte : Byte; begin MStream:=TMemoryStream.Create; FileStream:=TFilestream.Create(Filename,fmOpenRead); Try FileStream.Position:=0; While FileStream.Position<FileStream.Size do begin FileStream.Read(aByte,SizeOf(Byte)); aByte:=aByte xor iKey; // Entschlüsselung MStream.Write(aByte,SizeOf(Byte)); end; MStream.Position:=0; memText.Lines.LoadFromStream(MStream); Finally MStream.Free; Filestream.Free; end; end; |
Re: Text-Verschlüsselungsprogramm
Tach Ultimator,
bestimmte Steuerzeichen sollte Dein String nicht beinhalten, da sonst von einem Ende des Strings ausgegangen wird und ausserdem können nicht alle Ascii-Zeichen als String ausgegeben werden (z.B. manche Steuerzeichen). Das ist auch der Grund, aus dem Dein String nicht komplett angezeigt wird. :!: Keine Sorge, Du musst Deinen String nicht nach solchen Zeichen durchforsten. :zwinker: Zu Deinem symmetrischen Algorithmus folgender Vorschlag: Speichere den verschlüsselten String gleich in einem BYTE-Array ab und schaue Dir dann die unterschiedlichen Zahlenwerte darin an. Dann wirst Du bemerken, dass Dein String nicht abgeschnitten wurde, sondern manche Bereiche lediglich nicht angezeigt werden können. Beim entschlüsseln ziehst Du Deine Zahlenwerte (in Deinem Beispiel mittels XOR) wieder zurück in den String und enthältst den ursprünglichen Text wieder in seiner entschlüsselten Form. |
Re: Text-Verschlüsselungsprogramm
Ich hab jetz die Lösung von Jens ausprobiert, aber jedes mal, wenn ichs Compilieren will, zeigt mir DELPHI an, dass Memo1 (das Feld, wo der Text zum verschlüsseln rein muss) ein undefinierter Bezeichner ist. Aber ohne die Lösung mit Streams findet er das Memo! Warum? Des kann doch eigentlich gar net sein! Oder bin ich zu blöd dafür? :wiejetzt:
|
Re: Text-Verschlüsselungsprogramm
Hallo,
das Memo in meinem Vorschlag heißt nicht Memo1 sondern memText. |
Re: Text-Verschlüsselungsprogramm
Hier ist der Code, ich hab erst die Verschlüsselungs-Prozedur umgeschrieben:
Delphi-Quellcode:
unit Ulticrypt_U;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TTCryptForm = class(TForm) Label1: TLabel; Label2: TLabel; Button1: TButton; Edit3: TEdit; Label3: TLabel; memText: TMemo; Memo2: TMemo; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var TCryptForm: TCryptForm; implementation {$R *.dfm} procedure Button1Click(const Filename: TFilename); var MStream : TMemoryStream; FileStream : TFilestream; aByte : Byte; begin MStream:=TMemoryStream.Create; FileStream:=TFilestream.Create(Filename,fmCreate); Try memText.SaveToStream(MStream); // Memo in einen MemoryStream speichern MStream.Position:=0; While MStream.Position<MStream.Size do begin MStream.Read(aByte,SizeOf(Byte)); aByte:=aByte xor iKey; // Verschlüsselung FileStream.Write(aByte,SizeOf(Byte)); end; Finally MStream.Free; Filestream.Free; end; end; procedure TTCryptForm.Button2Click(Sender: TObject); var S, P:string; I, J:integer; begin S:=Memo2.Text; P:=Edit3.Text; J := 1; try for I := 1 to Length(S) do begin S[I] := Chr(Ord(S[I]) xor Ord(P[J])); Inc(J); if J > Length(P) then J := 1; Memo1.Text:=S; end; except ShowMessage(' Sie müssen ein Passwort eingeben!'); end; end; end. |
Re: Text-Verschlüsselungsprogramm
der name des memo muss doch angeglcihen werden oder?
Zitat:
|
Re: Text-Verschlüsselungsprogramm
Hallo,
so sollte es gehen:
Delphi-Quellcode:
...
TTCryptForm = class(TForm) Label1: TLabel; Label2: TLabel; Button1: TButton; Edit3: TEdit; Label3: TLabel; memText: TMemo; Memo2: TMemo; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } procedure SaveCrypt(const Filename: TFilename); public { Public-Deklarationen } end; ... procedure TFormCrypt.SaveCrypt(const Filename: TFilename); var MStream : TMemoryStream; FileStream : TFilestream; aByte : Byte; begin MStream:=TMemoryStream.Create; FileStream:=TFilestream.Create(Filename,fmCreate); Try memText.SaveToStream(MStream); // Memo in einen MemoryStream speichern MStream.Position:=0; While MStream.Position<MStream.Size do begin MStream.Read(aByte,SizeOf(Byte)); aByte:=aByte xor iKey; // Verschlüsselung FileStream.Write(aByte,SizeOf(Byte)); end; Finally MStream.Free; Filestream.Free; end; end; ... procedure Button1Click(Sender : TObject); begin SaveCrypt('c:\Text.cyt'); end; ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 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 by Thomas Breitkreuz