Расшифровка PHP 3DES показала странные (плохие) символы

У меня есть форма PHP, для которой я реализовал шифрование/дешифрование 3des. После отправки и вставки информации в базу данных из внешнего интерфейса я хочу прочитать информацию в фоновом режиме.

После расшифровки информации моей формы вместо правильных символов она просто возвращает мне какой-то плохой символ, например: �СU�k�8��t�ó�2(�f�B. Как я могу решить эту проблему?

Вот мой исходный код:

   <?php
function encrypt($clear, $key , $base64 = true)
  {
    if (!$clear)
      return '';
    $clear = pack("a*H2", $clear, "80");

    if (function_exists('mcrypt_module_open') &&
        ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, "")))
    {
      $iv = create_iv(mcrypt_enc_get_iv_size($td));
      mcrypt_generic_init($td, $key, $iv);
      $cipher = $iv . mcrypt_generic($td, $clear);
      mcrypt_generic_deinit($td);
      mcrypt_module_close($td);
    }
    else {
      @include_once('des.inc');

      if (function_exists('des')) {
        $des_iv_size = 8;
        $iv = create_iv($des_iv_size);
        $cipher = $iv . des($key, $clear, 1, 1, $iv);
      }
      else {
        raise_error(array(
          'code' => 500, 'type' => 'php',
          'file' => __FILE__, 'line' => __LINE__,
          'message' => "Could not perform encryption; make sure Mcrypt is installed or lib/des.inc is available"
        ), true, true);
      }
    }
    return $base64 ? base64_encode($cipher) : $cipher;

  }


function decrypt($cipher, $key , $base64 = true)
  {
    if (!$cipher)
      return '';

    $cipher = $base64 ? base64_decode($cipher) : $cipher;

    if (function_exists('mcrypt_module_open') &&
        ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, "")))
    {
      $iv_size = mcrypt_enc_get_iv_size($td);
      $iv = substr($cipher, 0, $iv_size);

      // session corruption? (#1485970)
      if (strlen($iv) < $iv_size)
        return '';

      $cipher = substr($cipher, $iv_size);
      mcrypt_generic_init($td, $key, $iv);
      $clear = mdecrypt_generic($td, $cipher);
      mcrypt_generic_deinit($td);
      mcrypt_module_close($td);
    }
    else {
      @include_once('lib/des.inc');

      if (function_exists('des')) {
        $des_iv_size = 8;
        $iv = substr($cipher, 0, $des_iv_size);
        $cipher = substr($cipher, $des_iv_size);
        $clear = des($this->config->get_crypto_key($key), $cipher, 0, 1, $iv);
      }
      else {
        raise_error(array(
          'code' => 500, 'type' => 'php',
          'file' => __FILE__, 'line' => __LINE__,
          'message' => "Could not perform decryption; make sure Mcrypt is installed or lib/des.inc is available"
        ), true, true);
      }
    }

    /*-
     * Trim PHP's padding and the canary byte; see note in
     * rcmail::encrypt() and http://php.net/mcrypt_generic#68082
     */
    $clear = substr(rtrim($clear, "\0"), 0, -1);

    return $clear;
  }


function create_iv($size)
  {
    $iv = '';
    for ($i = 0; $i < $size; $i++)
        $iv .= chr(mt_rand(0, 255));
    return $iv;
  }

**echo decrypt('ijvdfvf1==+Ac44tgLHdAL+w7O2MiiIZplC','s&gs1?m5l8PQIOGckvxDT4kR',true);**

?>

Я хочу зашифровать и расшифровать символы UTF-8 в своей форме.


person brelian    schedule 07.09.2014    source источник
comment
Я едва знаю PHP, но мне не кажется, что вы отменяете начальную операцию pack в дешифраторе. Возможно, вызовите unpack в качестве последнего шага перед возвратом.   -  person President James K. Polk    schedule 07.09.2014
comment
@GregS, я не мог понять твой комментарий :( Куда мне распаковывать??????   -  person brelian    schedule 07.09.2014
comment
Поскольку вы pack делаете первый шаг в encrypt, вы должны unpack сделать последний шаг в decrypt.   -  person President James K. Polk    schedule 07.09.2014
comment
@GregS, но я видел, что у распаковки есть 2 аргумента, один из них - моя зашифрованная строка, а другой - что это???????? пожалуйста, помогите мне больше   -  person brelian    schedule 07.09.2014
comment
Как я уже сказал, я едва знаю PHP. Я просто замечаю, что все, что вы делаете при шифровании, вы должны отменить при дешифровании.   -  person President James K. Polk    schedule 07.09.2014


Ответы (1)


Я думаю, вы забыли один $cipher = substr($cipher, $des_iv_size); в части mcrypt вашей функции decrypt.

Кроме того, вы должны явно преобразовывать строки в (и из) кодировку UTF-8, если хотите поддерживать UTF-8.

Наконец, кажется, что вы используете одиночный DES, если 3DES недоступен. Это специально?

person Maarten Bodewes    schedule 08.09.2014
comment
Да, я хочу использовать DES - person brelian; 09.09.2014