mcrypt_decrypt()错误更改密钥大小

时间:2014-12-02 16:37:57

标签: php encryption mcrypt

  

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

我该如何解决这个问题?我的密钥已设置 - 无法更改它。 它必须是本地更改,我认为我的本地PHP版本对于我加载的项目来说太先进了。 我该如何解决这个问题?

8 个答案:

答案 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设置什么,你需要将其更改为有效的代码然后它应该工作正常。