Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Codieren mit Passwort (https://www.delphipraxis.net/154028-codieren-mit-passwort.html)

Matze33 25. Aug 2010 13:12


Codieren mit Passwort
 
Hi,
ich hab hier ein Problem. Bin noch Delphi Anfänger und hab Version 6.

Also in der Schule haben wir die Aufgabe bekommen, einen Codierer zu erstellen, der den Text mit einem Passwort verschlüsselt. Das geht auch schon bei mir - fast. Es wird immer nur bis an die Stelle codiert, wo der Buchstabe im Passwort kommt. Also wenn man dann zB einen engliscen Text hat und als Passwort Ä setzt, geht alles.
Mein Lehrer hat mir dann gesagt, ich soll die Verarbeitung in einem Array of Bytes machen. Da hab ich vorher noch nie mit gearbeitet und hab dementsprechend keine Ahnung, wie ich da ran gehe.
Also momentan sieht mein Code so aus:

Delphi-Quellcode:
unit U_Codieren2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, Buttons, ExtCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Neu1: TMenuItem;
    ffnen1: TMenuItem;
    Speicherals1: TMenuItem;
    Schlieen1: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Hilfe1: TMenuItem;
    Info1: TMenuItem;
    Btn_Codieren: TBitBtn;
    E_Passwort: TLabeledEdit;
    procedure Schlieen1Click(Sender: TObject);
    procedure Neu1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ffnen1Click(Sender: TObject);
    procedure Speicherals1Click(Sender: TObject);
    procedure Info1Click(Sender: TObject);
    procedure Btn_CodierenClick(Sender: TObject);
  private
  Arbeit:Array [0..1000] of byte;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Schlieen1Click(Sender: TObject);
begin
 close;
end;

procedure TForm1.Neu1Click(Sender: TObject);
begin
  Memo1.Clear;
  E_Passwort.Clear;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
  E_Passwort.Clear;
end;

procedure TForm1.ffnen1Click(Sender: TObject);
begin
  if(OpenDialog1.Execute) then Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;

procedure TForm1.Speicherals1Click(Sender: TObject);
begin
  if SaveDialog1.Execute then Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;

procedure TForm1.Info1Click(Sender: TObject);
begin
  //
end;

procedure TForm1.Btn_CodierenClick(Sender: TObject);
var
  V_Text, V_Passwort:string;
  i, step,d:Integer;
begin
  d:=0;
  V_Passwort:=E_Passwort.Text;
  V_Text:=Memo1.Text;
  for i:=1 to length(V_Text) do
  begin
    step:=Ord(V_Passwort[d]);
    d:=d+1;
  if d>length(V_Passwort) then d:=1;
  V_Text[i]:=char(step XOR Ord(V_Text[i]));
  Memo1.Text:=V_Text;
  end;
end;

end.
Wäre toll, wenn ihr mir das verbessern könntet und auch etwas erklären (wenn es nicht eh eindeutig ist ;) )

Gruß

DeddyH 25. Aug 2010 13:32

AW: Codieren mit Passwort
 
Hallo und Willkommen in der DP :dp:,

geht Ihr in dieselbe Klasse?

himitsu 25. Aug 2010 13:40

AW: Codieren mit Passwort
 
Ob nun ArrayOfByte oder String ist egal.
In Delphi haben die String ein Feld für die Längenangabe, weswegen diesen bestimmte Steuerzeichen vollkommen egal sind.

Vermutlich das selbe Problem: http://www.delphipraxis.net/154014-delphi-xor.html

Dein Memo kann mit bestimmten Zeichen nicht so umgehn, wie du es möchtest.
Sobald z.B. im Text, durch deine Kodierung, das Zeichen #0 vorkommt, dann bricht das Memo immer an dieser Stelle ab, da die #0 soviel wie "Ende" bedeutet.

Matze33 25. Aug 2010 13:43

AW: Codieren mit Passwort
 
Scheint ganz so xD

In dem Thread sind ja doch schon ziemlich viele Änderungen.
Ich fänds trotzdem toll, wenn das noch mal in einem Code gemacht werden könnte und nicht in sieben verschiedenen, die sich teilweise selbst widersprechen^^

Übrigens tolle Community habt ihr hier, wirklich!

himitsu 25. Aug 2010 13:52

AW: Codieren mit Passwort
 
Wie schon beim Anderen gesagt:
Schau mal im Debugger, was wirklich in deinem V_Text drinsteht und nicht was im Memo angezeigt wird.

Bei eurer XOR-Operation können Zeichen entstehen, mit welchen das Memo nunmal nicht korrekt (so wie ihr es wollt) umgehen kann und daran läßt nichts ändern.

Ihr müßtest eure Verschlüsselung so ändern, daß solche Zeichen nicht entstehen können, aber dann ist es auch keine "direkte" XOR-Verschlüsselung mehr.

Zum Testen kannst du ja einfach mal dieses machen;
Delphi-Quellcode:
Memo1.Text := AllesAnzeigen(V_Text);
und dazu noch dieses
Delphi-Quellcode:
function AllesAnzeigen(S: String): String;
var
  i: Integer;
begin
  Result := '';
  for i := 1 to Length(S) do
    if S[i] >= ' ' then Result := Result + S[i]
    else Result := Result + Format('{%d}', [Ord(S[i])]);
end;
Jetzt werden die "bösen" Steuerzeichen in einen Text "{nummer}" umgewandelt.

DeddyH 25. Aug 2010 14:21

AW: Codieren mit Passwort
 
Man könnte das Problem aber minimieren, indem man einfach zum exklusiv veroderten Wert 32 addiert (beim Verschlüsseln) bzw. vor dem Verodern subtrahiert (beim Entschlüsseln), oder habe ich da einen Denkfehler drin?

himitsu 25. Aug 2010 14:27

AW: Codieren mit Passwort
 
Zitat:

Zitat von DeddyH (Beitrag 1044859)
Man könnte das Problem aber minimieren, indem man einfach zum exklusiv veroderten Wert 32 addiert (beim Verschlüsseln) bzw. vor dem Verodern subtrahiert (beim Entschlüsseln), oder habe ich da einen Denkfehler drin?

Nja, aber dann gibt es wo anders Problemchen (also wenn der Wert nach dem XOR größer als #223 ist, dann kommt man auch mit +32 wieder auf solche "bösen" Zeichen.

Wenn man z.B. vor der Verschlüsselung nur ASCII-Zeichen zuläßt, dann wäre sowas möglich.
Denn wenn man alles zuläßt, dann gibt es im Eingang 256 mögliche Zeichen und da diese einfachen XOR nur Zeichen in sich selbst kodieren, ergibt das im Ausgang ebenfalls alle 256 möglichen Zeichen und demnach sind auch solche Steuerzeichen möglich ... egal ob/wie man etwas dazurechnet.

DeddyH 25. Aug 2010 14:34

AW: Codieren mit Passwort
 
Hmmm... dann darf man das Ergebnis eben nicht als String interpretieren, nur wird es dann schwierig, das in einem Memo darzustellen :)

p80286 25. Aug 2010 15:00

AW: Codieren mit Passwort
 
Es gibt doch diese "Zeichensätze" die nur die Zeichen A..Z und 0..9 enthalten, ich komme gerade nicht auf die korrekte Bezeichnung. Damit könnte man den Ursprungstext in der Darstellung schon einmal einschränken und dann noch einmal "verodern".

Gruß
K-H

Matze33 25. Aug 2010 15:43

AW: Codieren mit Passwort
 
Also wie gesagt: Mein Lehrer meinte, wir sollen das eigentliche Geschehen in einem Array of byte(s?) stattfinden lassen, weil das damit umgehen kann im Gegensatz zum Memo.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:56 Uhr.
Seite 1 von 3  1 23      

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