Точная альтернатива mcrypt_encrypt в PHP 7.2 - PullRequest
0 голосов
/ 26 февраля 2019

Поскольку mcrypt_encrypt больше не поддерживается в PHP 7.2, я пытаюсь найти точную альтернативу этой функции.

После прочтения многих ответов SO я нашел следующий код, который использует PHPSECLIB, но он не выдает точный зашифрованный текст как mcrypt.

function encryptRJ256($key,$iv,$string_to_encrypt)
    {

       // $rtn = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string_to_encrypt, MCRYPT_MODE_CBC, $iv);

      $rijndael = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CBC);  
      $rijndael->setKey($key);
      $rijndael->setIV($iv);
      $rijndael->setKeyLength(256);
      $rijndael->disablePadding();
      $rijndael->setBlockLength(256);
      $rtn = $rijndael->encrypt($string_to_encrypt);    
      $rtn = base64_encode($rtn);
      return($rtn);
    }

Мой ключ и IV:

  $ky = 'lkirwf897+22#bbtrm8814z5qq=498j5'; 

  $iv = '741952hheeyy66#cs!9hjv887mxx7@8y';

Первые 42 символа равны, но остальные отличаются, как вы можете видеть

Текст для шифрования: 57F0-ECD3-1A3B-341E-BA39-F81B-F020-0DE0 выход

mcrypt_encrypt:
3uw7mVZthiIPPNosvppZHd1jEau3Ul + 0BQ4AVS2t80skauq3Zv9z5uztvmiBpYqQcKGIDP5YHfdEBhPBfdVbxg ==

1018 *
выход phpseclib. Итак, мой вопрос: возможно ли создать тот же зашифрованный текст, что и mcrypt_encrypt, используя phpseclib или любым другим способом?

1 Ответ

0 голосов
/ 26 февраля 2019

Возможно, вам понадобится "дополнить все"

Если вы прочитаете эту запись на leaseweb , она автоматически заявляет снова и снова, что mcrypt заполняет элемент до правильных размеров блока, которые он можетжевать.Это приводит, конечно, к различным выводам из-за всех нулевых байтов.

Поэтому я бы посоветовал вам убедиться, что все ваши данные, которые вы вводите в код phpseclib, дополнены правильным количеством нулевых байтов для имитации вводаmcrypt передает данные в шифр.

По умолчанию, если вы посмотрите на код PHPSECLIB , он дополняется символом, определяемым количеством символов для заполнения.
однако mcrypt дополняется символом 0.

Итак, давайте исправим это.

Нужный измененный код:

    $cipher->disablePadding();
    $length = strlen($text);
    $pad = 32 - ($length % 32);
    $text = str_pad($text, $length + $pad, chr(0));

Я использовал последнюю версию PHPSECLIB как доступную на github , поэтому мой код отличается от вашего примера кода.Это полный рабочий пример на моей машине.

<?php 
include "vendor/autoload.php";
include "phpseclib/bootstrap.php";
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
include('Crypt/Rijndael.php');
include('Crypt/Random.php');
use phpseclib\Crypt\Rijndael as Crypt_Rijndael;

$text = '57F0-ECD3-1A3B-341E-BA39-F81B-F020-0DE0';

$secret = 'lkirwf897+22#bbtrm8814z5qq=498j5';

$iv = '741952hheeyy66#cs!9hjv887mxx7@8y';

function encrypt128($secret, $iv, $str)
{ 

    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secret, $str, MCRYPT_MODE_CBC, $iv));
}

function encryptRJ256($key,$iv,$text)
{
    $cipher = new Crypt_Rijndael('cbc'); 
    $cipher->setBlockLength(256);
    // keys are null-padded to the closest valid size
    // longer than the longest key and it's truncated
    $cipher->setKeyLength(256);
    $cipher->setKey($key);
    // the IV defaults to all-NULLs if not explicitly defined
    $cipher->setIV($iv);
    $cipher->disablePadding();
    $length = strlen($text);
    $pad = 32 - ($length % 32);
    $text = str_pad($text, $length + $pad, chr(0));
    return base64_encode($cipher->encrypt($text));
}
function decryptRJ256($key,$iv,$text)
{
    $cipher = new Crypt_Rijndael('cbc'); // could use CRYPT_RIJNDAEL_MODE_CBC
    $cipher->setBlockLength(256);
    // keys are null-padded to the closest valid size
    // longer than the longest key and it's truncated
    $cipher->setKeyLength(256);
    $cipher->setKey($key);
    // the IV defaults to all-NULLs if not explicitly defined
    $cipher->setIV($iv);
    $cipher->disablePadding();
    return $cipher->decrypt(base64_decode($text)); 
}   

echo $text;
echo encrypt128($secret, $iv, $text);
echo "\n";
$text = encryptRJ256($secret, $iv, $text);
echo $text;
echo "\n";
echo decryptRJ256($secret, $iv, $text);

showing output

...