Я обновляю устаревшее приложение с PHP 7.0 до 7.2, и моя функция расшифровки не работает, когда я отключаю mcrypt для openssl.
Я пробовал существующие ответы, такие как mcrypt устарела,что является альтернативой? , и Gists как https://gist.github.com/odan/c1dc2798ef9cedb9fedd09cdfe6e8e76,, но я все еще не могу заставить код работать.
Может кто-нибудь пролить свет на то, что я делаю неправильно?
Старый код
function decrypt($value, $key) {
$ivLength = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = substr($value, 0, $ivLength);
return rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', $key, true),
substr($value, $ivLength),
MCRYPT_MODE_CBC,
$iv
),
"\0"
);
}
Новый код (не работает с существующими входами)
function decrypt($value, $key) {
$ivLength = openssl_cipher_iv_length('AES-128-CBC');
$iv = substr($value, 0, $ivLength);
// Note: $key is hashed because it was hashed in the old encrypt function below
return openssl_decrypt(substr($value, $ivLength), 'AES-128-CBC', hash('sha256', $key, true), OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
}
Для контекста, воткак старый код шифровал значения:
function encrypt($value, $key) {
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_URANDOM);
return $iv . mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', $key, true),
$value,
MCRYPT_MODE_CBC,
$iv
);
}
Кроме того, необработанное значение в $value
вдвое длиннее при выводе в журнал ошибок в новом коде, чем старый код, и выглядит аналогично, но с большим количествомсимволы.