Delphi 2007 で開発されたアプリケーションがあります。このアプリケーションでは、値が PHP によって暗号化され、アプリケーションで復号化されます。暗号化アルゴリズムは RIJNDAEL 128 です。XE2 を移動し、DCPcrypt の最新バージョンをインストールすると、アプリケーションは実行されますが、PHP から暗号化された文字列を復号化できなくなります。結果は漢字のように見えるので、XE2 が Unicode 文字を使用しているという事実を説明するために、暗号化キー、ベクトル、または暗号化された文字列の処理を変更する必要があるかどうか疑問に思っています。
PHP 暗号化は次のように実行されます: (mcrypt_cbc(MCRYPT_RIJNDAEL_128,$key,$date_str,MCRYPT_ENCRYPT,$iv))
関連する 2 つの Delphi 関数は次のとおりです。
function PadWithZeros(const str : string; size : integer) : string;
var
origsize, i : integer;
begin
Result := str;
origsize := Length(Result);
if ((origsize mod size) <> 0) or (origsize = 0) then
begin
SetLength(Result,((origsize div size)+1)*size);
for i := origsize+1 to Length(Result) do
Result[i] := #0;
end;
end;
procedure TfrmMain.btnDecryptClick(Sender: TObject);
var
Cipher : TDCP_rijndael;
Data, Key, IV : string;
begin
// Pad Key and IV with zeros as appropriate
Key := PadWithZeros(boxKey.Text,KeySize);
IV := PadWithZeros(boxIV.Text,BlockSize);
// Decode the Base64 encoded string
Data := Base64DecodeStr(boxCipherTextIn.Text);
// Create the cipher and initialise according to the key length
Cipher := TDCP_rijndael.Create(Self);
if Length(boxKey.Text) <= 16 then
Cipher.Init(Key[1],128,@IV[1])
else if Length(boxKey.Text) <= 24 then
Cipher.Init(Key[1],192,@IV[1])
else
Cipher.Init(Key[1],256,@IV[1]);
// Decrypt the data
Cipher.DecryptCBC(Data[1],Data[1],Length(Data));
// Free the cipher and clear sensitive information
Cipher.Free;
FillChar(Key[1],Length(Key),0);
// Display the result
boxPlainTextOut.Text := Data;
end;