Autor |
Beitrag |
ub60
Beiträge: 762
Erhaltene Danke: 127
|
Verfasst: Sa 18.08.18 21:10
Hallo miteinander,
ich möchte Inhalte einer Stringliste (oder Listbox) verschlüsselt abspeichern und natürlich auch wieder einlesen können. Die Qualität der Verschlüsselung muss nicht NSA-sicher sein, es soll nur nicht gleich jeder den Inhalt erkennen, dem die Datei zufällig in die Hand fällt.
Beim Recherchieren habe ich folgendes gefunden.
Leider läuft diese Variante wohl erst in "neueren" Delphi-Versionen, ich würde es aber für ein älteres Programm in Delphi7 benötigen. Bisher erhalte ich beim Compilieren des verlinkten Quelltextes die Fehlermeldung "System-Unit veraltet oder beschädigt: 'TClassHelperBase' fehlt".
Hat eventuell jemand eine Idee, die auch mit D7 funktioniert?
Danke schon mal!
ub60
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Sa 18.08.18 21:34
Hallo ub60,
genügt ein Speichern mit zlib ?
Die Daten sind zwar nicht verschlüsselt, aber ein Laie kann den Inhalt der Datei nicht lesen.
Ich nutze zum Speichern und Laden einer Stringliste:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78:
| uses zlib;
procedure CompressStream(inpStream, outStream: TStream); var InpBuf, OutBuf: Pointer; InpBytes, OutBytes: Integer; begin InpBuf := nil; OutBuf := nil; try GetMem(InpBuf, inpStream.Size); inpStream.Position := 0; InpBytes := inpStream.Read(InpBuf^, inpStream.Size); CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes); outStream.Write(OutBuf^, OutBytes); finally if InpBuf <> nil then FreeMem(InpBuf); if OutBuf <> nil then FreeMem(OutBuf); end; end;
procedure DecompressStream(inpStream, outStream: TStream); var InpBuf, OutBuf: Pointer; OutBytes, sz: Integer; begin InpBuf := nil; OutBuf := nil; sz := inpStream.Size - inpStream.Position; if sz > 0 then try GetMem(InpBuf, sz); inpStream.Read(InpBuf^, sz); DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes); outStream.Write(OutBuf^, OutBytes); finally if InpBuf <> nil then FreeMem(InpBuf); if OutBuf <> nil then FreeMem(OutBuf); end; outStream.Position := 0; end;
procedure savememoryliste(liste:tstringlist;const dateiname:string); var ms1, ms2: TMemoryStream; begin ms1 := TMemoryStream.Create; try ms2 := TMemoryStream.Create; try liste.SaveToStream(ms1); CompressStream(ms1, ms2); ms2.SaveToFile(dateiname); finally ms2.Free; end; finally ms1.Free; end; end;
procedure loadmemoryliste(liste:tstringlist;const dateiname:string); var ms1, ms2: TMemoryStream; begin ms1 := TMemoryStream.Create; try ms2 := TMemoryStream.Create; try ms1.LoadFromFile(dateiname); DecompressStream(ms1, ms2); liste.LoadFromStream(ms2); finally ms2.Free; end; finally ms1.Free; end; end; |
LG Steffen
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Sa 18.08.18 22:08
Moin!
ub60 hat folgendes geschrieben : | Hat eventuell jemand eine Idee, die auch mit D7 funktioniert? |
Ich hab hier mal einen RC4-Stream-Adapter unter D7 gebaut, vielleicht hilft´s.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
ub60
Beiträge: 762
Erhaltene Danke: 127
|
Verfasst: So 19.08.18 10:26
@Mathematiker:
Vielen Dank! Das sieht prinzipiell ganz gut aus, aber etwas verschlüsselt sollte es schon sein.
@Narses:
Mit Dateien funktioniert das in D7 ganz gut, aber ich möchte es aus einem Memorystream speichern. Leider bekomme ich da eine Fehlermeldung.
Eventuell sieht ja jemand meinen Fehler:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| uses rc4;
procedure TForm1.WriteBtnClick(Sender: TObject); var ListboxStream: TMemoryStream; RC4Writer: TRC4StreamWriter; begin ListboxStream:=TMemoryStream.Create; try ListBox1.Items.SaveToStream(ListboxStream); ShowMessage(IntToStr(ListboxStream.Size)); RC4Writer := TRC4StreamWriter.Create(TFileStream.Create('ausgabe.txt', fmCreate or fmShareDenyWrite), 'geheim'); try RC4Writer.CopyFrom(ListboxStream, ListboxStream.Size); finally RC4Writer.Free; end; finally ListboxStream.Free; end; end; |
ub60
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: So 19.08.18 13:09
Moin!
ub60 hat folgendes geschrieben : | Mit Dateien funktioniert das in D7 ganz gut, aber ich möchte es aus einem Memorystream speichern. Leider bekomme ich da eine Fehlermeldung.
Eventuell sieht ja jemand meinen Fehler: |
Ich würde mal raten (ohne das jetzt selbst auszuprobieren), du muss den Stream wieder "zurückspulen", also sowas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| ListboxStream:=TMemoryStream.Create; try ListBox1.Items.SaveToStream(ListboxStream); ListboxStream.Position := 0; ShowMessage(IntToStr(ListboxStream.Size)); ... |
Die Klasse funktioniert, benutze ich in mehreren Projekten selbst.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
ub60
Beiträge: 762
Erhaltene Danke: 127
|
Verfasst: So 19.08.18 15:09
Narses hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3:
| ListBox1.Items.SaveToStream(ListboxStream); ListboxStream.Position := 0; ShowMessage(IntToStr(ListboxStream.Size)); |
|
Vielen Dank, das war es!
Ich lass das Theme mal offen, falls hier noch andere Lösungen/Verfahren kommen.
ub60
|
|
|