Vielleicht doch? ...
Den Code habe ich für meine Bedürfnisse erweitert. Ich bin Jetzt auf XE2. Dank Kodezwerg konnte ich das auch da zum Laufen bringen.
Bei der ersten Erweiterung geht um Base 64. Als Grundlage nahme ich das Beispiel oben mit "procedure SmallTest( );"
Delphi-Quellcode:
uses
...
Soap.EncdDecd,
...
function EncryptStringToBase64(
const S:
String):
String;
var
inBuffer, outBuffer, encrypted: TBytes;
begin
inBuffer := TEncoding.UTF8.GetBytes( S );
encrypted := TProtectedData.Protect( inbuffer );
// verschlüsseln
Result := EncodeBase64(encrypted,Length(encrypted));
Result := StringReplace(Result, #13#10, '
', [rfReplaceAll]);
end;
function DecryptBase64ToString(
const S:
String):
String;
var outBuffer, encrypted: TBytes;
begin
encrypted := DecodeBase64(S);
outBuffer := TProtectedData.Unprotect( encrypted );
// entschlüsseln
Result := TEncoding.UTF8.GetString( outBuffer );
end;
Dazu habe ich einen
unit-test gemacht:
Delphi-Quellcode:
procedure TTest_LoginCrypt.Test_Basic1();
var
orginal: String;
crypt: String;
decrypt: String;
begin
orginal := 'DesÜsch a Passwörd!';
crypt := EncryptStringToBase64(orginal);
decrypt := DecryptBase64ToString(crypt);
CheckEquals(orginal, decrypt, 'decrypt');
end;
Der läuft gut. Anders sieht es mit dem nächsten aus.
Delphi-Quellcode:
procedure TTest_LoginCrypt.Test_Basic2();
const expected =
'AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAR6WMUwdNMUWKnnyFGb2XNAAAAAACAAAAAAAQZgAAAAEAACAAAAB54/kNaa'+
'FIZe84QZZTmPvuZ9asbR6NoCsGdTGhpYDS4AAAAAAOgAAAAAIAACAAAAD44yDX7VmMRv6NO3Sf1fBdJXAd6YmB1HRb'+
'75aqGm1XCyAAAAAx+BMspmyEA9ymHt02gmt60xXA0JRYzzEtQirpBUSGvUAAAADD6HkiNivbUlSN1LW8293Bq7ktHA'+
'ca7+3zscNrTPbfqo7zg/cQZLFhIPHVaW8Gqp+fsa9Nx3p4u/XRI0EdsT1n';
var
orginal: String;
crypt: String;
decrypt: String;
begin
orginal := 'DesÜsch a Passwörd!';
crypt := EncryptStringToBase64(orginal);
CheckEquals(expected, crypt, 'crypt');
decrypt := DecryptBase64ToString(crypt);
CheckEquals(orginal, decrypt, 'decrypt');
end;
Beim ersten Mal geht er schief, klar denke ich die Daten passen nicht. Ich kopiere mir die richtigen Daten aus dem Debugger oder
unit-test Ergebnis raus. Aber bei jedem Durchlauf werden andere Daten erwartet.
Wo ist mein Denkfehler?