Hallo!
War bisher nur gelegentlicher Beobachter eures Forums, jetzt hab ich da aber ein Problem bei dessen Lösung mir vielleicht hier jemand helfen kann.
Wir verwenden bisher
DEC 3 zur Verschlüsselung (Details s.u.) von nicht wirklich kritischen Informationen und möchten nun auf 5.2 umstellen (alles noch in D7). Vorgabe ist das die bereits verschlüsselten Dateien weiterhin lesbar sein müssen und auch neu codierte in alten Programmen funktionieren. Das hat auch mit den diversen Hinweisen in diesem Forum gut funktioniert, insbesondere '
Umstellung DEC 3.0 auf 5.2' war sehr hilfreich. Danke schon mal dafür.
Nun hab ich meine
Unit Tests (Verschlüsseln mit 3+5 und Ergebnis in HEX vergleichen) erweitert und das hat ein Problem aufgedeckt, das ich vorher nicht gesehen hatte. Haben die Eingangsdaten eine bestimmte Größe ist das Ergebnis ziwschen 3+5 unterschiedlich. Das tritt zum ersten mal auf wenn die Daten zwischen 138 und 143 Bytes lang sind und wiederholt sich ab da dann in einem Muster das ich noch nicht erkenne. Dazwischen funktioniert aber alles wunderbar. Das paarweise Ver-/Entschlüsseln innerhalb jeder Version funktioniert unabhängig von der Länge immer einwandfrei.
Wäre toll wenn jemand eine Idee hätte.
Matthias
Hier der Code aus 3 (etwas vereinfacht):
Delphi-Quellcode:
function Decode(const aSomeText : AnsiString) : string;
var
cipher : TCipher_Blowfish;
b : string;
begin
cipher := TCipher_Blowfish.Create('abcedefghijk', nil);
try
b := cipher.DecodeString(aSomeText);
result := TStringFormat_HEX.StrTo(PChar(b), length(b));
finally
cipher.Free();
end;
end;
Hier meine Anpassung an 5.2 (etwas vereinfacht):
Delphi-Quellcode:
function Decode(const aSomeText : AnsiString) : string;
var
cipher : TCipher_Blowfish;
I : Integer;
hash : THash_RipeMD256;
IVector : Binary;
password : Binary;
b : Binary;
begin
cipher := TCipher_Blowfish.Create();
cipher.Mode := cmCTSx;
hash := THash_RipeMD256.Create;
try
hash.Init;
password := 'abcedefghijk';
hash.Calc(password[1], length(password));
hash.Done;
I := hash.DigestSize;
if I > cipher.Context.KeySize then I := cipher.Context.KeySize; {generaly will truncate to large Keys}
cipher.Init(Hash.Digest^, I, IVector[1], 0);
b := cipher.DecodeBinary(aSomeText);
result := TFormat_HEX.Encode(b[1], length(b));
finally
cipher.Free();
hash.Free();
end;
end;