Форумы портала PHP.SU » » Операционная система и системные вызовы » Замена mcrypt_encrypt (php) на openssl (shell_exec)

Страниц (1): [1]
 

1. ArtyShock - 01 Апреля, 2018 - 00:51:27 - перейти к сообщению
Приветствую! В общем задача - заменить mcrypt_encrypt имеющийся не во всех конфигурациях php (нет возможности подгрузить библиотеку для этого) на шелловую команду вокруг openssl (которую можно выполнить на имеющейся конфигурации). Предполагается что результат должен быть идентичным.

Но пока не получается - прошу помочь.

(полагаю проблема в упаковке ключа и вектора в hex.. в php это делается для передачи в mcrypt, а в shell_exec непонятно как передать верно ключ и вектор, либо алгоритмы не совсем совпадающие, но нужен результат аналогичный php)

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.     # --- ШИФРОВАНИЕ ---
  3.  
  4.     $key = pack('H*', "189cebc45c7caec5c57894564c52ae5646ed4564565ccc4565ec555dd5dd4d54");
  5.     echo "Ключ: " . $key . "\n";
  6.  
  7.     $key_size =  strlen($key);
  8.     echo "Длина ключа: " . $key_size . "\n";
  9.  
  10.     $plaintext = "This string was must be encrypted";
  11.      echo "Исходник: " . $plaintext . "\n";
  12.  
  13.     $iv = pack('H*', "e4554c4564a5454cc45654a45654ce44");
  14.     echo "Инициализирующий вектор: " . $iv . "\n";
  15.  
  16.     $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
  17.                                  $plaintext, MCRYPT_MODE_CBC, $iv);
  18.  
  19.     $ciphertext_base64 = base64_encode($ciphertext);
  20.  
  21.     echo  "\n"."Зашифровано:".$ciphertext_base64 . "\n\n";
  22.  
  23.     # --- ДЕШИФРОВКА ---
  24.  
  25.     $ciphertext_dec = base64_decode($ciphertext_base64);
  26.  
  27.     $iv_dec=$iv;
  28.  
  29.     $plaintext_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key,
  30.                                     $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
  31.  
  32.     echo  "Расшифровано:".$plaintext_dec . "\n\n";
  33.  
  34.  
  35.  
  36. $shkey="189cebc45c7caec5c57894564c52ae5646ed4564565ccc4565ec555dd5dd4d54";
  37. $shiv="e4554c4564a5454cc45654a45654ce44";
  38.  
  39. $cmd='echo '.$plaintext.' | openssl aes-128-cbc -base64 -nosalt -a -k '.$shkey.' -iv '.$shiv;
  40. echo "Command:".$cmd."\n";
  41. $output = shell_exec($cmd);
  42. echo "\n"."Output:$output"."\n";
  43.  
  44. ?>
2. ArtyShock - 01 Апреля, 2018 - 14:50:20 - перейти к сообщению
Обновленный вариант. Кроме mcrypt_encrypt добавлен openssl_encrypt (на замену первому приходит так понимаю) и с ними удалось получить одинаковый вариант применив паддинг и 256. Но командный openssl все еще не дает искомого совпадения...

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.     # --- ШИФРОВАНИЕ ---
  3.  
  4.     $key = pack('H*', "189cebc45c7caec5c57894564c52ae5646ed4564565ccc4565ec555dd5dd4d54");
  5.     file_put_contents("k.key",$key);
  6.     echo "Ключ: " . $key . "\n";
  7.    
  8.     $key_size =  strlen($key);
  9.     echo "Длина ключа: " . $key_size . "\n";
  10.    
  11.     $iv = pack('H*', "e4554c4564a5454cc45654a45654ce44");
  12.     echo "Инициализирующий вектор: " . $iv . "\n";
  13.    
  14.     $plaintext = "Thisstringff";
  15.     $block = 16;
  16.     $pad   = $block - (strlen($plaintext) % $block);
  17.     $plaintextn = $plaintext.str_repeat(chr($pad), $pad);
  18.  
  19.      echo "Исходник:" . $plaintext . "<-\n";
  20.      echo "size:".strlen($plaintext). "<-\n";
  21.      echo "Исходник паддинг:" . $plaintextn . "<-\n";
  22.      echo "size паддинг:".strlen($plaintextn). "<-\n";
  23.    
  24.      file_put_contents("pt.in",$plaintext);
  25.      file_put_contents("ptn.in",$plaintextn);
  26.  
  27.     $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,$plaintextn, MCRYPT_MODE_CBC,$iv);
  28.    
  29.     $ciphertext_base64 = base64_encode($ciphertext);
  30.    
  31.     echo  "\n"."Зашифровано:".$ciphertext_base64 . "\n\n";
  32.    
  33.     # --- ДЕШИФРОВКА ---
  34.  
  35.     $ciphertext_dec = base64_decode($ciphertext_base64);
  36.  
  37.     $plaintext_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key,$ciphertext_dec, MCRYPT_MODE_CBC,$iv);
  38.  
  39.     echo  "Расшифровано:".$plaintext_dec . "\n\n";
  40.  
  41. function sslEncrypt128($str, $secret,$iv)
  42. {
  43.     return base64_encode(openssl_encrypt($str, 'aes-256-cbc', $secret, OPENSSL_RAW_DATA,$iv));
  44. }
  45.  
  46. echo  "\n"."Зашифровано openssl_encrypt:";
  47. var_dump(sslEncrypt128($plaintext, $key,$iv));
  48.  
  49.  
  50. $shkey="189cebc45c7caec5c57894564c52ae5646ed4564565ccc4565ec555dd5dd4d54";
  51. $shkeypack="k.key";
  52. $shiv="e4554c4564a5454cc45654a45654ce44";
  53.  
  54. #$cmd='echo '.$plaintext.' | openssl aes-256-cbc -nosalt -a -k '.$shkey.' -iv '.$shiv;
  55. $cmd='openssl aes-256-cbc  -in "pt.in" -nosalt -a -A -k "'.$shkey.'" -iv "'.$shiv.'"';
  56. echo "\nCommand:".$cmd."\n";
  57. $output = shell_exec($cmd);
  58. echo "\n"."Зашифровано openssl:$output"."\n";
  59.  
  60. $cmd='openssl aes-256-cbc  -in "pt.in" -nosalt -a -A -kfile "'.$shkeypack.'" -iv "'.$shiv.'"';
  61. echo "\nCommand:".$cmd."\n";
  62. $output = shell_exec($cmd);
  63. echo "\n"."Зашифровано openssl kfile:$output"."\n";
  64. ?>
3. ArtyShock - 01 Апреля, 2018 - 17:58:25 - перейти к сообщению
Чьёрт ... докопался - нужно ключ -K применять а не -k Закатив глазки

 

Powered by ExBB FM 1.0 RC1