Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 

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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat