Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Einlesen von Verschlüsselter Datei funktioniert nicht richti (https://www.delphipraxis.net/128167-einlesen-von-verschluesselter-datei-funktioniert-nicht-richti.html)

Jens Hartmann 25. Jan 2009 15:54


Einlesen von Verschlüsselter Datei funktioniert nicht richti
 
Hallo zusammen,

Habe mal wieder ein Problem. Ich bin jetzt an dem Punkt angekommen, das ich von meinem Programm die verschlüsselte Lizenzdatei einlesen lassen will.

Die Lizenzdatei erstelle ich mit einem selbst geschriebene Programm, in dem der Lizenzcode, bestehend aus verschiedenen Kundeninformationen zusammengesetzt wird, dann XOR verschlüsselt wird und zum Schluß in einer Datei gespeichert wird.

Delphi-Quellcode:
  for A := 1 to Length (Lizenzdatei)do
  begin
  Lizenzdatei[A] := Char(Byte(Lizenzdatei[A]) xor 42);
  end;
  Memo1.Text := Lizenzdatei;
  Memo1.Lines.SaveToFile('..\Liz\'+Kundenname+'.liz');
Lese ich die Datei nun in meinem Programm ein, funktioniert das ganze auch ganz gut, bis auf das mein Ergebnis mit zusätzlichen Zeichen versehen ist.


Jens HartmannWohnhausV1.00V1.00.25.01.2009.1HU2009SER1D iese Lizenz sollte bitte nicht genutzt werden //Soll String

Jens' HartmannWohnhausV1.00V1.00.25.01.2009.1HU2009SER1D iese' Lizenz' sollte' bitte' nicht' genutzt' werden //Ist String


Einlese Vorgang:

Delphi-Quellcode:
  Memo2.Lines.LoadFromFile('.\Liz\'+Kundenname+'.liz');
  Lizenzdatei := Memo2.Text;
  for A := 1 to Length (Lizenzdatei)do
  begin
  Lizenzdatei[A] := Char(Byte(Lizenzdatei[A]) xor 42);
  end;
  Memo2.Text := Lizenzdatei;
  end;
:coder2: :gruebel:

Meine Frage ist nun, wie kommt das und wie kann ich das ändern?

Danke schon mal

MFG

Jens

mkinzler 25. Jan 2009 15:59

Re: Einlesen von Verschlüsselter Datei funktioniert nicht ri
 
Besitzt die Datei Zeilentrenner

DP-Maintenance 25. Jan 2009 15:59

DP-Maintenance
 
Dieses Thema wurde von "mkinzler" von "XML" nach "Sonstige Fragen zu Delphi" verschoben.

Jens Hartmann 25. Jan 2009 16:05

Re: Einlesen von Verschlüsselter Datei funktioniert nicht ri
 
In meinem Programm, womit ich die Datei erstelle, sind eingendlich keine Zeilentrenner vorhanden.
Ich hänge mal eine Datei an.

Hier mal die komplette Procedure zum erstellen der Datei

Delphi-Quellcode:
procedure TForm1.BTErstellenClick(Sender: TObject);
var
Stammdaten     : String;
Kunde          : String;
Kundenname     : String;
Ansprechpartner : String;
Matchcode      : String;
Objekt         : String;
Anschrift      : String;
Straße         : String;
Hausnummer     : String;
Wohnort        : String;
PLZ            : String;
Ort            : String;
Tel            : String;
Fax            : String;
EMail          : String;
Version        : String;
Seriennummer   : String;
Lizenznummer   : String;
Lizenzdatei    : String;
A              : Integer;
Erstellen      : String;
F              : Textfile;
begin
  Kundenname := DBEdit1.Text;
  Ansprechpartner := DBEdit2.Text;
  Matchcode := DBEdit3.Text;
  Objekt := DBEdit4.Text;
  Straße := DBEdit5.Text;
  Hausnummer := DBEdit6.Text;
  PLZ := DBEdit7.Text;
  Ort := DBEdit8.Text;
  Tel := DBEdit9.Text;
  Fax := DBEdit10.Text;
  EMail := DBEdit11.Text;
  Version := CBVersion.Text;
  Seriennummer := EDSeriennummer.Text;
  Lizenznummer := EDLizenznummer.Text;
  Anschrift := Straße+Hausnummer;
  Wohnort := PLZ+Ort;
  Lizenzdatei := Kundenname+Objekt+
                 Version+Seriennummer+Lizenznummer+
                 'Diese Lizenz sollte bitte nicht genutzt werden';
  MMLizenzdatei.Clear;
  MMLizenzdatei.Lines.Append(Lizenzdatei);
  Memo1.Text := Lizenzdatei;
  Delay(4000);
  for A := 1 to Length (Lizenzdatei)do
  begin
  Lizenzdatei[A] := Char(Byte(Lizenzdatei[A]) xor 42);
  end;
  Memo1.Text := Lizenzdatei;
  Memo1.Lines.SaveToFile('..\Liz\'+Kundenname+'.liz');
   Delay(1000);
   TabSheet4.Show;
   BTErstellen.Enabled := False;
   BTKundendatenerstellen.Enabled := True;
end;
MFG

Jens

mkinzler 25. Jan 2009 16:11

Re: Einlesen von Verschlüsselter Datei funktioniert nicht ri
 
Die Zeichen scheinen durch die Leerzeichen zu entstehen. Ersetzte diese mal vor der Verschlüsselung durch ein anderes Zeichen

Jens Hartmann 25. Jan 2009 16:27

Re: Einlesen von Verschlüsselter Datei funktioniert nicht ri
 
Ja genau, die Zeichen entstehen durch die Leerzeichen,

Das Problem ist nur, diese Leerzeichen, können ja immer wieder vorkommen.
Habe mal überlegt, ob ich eventuell den String, vor dem speichern und nach dem lesen bearbeiten kann.
Das Problem ist halt nur beim lesen, woher soll mein Programm wissen wo mal Leerzeichen waren und jetzt wieder hingehören.

Delphi-Quellcode:
     
sl[i] := StringReplace(sl[i], #0, ' ', [rfReplaceAll]);
MFG


Jens

thkerkmann 25. Jan 2009 16:34

Re: Einlesen von Verschlüsselter Datei funktioniert nicht ri
 
Delphi-Quellcode:
sl[i] := StringReplace(sl[i], #0, ' ', [rfReplaceAll]);
Was wird das denn ?

Also ich würde mir erst mal den Ausgangsstring in Hex anschauen. Da muss ausser den Leerzeichen noch was drin sein.
Durch ein zeichenweises XOR wird das nicht dabei herauskommen.

Und das Memo würde ich höchstens zur Anzeige benutzen, nicht jedoch um die Daten darin zu verschlüsseln. Memo.Text wird dir immer ein CRLF ans Ende hängen, weil es glaubt hier ist eine Zeile zu Ende.

Also beginne am Anfang das Problem zu untersuchen, und speichere deinen String mal ab und schau ihn dir in einem Hex-Editor an.

Gruss

sx2008 25. Jan 2009 16:37

Re: Einlesen von Verschlüsselter Datei funktioniert nicht ri
 
Durch die XOR-Verschlüsselung entstehen binäre Daten, die man mit einem TMemo oder TStringList nicht sauber laden oder speichern kann.
Daher folgende Funktionen verwenden (irgendwo geklaut aus der DP):
Delphi-Quellcode:
function FileToString(const FileName: string): AnsiString;
var
  fs: TFileStream;
  Len: Integer;
begin
  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Len := fs.Size;
    SetLength(Result, Len);
    if Len > 0 then
      fs.ReadBuffer(Result[1], Len);
  finally
    fs.Free;
  end;
end;

Procedure StringToFile(const FileName, Str: string);
var
  fs: TFileStream;
  Len: Integer;
begin
  fs := TFileStream.Create(FileName, fmcreate);
  try
    Len := Length(Str);
    fs.Write(Str[1], Len);
  finally
    fs.Free;
  end;
end;

Jens Hartmann 25. Jan 2009 17:16

Re: Einlesen von Verschlüsselter Datei funktioniert nicht ri
 
So, mal wieder Weltklasse.

Jetzt sitze ich einen ganzen Sontag vor einem Problem, Habe so gut wie alle Schreib und Lese Befehle ausprobiert, die mein
Delphiwissen und meine Bücher hergeben, nur auf Stream, da bin ich nicht drauf gekommen.

Danke Danke Danke

Jetzt Funtz alles.

MFG

Jens

War mal wieder absolut genial, Danke.

:thumb: :thumb: :thumb: :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 Uhr.

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