2014-12-02 62 views
17

mcrypt_decrypt():此算法不支持大小爲15的密鑰。僅支持尺寸爲16,24或32的按鍵mcrypt_decrypt()錯誤更改密鑰大小

如何解決此問題?我的密鑰已設置 - 無法更改。 它必須是本地更改,我認爲我的本地PHP版本對於我加載的項目來說太高級了。 我該如何解決這個問題?

+0

您沒有給我們足夠的信息。您是否使用正確的密碼來解密字符串(使用加密的密碼)?不同的密碼支持不同的密鑰大小。 http://php.net/manual/en/function.mcrypt-decrypt.php – 2014-12-02 16:40:47

+0

項目文件在其他機器上工作,所以密碼是好的 - 進一步 - 重新安裝我的xampp之前一切正常 – 2014-12-02 16:42:15

+0

注意到:if你正在通過'$ key = 0x12345679ABCDEF'創建一個足夠的int,傳入的值是12-19位(十進制)字符串,以字符數組「-1234567」而不是32位二進制值。 (它通過標準方法將int轉換爲字符串)。密鑰必須通過「\ xab \ xcd \ xef \ x01 \ x02」定義爲字符串(又名:數組/緩衝區)。但是,直到更新到版本5.6之前,您才意識到這個問題已經解決。你實際上已經傳遞了一個短數字字符串,它得到空填充 – ppostma1 2016-11-07 18:38:43

回答

40

你有更新到5.6嗎?它說

無效的密鑰和iv尺寸不再被接受。如果輸入無效,mcrypt_decrypt()現在將引發警告並返回FALSE。以前,鍵和IV用'\ 0'字節填充到下一個有效大小。

Reference

閱讀報價的最後一行,在那裏你會發現你的解決方案:)

mcrypt_decrypt():大小15重點不是這個算法的支持。大小16,24或32的唯一密鑰支持

這意味着你需要墊\0密鑰(這是以前版本中爲你做)

$key=$key."\0"; 
+0

所以我該如何解決這個問題? – 2014-12-02 16:45:02

+2

'以前,密鑰和IV用'\ 0'字節填充到下一個有效大小。「您也是這樣做的:) – 2014-12-02 16:45:18

+0

會喜歡」如何做到這一點「的鏈接。如果你有一個 – 2014-12-02 16:47:29

11

我繼續創建了一個功能基於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; 
} 
1

您不需要用「\ 0」填充密鑰。

我遷移到一個新的PHP 7服務器時有同樣的問題,我得到的消息:

mcrypt_decrypt():大小19重點不是這個算法的支持。僅支持尺寸爲16,24或32的 按鍵。

我在代碼中的密鑰是19個字符的字符串,我只是將其更改爲32個字符的字符串,一切都很好。

因此,如錯誤消息所示,請使用有效的大小鍵。

+0

*我的密鑰已設置 - 無法更改。它必須是本地更改* – 2016-11-10 05:03:07

+0

正確。就我而言,我可以改變鑰匙。 – Brac 2016-11-11 19:58:32

+1

我很感激你。但有一些困惑。這是個好主意嗎?如果是這樣,DB的變化如何? – Johir 2017-04-02 08:40:50

1

我有這個問題與OSTicket 1.6 ST(是舊版本我知道)。主機公司剛剛進入PHP 5.6,並打破了cron.php的Mail Fetch。我發佈這個希望它可以幫助其他人更快地解決這個問題。

你必須編輯文件「include/class.misc.php」。

將由@troskater創作的答案中提供的函數「pad_key」添加到「include/class.misc。PHP的」文件,然後在功能線51 「解密」 改變

回報修剪(mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$鹽,...

改用

回報裝飾(mcrypt_decrypt(MCRYPT_RIJNDAEL_256,pad_key($鹽) ...

3

對於Laravel 5

只要運行php artisan key:generate

Application key [EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va] set successfully. 

如果你沒有看到你的關鍵更新,只需將其粘貼在你的.env文件。

APP_KEY=EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va

刷新頁面

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; 
} 
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); 
    } 
?> 

你將想要將$密鑰更改爲128位或256位加密的代碼。我簡單地複製了我從這裏生成的代碼:Generate Code

我創建了一個由32位字符組成的256位代碼,從而修復了無效密鑰大小爲15或任何數字導致錯誤的問題。所以無論爲$ key設置,你都需要將其改爲有效的代碼,然後它應該可以正常工作。