unit Crypt;
interface
uses SysUtils, FMX.Dialogs;
function Encrypt (const s: String; Key: Word) : string;
function Decrypt (const s: string; Key: Word) : string;
implementation
const CKEY1 = 53761;
CKEY2 = 32618;
function Encrypt(const S :String; Key: Word): String;
var i :Integer;
RStr :RawByteString;
RStrB :TBytes Absolute RStr;
begin
Result:= '';
RStr:= UTF8Encode(S);
for i := 0 to Length(RStr)-1 do begin
RStrB[i] := RStrB[i] xor (Key shr 8);
Key := (RStrB[i] + Key) * CKEY1 + CKEY2;
end;
for i := 0 to Length(RStr)-1 do begin
Result:= Result + IntToHex(RStrB[i], 2);
end;
end;
function Decrypt(const S: String; Key: Word): String;
var i, tmpKey :Integer;
RStr :RawByteString;
RStrB :TBytes Absolute RStr;
tmpStr :String;
begin
tmpStr:= UpperCase(S);
SetLength(RStr, Length(tmpStr) div 2);
i:=1;
try
while (i<Length(tmpStr)) do
begin
{$IF Defined(ANDROID) or Defined(IOS)}
RStrB[i div 2]:= StrToInt('$' + tmpStr[i-1] + tmpStr[i]);
{$ELSE}
RStrB[i div 2]:= StrToInt('$' + tmpStr[i] + tmpStr[i+1]);
{$ENDIF}
Inc(i, 2);
end;
except
Result:= '';
Exit;
end;
for i := 0 to Length(RStr)-1 do
begin
tmpKey:= RStrB[i];
RStrB[i] := RStrB[i] xor (Key shr 8);
Key := (tmpKey + Key) * CKEY1 + CKEY2;
end;
Result:=UTF8ToString(RStr);
end;
end.