Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Text-Verschlüsselungsprogramm (https://www.delphipraxis.net/17461-text-verschluesselungsprogramm.html)

Ultimator 5. Mär 2004 21:53


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:
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.
Ich hoffe, ihr könnt mir helfen!

The-X 8. Mär 2004 18:22

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

Ultimator 9. Mär 2004 13:23

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!?!?

Jens Schumann 9. Mär 2004 13:40

Re: Text-Verschlüsselungsprogramm
 
Hallo Ultimator,
Du musst mit Streams arbeiten.
z.B.
Delphi-Quellcode:
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;
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

Dannyboy 9. Mär 2004 13:49

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.

Ultimator 9. Mär 2004 20:18

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:

Jens Schumann 9. Mär 2004 20:21

Re: Text-Verschlüsselungsprogramm
 
Hallo,
das Memo in meinem Vorschlag heißt nicht Memo1 sondern memText.

Ultimator 9. Mär 2004 20:33

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.

zecke 9. Mär 2004 20:36

Re: Text-Verschlüsselungsprogramm
 
der name des memo muss doch angeglcihen werden oder?

Zitat:

Try
memText.SaveToStream(MStream); // Memo in einen MemoryStream speichern
MStream.Position:=0;
While MStream.Position<MStream.Size do
weil du benutzt Memo1 und nicht memText als Name des Memo

Jens Schumann 9. Mär 2004 20:37

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.
Seite 1 von 2  1 2      

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