У меня есть следующий код, который отлично работает на 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-й параметр, который ранее выполнял предыдущая версия!
Я бы посоветовал вам не изобретать колесо, поскольку ваша функция имеет многочисленные недостатки в криптографии.
MCRYPT_RIJNDAEL_128
, независимо от вашего желаемого размера ключа. Mcrypt довольно ужасен . md5()
как функцию деривации ключа. Если вам понадобится KDF (например, потому что вы используете пароль вместо хранения ключа шифрования), используйте hash_pbkdf2()
с SHA-256. Если вы собираетесь использовать 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!