Я пытаюсь обмениваться зашифрованными сообщениями между Delphi и PHP.
Со стороны Delphi я скачал DCPcrypt v2 Beta 3 отсюда:
http://www.cityinthesky.co.uk/opensource/dcpcrypt/
Для шифрования я использую эту функцию:
function TForm1.Encrypt3DES(psData, psKey: string): string;
var
Cipher: TDCP_3des;
begin
Cipher:= TDCP_3des.Create(nil);
Cipher.InitStr(psKey,TDCP_sha256);
result:=Cipher.EncryptString(psData);
Cipher.Burn;
Cipher.Free;
end;
И я проверяю это так:
ShowMessage(Encrypt3DES('test','SecretKeySecretKeySecret'));
В результате я получаю Z74E0Q == , и я могу успешно расшифровать его с помощью другой аналогичной функции delphi:
function TForm1.Decrypt3DES(psData, psKey: string): string;
var
Cipher: TDCP_3des;
begin
Cipher:= TDCP_3des.Create(nil);
Cipher.InitStr(psKey, TDCP_sha256);
result:=Cipher.DecryptString(psData);
Cipher.Burn;
Cipher.Free;
end;
Со стороны PHP я попробовал несколько функций для шифрования одной и той же строки («test») с тем же ключом («SecretKeySecretKeySecret»), но результат отличается от того, что я получаю в Delphi. Опять же, я могу успешно расшифровать сообщения в PHP с аналогичными функциями, но мне нужно расшифровать сообщения в Delphi.
Это то, что я делаю в PHP, я даже пытался хэшировать ключ, так как вижу, что функция Delphi использует TDCP_sha256, но результаты все же разные.
$key = "SecretKeySecretKeySecret";
echo base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, 'test', 'ecb')).'<BR><BR>';
echo openssl_encrypt('test', 'des-ede3', $key).'<BR><BR>';
$key = hash('sha256', $key);
echo openssl_encrypt('test', 'des-ede3', $key).'<BR><BR>';
Это результат:
Z05z5Bp4 / Vy =
L5qmk5nJOzs =
bm7yRdrMs5g =
Что я делаю не так? Кстати, я использую Delphi 7, и DCPcrypt является единственной библиотекой, которую мне удалось запустить.