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 StringList "verschlüsseln": welche Methode ist am Besten? (https://www.delphipraxis.net/135493-stringlist-verschluesseln-welche-methode-ist-am-besten.html)

juergen 11. Jun 2009 23:47


StringList "verschlüsseln": welche Methode ist am
 
Hallo zusammen,

ich habe nun einiges gelesen und bin eigentlich noch unentschlossener wie vorher. :gruebel:
Was will ich erreichen?
Ich speichere mir eine StringList über die Methode SaveToFile() als Textfile weg (max. Grösse der Datei bis jetzt: 2,6 MB).
Ziel soll sein, dass diese Text-Datei für Otto-Normalverbraucher nicht lesbar ist.
Beim starten des Programmes wird die StingList mit der Methode LoadFromFile() gefüllt.

Jetzt habe ich ja 2 Möglichkeiten:
1.) beim Adden der StringList in der For-Schleife den String schon in der StringList zu verschlüsseln
2.) die Textdatei zu verschlüsseln

Es sollte relativ performant sein und vllt. etwas besser wie eine XOR-"Verschlüsselung".

Was könnt ihr mir empfehlen?
In welche Richtung sollte ich mich da weiter informieren?`

Schon mal Danke vorab für Eure Unterstützung! :dp:

jfheins 12. Jun 2009 00:00

Re: StringList "verschlüsseln": welche Methode ist
 
Ich würde das ver- und entschlüsseln erst beim speichern/laden machen.

Dann z.B. so: Du speicherst die Stringlist in nen Memorystream und lässt danach deine Routine drüberlaufen, und speicherst das dann in die Datei.

xor Sollte eigetlich reichen, um Otto abzuhalten, ansonsten schwirrt hier irgendwo noch ein RCx Streamdekorierer rum, iirc.

Tu dir aber selbst einen Gefallen und schreib noch etwas wie "Ver100" vor die verschlüsselten Daten - falls du irgendwann mal das Format änderst kannst du die Dateien immernoch auseinanderhalten ;)

juergen 12. Jun 2009 02:06

Re: StringList "verschlüsseln": welche Methode ist
 
Hallo jfheins,

danke für dein Schlagwort! :thumb:
Habe dadurch folgendes gefunden:
RC4 und Stromdekorierer

Das scheint mir genau das richtige zu sein, wenn auch für diesen Fall vllt. etwas overkill.
Werde mich damit weiter auseinander setzen, kann ich für die Zukunft bestimmt noch gut gebrauchen.

himitsu 17. Jun 2009 02:29

Re: StringList "verschlüsseln": welche Methode ist
 
Liste der Anhänge anzeigen (Anzahl: 2)
ich glaub langsam lern ich auch noch die knuffigen Class-Helper lieben :shock:


Delphi-Quellcode:
Uses EncryptedStringLists;

Var SL: TStringList;

SL.LoadFromFile('name.txt', 'pass');
Memo1.Lines.SaveToFile('name.txt', 'pass');
und sobald man diese Unit in seine Uses-Liste aufgenommen hat, sind bei allen Nachfahren von TStrings die Funktionen LoadFromFile, SaveToFile, LoadFromStream und SaveToStream mit einer neue Version überladen, wo man einfach nur noch das Passwort anzugeben baucht :stupid: (das sllte so ab D2006/TDE möglich sein, oder ab wann die Class-Helper halt eingeführt wurden)




nur gibt es ein Problem ...
der Class-Helper selber sollte so doch OK sein (zumindestens nach maximovs Beispielen) ... denk ich mal :gruebel:

aber dennoch gibt es einen Decodierfehler, beim Einlesen der Datei

mein TestCode
Delphi-Quellcode:
Memo1.Lines.SaveToFile('name.txt', 'pass');
Memo1.Lines.Clear;
Memo1.Lines.LoadFromFile('name.txt', 'pass');
und wenn ich es Debugge, dann steht in CRC vorm

PS:
Delphi-Quellcode:
// RCStreamDeco.pas
procedure ProtectString(var Value: String);
begin
  FillChar(Pointer(Value)^, Length(Value), 0);
end;
ist nicht unicodetauglich :!:

hier die nötigen Änderungen:
Delphi-Quellcode:
procedure ProtectString(var Value: String);
  FillChar(Pointer(Value)^, Length(Value) * SizeOf(Char), 0);

procedure TRCxStreamDecorator.WriteSalt(Size: Byte = 16);
  WriteBuffer(Pointer(Salt)^, Size * SizeOf(Char));

procedure TRCxStreamDecorator.ReadSalt;
  ReadBuffer(Pointer(Salt)^, Size * SizeOf(Char));
Aber das hilft auch nun nicht wirklich weiter, denn alleine ReadSalt ließt schon was anderes ein, als WriteSalt geschrieben hat und bricht dann natürlich mit der EInvalidDecryption ab.


[add]
hab mich nochmal rangesetzt und konnte nun den Fehler nahezu eindeutig in Hagens RCx-Unit ausmachen :cry:
Denn nach nachfolgenden Änderungen funktioniert der Streamdecodierer und mein Code fehlerfrei.
Gut, abgesehn davon, daß die Daten nun unverschlüsselt durchgereicht wurden.

Und es ist kein D2009 Problem, auch mit D2006 ging es nicht.
Delphi-Quellcode:
function TRCStreamDecorator.Read(var Buffer; Count: Integer): Integer;
begin
  result := FStream.Read(Buffer, count);
//  case EncodeMode of
//    emEncodeWriting: Decode(Buffer, Buffer, Result); // abstrakter aufruf
//    emEncodeReading: Encode(Buffer, Buffer, Result); // abstrakter aufruf
//  end;
end;

function TRCStreamDecorator.Write(const Buffer; Count: Integer): Integer;
var
  temp:pointer;
begin
  GetMem(temp, count);
//  case EncodeMode of
//    emEncodeWriting: Encode(Buffer, temp^, Count); // abstrakter aufruf
//    emEncodeReading: Decode(Buffer, temp^, Count); // abstrakter aufruf
//  end;
  result := FStream.Write(Buffer{temp^}, count);
  FreeMem(temp, count);
end;
OK und nach einigen Änderung (siehe Anhangt ... die paar SizeOf(Char) darin und ich hoff mal ich habe soweit alles gefunden) läuft es nun auch in D2009 richtig
(allerdings sind die mit D2009 verschlüsselten Dateien nicht kompatibel mit Dateien älterer Compiler und umgekehrt)

[edit]
ein winziges Leerzeichen entfernt :nerd:

juergen 17. Jun 2009 11:19

Re: StringList "verschlüsseln": welche Methode ist
 
Hallo himitsu,

Zitat:

Zitat von himitsu
Denn nach nachfolgenden Änderungen funktioniert der Streamdecodierer und mein Code fehlerfrei.
Gut, abgesehn davon, daß die Daten nun unverschlüsselt durchgereicht wurden.

:mrgreen: :mrgreen: :mrgreen:

Habe gerade mal deine Abwandlung nach UniCode mit einer unicodefähigen Listbox getestet und das sah auf den ersten Blick gut aus. :thumb:

Wahrscheinlich benötige ich das Ganze auch bald in einem anderen Projekt wo ich MP3-Tags auslese.
Und solange ich die Daten noch in eine *.Dat-Datei speichere und keine DB verwende ist die Lösung super!

Im Moment habe ich nur keine Idee wie man das Ganze abwärtskompatibel betreiben könnte.
Wenn ich irgendwann mal umsteige auf eine Delphi-Version > 2007 habe ich k.A. wie man das regeln kann.


Ich denke deine unicodefähige Anpassung sollte in den CodeLib-Beitrag des RCx-Stromdecorierers mit aufgenommen werden und habe dieses entsprechend gemweldet! :dp:
RC4 und Stromdekorierer

himitsu 17. Jun 2009 11:26

Re: StringList "verschlüsseln": welche Methode ist
 
Also die "Unicode"-Änderungen selber sind so gewählt, der der Code dann auch noch abwärtskompatibel bleibt. :)

Jetzt müßte man/ich nur noch rausbekommen, warum die Verschlüsselung nicht laufen will.
- Ohne interne Verschlüsselung läuft es ja nun. Aber mit, wird beim Auslesen etwas Anderes gelesen/dekodiert, als gespeichert wurde und dann schlägt die Fehlerprüfung im ReadSalt an ... und zwar in D2006 und D2009

juergen 17. Jun 2009 11:38

Re: StringList "verschlüsseln": welche Methode ist
 
Zitat:

Zitat von himitsu
Also die "Unicode"-Änderungen selber sind so gewählt, der der Code dann auch noch abwärtskompatibel bleibt. :)

Der Code ja, aber das File selbst wäre nicht mehr kompatibel.

Zitat:

Zitat von himitsu
Jetzt müßte man/ich nur noch rausbekommen, warum die Verschlüsselung nicht laufen will.
- Ohne interne Verschlüsselung läuft es ja nun. Aber mit, wird beim Auslesen etwas Anderes gelesen/dekodiert, als gespeichert wurde und dann schlägt die Fehlerprüfung im ReadSalt an ... und zwar in D2006 und D2009

Versteh' ich gerade nicht...
Was verstehst du unter "interner Verschlüsselung"?

Wenn ich SaveToFile() verwende und anschließend neu starte und LoadFromFile() aufrufe funktioniert es doch, oder überseh' ich da was? (ich verwende eine Unicode-fähige Listbox von TMS...)

himitsu 17. Jun 2009 11:41

Re: StringList "verschlüsseln": welche Methode ist
 
wenn ich hier die Verschlüsselungen abschalte, dann läuft es,
Delphi-Quellcode:
function TRCStreamDecorator.Read(var Buffer; Count: Integer): Integer;
begin
  result := FStream.Read(Buffer, count);
//  case EncodeMode of
//    emEncodeWriting: Decode(Buffer, Buffer, Result); // abstrakter aufruf
//    emEncodeReading: Encode(Buffer, Buffer, Result); // abstrakter aufruf
//  end;
end;

function TRCStreamDecorator.Write(const Buffer; Count: Integer): Integer;
var
  temp:pointer;
begin
  GetMem(temp, count);
//  case EncodeMode of
//    emEncodeWriting: Encode(Buffer, temp^, Count); // abstrakter aufruf
//    emEncodeReading: Decode(Buffer, temp^, Count); // abstrakter aufruf
//  end;
  result := FStream.Write(Buffer{temp^}, count);
  FreeMem(temp, count);
end;
aber wenn sie aktiv sind, dann wirft mir ReadSalt eine Exception zu, daß der gelesene SALT nicht mit dem Errechneten übereinstimmt.

und das sowohl vor, als auch noch nach meinen Unicode-Änderungen.

himitsu 18. Jun 2009 12:59

Re: StringList "verschlüsseln": welche Methode ist
 
Liste der Anhänge anzeigen (Anzahl: 2)
Der Fehler wurde erstmal gefunden
also jetzt läuft's zumindestens erstmal wieder :cheer:

wie oben schon beschrieben:
einfach die Unit EncryptedStringLists aufnehmen und alle Nachfahren von TStrings werden um neue Load-/Save-Funktionen erweitert
Delphi-Quellcode:
Procedure LoadFromFile (Const Filename,       Password: String);
Procedure SaveToFile   (Const Filename,       Password: String);
Procedure LoadFromStream(Stream: TStream; Const Password: String);
Procedure SaveToStream (Stream: TStream; Const Password: String);

generic 18. Jun 2009 13:46

Re: StringList "verschlüsseln": welche Methode ist
 
Zitat:

Zitat von juergen
... Text-Datei für Otto-Normalverbraucher nicht lesbar ist.

Wenn du damit schon anfängst, kannst du es doch auch gleich "richtig" machen?!

Dann nimm Standards wie z.B. Blowfish oder AES. Die Arbeit wird wohl die gleiche sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf