AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi StringList "verschlüsseln": welche Methode ist am Besten?
Thema durchsuchen
Ansicht
Themen-Optionen

StringList "verschlüsseln": welche Methode ist am Besten?

Ein Thema von juergen · begonnen am 11. Jun 2009 · letzter Beitrag vom 18. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#1

StringList "verschlüsseln": welche Methode ist am

  Alt 11. Jun 2009, 23:47
Hallo zusammen,

ich habe nun einiges gelesen und bin eigentlich noch unentschlossener wie vorher.
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!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

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

  Alt 12. Jun 2009, 00:00
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
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 12. Jun 2009, 02:06
Hallo jfheins,

danke für dein Schlagwort!
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.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 17. Jun 2009, 02:29
ich glaub langsam lern ich auch noch die knuffigen Class-Helper lieben


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 (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

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
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
Angehängte Dateien
Dateityp: pas encryptedstringlists_206.pas (2,3 KB, 25x aufgerufen)
Dateityp: zip projekte_168.zip (4,8 KB, 30x aufgerufen)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 17. Jun 2009, 11:19
Hallo himitsu,

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.


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

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!
RC4 und Stromdekorierer
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 17. Jun 2009, 11:26
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
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 17. Jun 2009, 11:38
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 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...)
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 17. Jun 2009, 11:41
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 18. Jun 2009, 12:59
Der Fehler wurde erstmal gefunden
also jetzt läuft's zumindestens erstmal wieder

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);
Angehängte Dateien
Dateityp: pas encryptedstringlists_105.pas (2,3 KB, 53x aufgerufen)
Dateityp: zip encryptedstringlists_150.zip (5,4 KB, 60x aufgerufen)
$2B or not $2B
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#10

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

  Alt 18. Jun 2009, 13:46
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 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