mcrypt_decrypt():此算法不支持大小为15的密钥。仅支持尺寸为16,24或32的按键
我该如何解决这个问题?我的密钥已设置 - 无法更改它。 它必须是本地更改,我认为我的本地PHP版本对于我加载的项目来说太先进了。 我该如何解决这个问题?
答案 0 :(得分:42)
你有没有更新到5.6?它说
不再接受无效的密钥和iv尺寸。 mcrypt_decrypt()现在将抛出警告,如果输入无效,则返回FALSE。以前,键和IV用'\ 0'字节填充到下一个有效大小。
<强> Reference 强>
阅读该报价的最后一行,您将找到解决方案:)
mcrypt_decrypt():此算法不支持大小为15的密钥。仅支持尺寸为16,24或32的按键
这意味着您需要使用\0
填充您的密钥(这是之前的版本为您做的)
$key=$key."\0";
答案 1 :(得分:13)
我继续创建了一个基于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;
}
答案 2 :(得分:3)
对于Laravel 5
只需运行php artisan key:generate
:
Application key [EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va] set successfully.
如果您没有看到更新密钥,请将其粘贴到.env
文件中。
APP_KEY=EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va
刷新页面
答案 3 :(得分:1)
您不需要使用&#34; \ 0&#34;填充密钥。
迁移到新的PHP 7服务器时遇到了同样的问题,我收到了消息:
mcrypt_decrypt():此算法不支持大小为19的密钥。只要 支持大小为16,24或32的键。
我在代码中的密钥是一个包含19个字符的字符串,我只需将其更改为32个字符的字符串,一切都很好。
因此,如错误消息所示,请使用有效的大小键。
答案 4 :(得分:1)
我在OSTicket 1.6 ST(我知道的旧版本)中遇到过这个问题。托管公司刚刚使用PHP 5.6,它打破了Cron.php的Mail Fetch。我发布了这篇文章,希望能帮助其他人更快地解决这个问题。
您必须编辑文件&#34; include / class.misc.php&#34;。
添加功能&#34; pad_key&#34;在@troskater撰写的答案中提供给&#34; include / class.misc.php&#34;文件然后在函数的第51行&#34;解密&#34;变化
返回修剪(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $ salt ,...
代替使用
返回修剪(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, pad_key($ salt),...
答案 5 :(得分:1)
你可以使用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而不是附加&#34; \ 0&#34;在循环中。
答案 6 :(得分: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;
}
答案 7 :(得分:0)
如果您的加密代码如下所示:
<?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);
}
?>
您需要将$ key更改为128位或256位加密代码。我只是复制了我从这里生成的代码:Generate Code
我为我创建了一个256位代码,由32个字符组成,从而解决了无效密钥大小为15或导致错误的任何数字的问题。所以无论为$ key设置什么,你需要将其更改为有效的代码然后它应该工作正常。