Php mcrypt_decrypt()错误更改密钥大小
mcrypt_decrypt():此算法不支持大小为15的密钥。仅支持尺寸为16、24或32的键 如何解决此问题?我的钥匙已设置-无法更改。 这必须是一个本地更改,我认为我的本地PHP版本对于我加载的项目来说太高级了。Php mcrypt_decrypt()错误更改密钥大小,php,encryption,mcrypt,Php,Encryption,Mcrypt,mcrypt_decrypt():此算法不支持大小为15的密钥。仅支持尺寸为16、24或32的键 如何解决此问题?我的钥匙已设置-无法更改。 这必须是一个本地更改,我认为我的本地PHP版本对于我加载的项目来说太高级了。 如何修复此问题?您是否已更新到5.6?上面说 不再接受无效的密钥和iv大小。如果输入无效,mcrypt_decrypt()现在将抛出警告并返回FALSE。以前的键和IVs用“\0”字节填充到下一个有效大小 阅读该引用的最后一行,您将在那里找到您的解决方案:) mcrypt_de
如何修复此问题?您是否已更新到5.6?上面说 不再接受无效的密钥和iv大小。如果输入无效,mcrypt_decrypt()现在将抛出警告并返回FALSE。以前的键和IVs用“\0”字节填充到下一个有效大小 阅读该引用的最后一行,您将在那里找到您的解决方案:) mcrypt_decrypt():此算法不支持大小为15的密钥。仅支持尺寸为16、24或32的键 这意味着您需要用
\0
(这就是以前版本为您所做的)
我继续创建了一个基于的函数 这可以用于任何键长度,以确保其大小正确
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;
}
功能键($key){
//钥匙太大了
如果(strlen($key)>32)返回false;
//设定尺寸
$size=数组(16,24,32);
//循环浏览尺寸和键盘键
foreach($s大小){
而(strlen($key)<$s)$key=$key.“\0”;
if(strlen($key)=$s)break;//如果密钥与大小匹配,则完成
}
//返回
返回$key;
}
您不需要在键上加“\0”
在迁移到新的PHP 7服务器时,我遇到了同样的问题,我得到了这样一条消息:
mcrypt_decrypt():此算法不支持大小为19的密钥。只有
支持尺寸为16、24或32的键
代码中的关键是一个由19个字符组成的字符串,我只是简单地将其更改为一个由32个字符组成的字符串,然后一切又恢复正常
因此,正如错误消息所建议的,请使用有效的大小键。我在OSTicket 1.6 ST上遇到了这个问题(是的,我知道旧版本)。托管公司刚刚转到PHP5.6,它中断了cron.PHP的邮件获取。我发布这篇文章,希望它能帮助其他人更快地解决这个问题 您必须编辑文件“include/class.misc.php” 将@troskater编写的答案中提供的函数“pad_key”添加到“include/class.misc.php”文件中,然后在函数“decrypt”的第51行进行更改 返回修剪(mcrypt_decrypt(mcrypt_RIJNDAEL_256,$salt 改用 返回修剪(mcrypt_解密(mcrypt_RIJNDAEL_256,键盘键($salt) 拉威尔5号 只需运行php artisan key:generate:
应用程序密钥[EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va]设置成功。
如果您没有看到密钥更新,只需将其粘贴到.env
文件中即可
APP_KEY=eaajgad0ufdeg7tpvmoqfkfaq46bqi8va
刷新你的页面我也遇到了同样的问题,但用这个解决了它
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;
}
公共函数设置键($key){
$len=strlen($key);
如果($len<24&$len!=16){
$key=str\u pad($key,24,“\0”,str\u pad\u RIGHT);
}elseif($len>24&$len<32){
$key=str\u pad($key,32,“\0”,str\u pad\u 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);
}
?>
您需要将$key更改为128或256位加密代码。我只是复制了一个从这里生成的代码:
我为我的代码创建了一个由32个字符组成的256位代码,从而解决了无效密钥大小为15或任何导致错误的数字的问题。因此,无论为$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");
}
功能键($key)
{
//获取当前密钥大小
$keySize=strlen($key);
//设置包含有效大小的数组
$validSizes=[16,24,32];
//循环大小并返回正确的填充$key
foreach($validSize为$validSize){
如果($keySize)您没有给我们提供足够的信息。您是否使用正确的密码来解密字符串(加密字符串时使用的密码)?不同的密码支持不同的密钥大小。项目文件在其他机器上工作,因此在重新安装我的xampp之前,密码很好-更进一步-一切正常注意:如果您通过$key=0x12345679ABCDEF
创建足够的整数,传递的值是12-19位(十进制)字符串作为字符数组-1234567
,而不是32位二进制值。(它通过标准方法将int转换为字符串)。必须通过“\xab\xcd\xef\x01\x02”将键定义为字符串(也称为数组/缓冲区)。但在更新到5.6版之前,您不会意识到这一点。实际上,您一直在传递一个短数字字符串,该字符串为null。最好不要使用PHP mcrypt,它是弃用软件,多年来未更新,并且不支持标准PKCS#7(née PKCS#5)填充,只有非标准的空填充,甚至不能用二进制数据。McLIPT有许多优秀的追溯到2003。在MpLIPT扩展被删除在PHP 7.2中删除。相反,考虑使用,或者,它们提供了一个完整的解决方案,并保持和纠正。我如何解决这个问题?<代码>以前的密钥和IVS WER。e用“\0”字节填充到下一个有效大小。
您也可以这样做:)请注意,之所以进行此更改,是因为密钥应该由n/8
字节组成,与随机数无法区分,其中n
是密钥大小(以位为单位)。如果您的密钥较小,则很可能您正在使用密码作为密钥。您不应该这样做,而是使用password\u hash
从密码创建密钥(如果密钥太大,则可能使用最左边的字节)。这将给您带来更多的代表性,Hanky웃潘奇,这是一个
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");
}