| 
| Autor | Beitrag |  
| ub60 
          Beiträge: 764
 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: 1448
 
 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: 10183
 Erhaltene Danke: 1256
 
 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: 764
 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: 10183
 Erhaltene Danke: 1256
 
 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: 764
 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 |  |  |  |