![]() |
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: |
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 ;) |
Re: StringList "verschlüsseln": welche Methode ist
Hallo jfheins,
danke für dein Schlagwort! :thumb: Habe dadurch folgendes gefunden: ![]() 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. |
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:
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)
Uses EncryptedStringLists;
Var SL: TStringList; SL.LoadFromFile('name.txt', 'pass'); Memo1.Lines.SaveToFile('name.txt', 'pass'); 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:
und wenn ich es Debugge, dann steht in CRC vorm
Memo1.Lines.SaveToFile('name.txt', 'pass');
Memo1.Lines.Clear; Memo1.Lines.LoadFromFile('name.txt', 'pass'); PS:
Delphi-Quellcode:
ist nicht unicodetauglich :!:
// RCStreamDeco.pas
procedure ProtectString(var Value: String); begin FillChar(Pointer(Value)^, Length(Value), 0); end; hier die nötigen Änderungen:
Delphi-Quellcode:
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.
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)); [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:
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
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; (allerdings sind die mit D2009 verschlüsselten Dateien nicht kompatibel mit Dateien älterer Compiler und umgekehrt) [edit] ein winziges ![]() |
Re: StringList "verschlüsseln": welche Methode ist
Hallo himitsu,
Zitat:
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: ![]() |
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 |
Re: StringList "verschlüsseln": welche Methode ist
Zitat:
Zitat:
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...) |
Re: StringList "verschlüsseln": welche Methode ist
wenn ich hier die Verschlüsselungen abschalte, dann läuft es,
Delphi-Quellcode:
aber wenn sie aktiv sind, dann wirft mir ReadSalt eine Exception zu, daß der gelesene SALT nicht mit dem Errechneten übereinstimmt.
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; und das sowohl vor, als auch noch nach meinen Unicode-Änderungen. |
Re: StringList "verschlüsseln": welche Methode ist
Liste der Anhänge anzeigen (Anzahl: 2)
![]() 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); |
Re: StringList "verschlüsseln": welche Methode ist
Zitat:
Dann nimm Standards wie z.B. Blowfish oder AES. Die Arbeit wird wohl die gleiche sein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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-2025 by Thomas Breitkreuz