Das ist die XOR-Verschlüsslungsfunktion.
Aber bei manchen Werten baut sie Mist.
Das liegt daran, daß man
Unicode-Strings nicht einfach per XOR ver- und entschlüsseln kann. Das mag in früheren Delphi Versionen noch funktioniert haben, als ein Char noch ein Byte groß war und der OEM-Zeichensatz zu jedem Byte ein Zeichen kannte. Mit
Unicode gilt das aber nicht mehr und man sollte dann auf Byte-Sequenzen für das Crypting ausweichen. Um weiterhin mit Strings arbeiten zu können, weil die Datentypen nun mal nicht so einfach im gesamten Programm umgestellt werden können, kann man die Byte-Sequenzen z.B. per Base64 encoden. Der String wird dabei aber etwas länger.
Delphi-Quellcode:
uses
System.SysUtils, System.NetEncoding;
function Decrypt(const Source, Password: string): string;
var
bPassword: TBytes;
bSource: TBytes;
I: Integer;
begin
Result := '';
bSource := TNetEncoding.Base64.DecodeStringToBytes(Source);
bPassword := TEncoding.UTF8.GetBytes(Password);
for I := 0 to Length(bSource) - 1 do begin
bSource[I] := bSource[I] xor bPassword[I mod Length(bPassword)];
end;
result := TEncoding.UTF8.GetString(bSource);
end;
function Encrypt(const Source, Password: string): string;
var
bPassword: TBytes;
bSource: TBytes;
I: Integer;
begin
Result := '';
bSource := TEncoding.UTF8.GetBytes(Source);
bPassword := TEncoding.UTF8.GetBytes(Password);
for I := 0 to Length(bSource) - 1 do begin
bSource[I] := bSource[I] xor bPassword[I mod Length(bPassword)];
end;
result := TNetEncoding.Base64.EncodeBytesToString(bSource);
end;