Различные результаты при шифровании одним и тем же методом в Delphi и PHP - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь обмениваться зашифрованными сообщениями между 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 является единственной библиотекой, которую мне удалось запустить.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я думаю, что это поможет вам. TDCP_3des - это блочный шифр, а метод EncryptString использует метод EncryptCFB8bit (шифрование байтов данных с использованием метода шифрования CFB (8 бит)).

Важны две вещи:

  • использовать тот же вектор инициализации
  • хеширует ключ в части PHP.

Delphi part:

function TForm1.Encrypt3DES(psData, psKey: string): string;
var
   Cipher: TDCP_3des;
   i: integer;
begin
   Cipher := TDCP_3des.Create(nil);
   try
      Cipher.InitStr(psKey, TDCP_sha256);
      Cipher.SetIV('00000000');
      Result := Cipher.EncryptString(psData);
      Cipher.Burn;
   finally
      Cipher.Free;
   end{try};
end;

procedure TForm1.btnEncryptClick(Sender: TObject);
var
   input, key: string;
begin
   input := 'Some words in English';
   key   := 'SecretKeySecretKeySecret';
   ShowMessage(Encrypt3DES(input, key));
end;

PHP-часть:

<?
$key = "SecretKeySecretKeySecret";
$key = hash('sha256', $key, true);
$key = substr($key, 0, 24);
$iv = '00000000';

$message = 'Some words in English';
$result = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CFB, $iv);
$result = base64_encode($result);
echo 'Input text: '.$message.'</br>';
echo 'Encrypted text: '.$result.'</br>';
?>

Выход:

Input:          Some words in English                           
Encrypted text: hTpdn+USolFTgv/4HnBEvo4scgmp
Input:          This will test Delphi7 and PHP encryption.
Encrypted text: gik2Iw/m2rtMA9gdKqvFqDg3kuUSb4rnAieyZ8unIvt510Rbt1jLPO+/      
Input:          I hope this will work.                          
Encrypted text: n/JxW12zORaI7TSCAF4/6cBxqC3mZg== 

Примечания:

Протестировано с Delphi 7, DCPcrypt v2, PHP 5.2.10, mcrypt 2.5.7.

0 голосов
/ 05 июля 2018

Длина вашего зашифрованного текста base64 показывает, что DCPCrypt не использует ECB. С минимальной программой я могу воспроизвести ваш результат, и пошаговое выполнение кода действительно показывает, что ECB не используется . Соответствующие части

function TDCP_blockcipher.EncryptString(const Str: string): string;
begin
  SetLength(Result,Length(Str));
  EncryptCFB8bit(Str[1],Result[1],Length(Str));
  Result:= Base64EncodeStr(Result);
end;

function TDCP_blockcipher.DecryptString(const Str: string): string;
begin
  Result:= Base64DecodeStr(Str);
  DecryptCFB8bit(Result[1],Result[1],Length(Result));
end;
...