Php mcrypt_decrypt()错误更改密钥大小

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

mcrypt_decrypt():此算法不支持大小为15的密钥。仅支持尺寸为16、24或32的键

如何解决此问题?我的钥匙已设置-无法更改。 这必须是一个本地更改,我认为我的本地PHP版本对于我加载的项目来说太高级了。
如何修复此问题?

您是否已更新到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"); 

}