Delphi-PRAXiS

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

Jens Schumann 9. Mär 2004 20:39

Re: Text-Verschlüsselungsprogramm
 
Zitat:

Zitat von oH LoRd
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

Wenn man in die Klasse von TFormCrypt schaut kann man folgendes erkennen:
Delphi-Quellcode:
memText: TMemo
Memo2: TMemo;
D.h. die Namen sind schon Ok.

Nur Ultimator hat die procedure Button1Click so verändert, dass es keine Methode mehr von
TFormCrypt ist. Deshalb werden die Memos nicht gefunden.

zecke 9. Mär 2004 21:30

Re: Text-Verschlüsselungsprogramm
 
ach k ich hatte das übersehen :oops:

Ultimator 10. Mär 2004 14:45

Re: Text-Verschlüsselungsprogramm
 
Danke Leute! Jetzt funktionierts! :thuimb: Ich werd jetz weiter dran arbeiten!

Akut-Programming 14. Apr 2004 11:08

Re: Text-Verschlüsselungsprogramm
 
Könnte mir mal jmd. erklären, was es mit der iKey Variable oder Konstante aufsich hat?! Hab hier im Forum schon geguckt, aber aufschlussreiches dazu hab ich nicht gefunden.

Mirilin 14. Apr 2004 11:11

Re: Text-Verschlüsselungsprogramm
 
:hi:

klick

ganz unten wird einewenig auf XOR-Verschüsselung eingegangen ... falls das nicht reichen sollte -> Google :wink:

mfg Tobias

Ultimator 14. Apr 2004 11:24

Re: Text-Verschlüsselungsprogramm
 
Der iKey ist das Passwort, mit dem der Text verschlüsselt wird. Man kann ihn im Edit-Feld eingeben.

Akut-Programming 14. Apr 2004 11:30

Re: Text-Verschlüsselungsprogramm
 
Dank dir Mirilin.. ich hab iKey erstmal als Konstante fest vergeben... und da funzt es.. :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:41 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