mcrypt_decrypt (): ключ размера 15, не поддерживаемый этим алгоритмом. Поддерживаются только ключи размером 16, 24 или 32
Как я могу исправить эту проблему? мой ключ установлен — не могу его поменять.
Это должно быть локальное изменение, я думаю, что моя локальная версия PHP слишком продвинута для проекта, который я загрузил.
Как я могу это исправить?
Вы обновили до 5.6? Это говорит
Неверный ключ и iv размеры больше не принимаются. mcrypt_decrypt () теперь выдаст предупреждение и вернет FALSE, если входные данные неверны. Ранее ключи и IV дополнялись байтами ‘\ 0’ до следующего допустимого размера.
Прочитайте последнюю строку этой цитаты, и там вы найдете свое решение 🙂
mcrypt_decrypt (): ключ размера 15, не поддерживаемый этим алгоритмом. Поддерживаются только ключи размером 16, 24 или 32
Это означает, что вам нужно дополнить свой ключ \0
(это то, что предыдущие версии делали для вас)
$key=$key."\0";
Я пошел вперед и создал функцию, основанную на Hanky 웃 Panky’s answer.
Это можно использовать с любой длиной ключа, чтобы убедиться, что это правильный размер.
function pad_key($key){
// key is too large
if(strlen($key) > 32) return false;
// set sizes
$sizes = array(16,24,32);
// loop through sizes and pad key
foreach($sizes as $s){
while(strlen($key) < $s) $key = $key."\0";
if(strlen($key) == $s) break; // finish if the key matches a size
}
// return
return $key;
}
Для Laravel 5
Просто беги php artisan key:generate
:
Application key [EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va] set successfully.
Если вы не видите обновленный ключ, просто вставьте его в свой .env
файл.
APP_KEY=EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va
Обновить страницу
Вам не нужно дополнять ключ «\ 0».
У меня была такая же проблема при переходе на новый сервер PHP 7, и я получил сообщение:
mcrypt_decrypt (): ключ размера 19, не поддерживаемый этим алгоритмом. Только
ключи размером 16, 24 или 32 поддерживаются.
Ключ, который у меня был в коде, был строкой из 19 символов, я просто изменил его на строку из 32 символов, и все снова было в порядке.
Поэтому, как следует из сообщения об ошибке, используйте правильный ключ размера.
У меня была эта проблема с OSTicket 1.6 ST (да, старая версия, которую я знаю). Хостинговая компания просто перешла на PHP 5.6 и сломала Mail Fetch для cron.php. Я публикую это, надеясь, что это поможет другим решить эту проблему быстрее.
Вы должны отредактировать файл «include / class.misc.php».
Добавьте функцию «pad_key», предоставленную в ответе, автором которой является @troskater, в файл «include / class.misc.php», а затем в строке 51 в функции «расшифруйте» изменить
возврат обрезки (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ соль,…
вместо того, чтобы использовать
возврат обрезки (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, pad_key ($ соль),…
Вы можете просто использовать str_pad () для этого. В простейшей форме этого будет достаточно.
function padKey($key)
{
// Get the current key size
$keySize = strlen($key);
// Set an array containing the valid sizes
$validSizes = [16,24,32];
// Loop through sizes and return correct padded $key
foreach($validSizes as $validSize) {
if ($keySize <= $validSize) return str_pad($key, $validSize, "\0");
}
// Throw an exception if the key is greater than the max size
throw new Exception("Key size is too large");
}
Остальные ответы подойдут просто отлично. Я просто использую здесь встроенную функцию PHP str_pad вместо добавления «\ 0» в цикле.
У меня была такая же проблема, но я исправил это
public function setKey($key) {
$len = strlen($key);
if($len < 24 && $len != 16){
$key = str_pad($key, 24, "\0", STR_PAD_RIGHT);
} elseif ($len > 24 && $len < 32) {
$key = str_pad($key, 32, "\0", STR_PAD_RIGHT);
}elseif ($len > 32){
$key = substr($key, 0, 32);
}
$this->key = $key;
}
Если ваш код шифрования выглядит так:
<?php
function encryptCookie($value){
if(!$value){return false;}
$key = 'aNdRgUkXp2s5v8y/B?E(H+MbQeShVmYq';
$text = $value;
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv);
return trim(base64_encode($crypttext)); //encode for cookie
}
function decryptCookie($value){
if(!$value){return false;}
$key = 'aNdRgUkXp2s5v8y/B?E(H+MbQeShVmYq';
$crypttext = base64_decode($value); //decode cookie
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $crypttext, MCRYPT_MODE_ECB, $iv);
return trim($decrypttext);
}
?>
Вы захотите изменить ключ $ на 128 или 256-битный зашифрованный код. Я просто скопировал код, который я сгенерировал отсюда: Генерировать код
Я создал для себя 256-битный код, который состоит из 32 символов и, таким образом, исправляет проблему неправильного размера ключа 15 или любого другого числа, вызывающего ошибку. Итак, что бы ни было установлено для $ key, вам нужно изменить его на действительный код, и тогда он будет работать нормально.