mcrypt_encrypt не работает должным образом на PHP 5.6.9

У меня есть следующий код, который отлично работает на PHP 5.5.9.

function index() { echo $this->encryptText_3des('TEST','JHHKJH9879'); } function encryptText_3des($plainText, $key) { $key = hash("md5", $key, TRUE); for ($x=0;$x<8;$x++) { $key = $key.substr($key, $x, 1); } $padded = $this->pkcs5_pad($plainText, mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC)); $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC)); return $encrypted; } function pkcs5_pad ($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } 

Шифрование происходило отлично. Но в 5.6.9, в PHP-документе mcrypt_encrypt, они упоминают, что

Недопустимые значения ключа и iv больше не принимаются. mcrypt_encrypt () теперь выдает предупреждение и возвращает FALSE, если входы недействительны. Раньше клавиши и IV были дополнены байтами '\ 0' до следующего допустимого размера.

Как изменить текущий код с пятым параметром без изменения алгоритма шифрования?

Я пытался

 $iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

и в качестве пятого параметра задан $ iv.

Но это не сработало. Шифрование было отличным от предыдущего.

Не эмулируйте старые версии PHP для слабого поведения для инициализации IV.

Используйте mcrypt_create_iv() .

Они устранили автоматический нуль-байт iv по какой-то причине .

Нашел ответ, если кому-то понадобится

 $ivSize = 8; $iv = str_repeat("\0", $ivSize); $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC, $iv)); 

Передайте 5-й параметр, который ранее выполнял предыдущая версия!

Я бы посоветовал вам не изобретать колесо, поскольку ваша функция имеет многочисленные недостатки в криптографии.

  • Не используйте 3DES, используйте AES. Правильной константой mcrypt для AES является MCRYPT_RIJNDAEL_128 , независимо от вашего желаемого размера ключа. Mcrypt довольно ужасен .
  • Не используйте md5() как функцию деривации ключа. Если вам понадобится KDF (например, потому что вы используете пароль вместо хранения ключа шифрования), используйте hash_pbkdf2() с SHA-256.
  • Вы шифруете, но не аутентифицируете свой зашифрованный текст. Шифрование с секретным ключом без аутентификации сообщений НЕ безопасно на любом языке ! Шифруйте-Затем-MAC пожалуйста.

Если вы собираетесь использовать mcrypt (наши рекомендации по безопасному шифрованию данных на PHP должны использовать libsodium, если вы можете, в противном случае defuse / php-encryption , в противном случае openssl), убедитесь, что вы mcrypt_create_iv() правильную константу mcrypt_create_iv() .

Плохо :

 $iv = mcrypt_create_iv(16, MCRYPT_RAND); // BAD EXAMPLE 

Хорошо :

 $iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); // YES!