web-dev-qa-db-ja.com

mcrypt_decrypt()エラーはキーサイズを変更します

mcrypt_decrypt():サイズ15のキーは、このアルゴリズムではサポートされていません。サイズ16、24、または32のキーのみがサポートされます

この問題を修正するにはどうすればよいですか?私の鍵が設定されている-それを変更することはできません。ローカルの変更である必要があります。ローカルのPHPバージョンは、ロードしたプロジェクトに対して高度すぎます。どうすれば修正できますか?

18
Asaf Maoz

5.6に更新しましたか?それは言います

無効なキーとivサイズは受け入れられなくなりました。 mcrypt_decrypt()は、入力が無効な場合に警告をスローし、FALSEを返すようになりました。以前は、キーとIVに '\ 0'バイトが次の有効なサイズまで埋め込まれていました。

参照

その引用の最後の行を読んでください、そしてあなたはあなたの解決策を見つけるでしょう:)

mcrypt_decrypt():サイズ15のキーは、このアルゴリズムではサポートされていません。サイズ16、24、または32のキーのみがサポートされます

つまり、\0でキーをパディングする必要があることを意味します(これは以前のバージョンがやっていたことです)

$key=$key."\0";
43
Hanky Panky

先に進み、 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;
}
13
troskater

Laravel 5

ただ走れ php artisan key:generate

Application key [EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va] set successfully.

更新されたキーが表示されない場合は、.envファイル。

APP_KEY=EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va

ページを更新する

3
kyo

キーに「\ 0」を埋め込む必要はありません。

新しいPHP 7サーバーに移行するときに同じ問題が発生し、次のメッセージが表示されました。

mcrypt_decrypt():サイズ19のキーはこのアルゴリズムでサポートされていません。サイズ16、24、または32のキーのみがサポートされます。

コードに含まれていたキーは19文字の文字列でしたが、単純に32文字の文字列に変更しただけで、すべて問題ありませんでした。

そのため、エラーメッセージが示すように、有効なサイズキーを使用します。

1
Brac

OSTicket 1.6 STでこの問題が発生しました(私が知っている古いバージョンです)。ホスティング会社はPHP 5.6に行き、cron.phpのMail Fetchを壊しました。他の人がこの問題をより早く解決するのを助けることを望んで、私はこれを投稿しています。

ファイル「include/class.misc.php」を編集する必要があります。

@troskaterによって作成された回答で提供される関数「pad_key」を「include/class.misc.php」ファイルに追加し、関数「decrypt」の51行目に変更します

return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256、$ salt、...

代わりに使用する

return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256、pad_key($ salt)、...

1
dan-iel

これには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"); 

}

他の答えは問題ありません。ループに「\ 0」を追加する代わりに、ビルトインPHP関数str_padを利用しています。

1
zgr024

暗号化コードが次のような場合:

<?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

32文字で構成される256ビットコードを作成し、無効なキーサイズ15またはエラーの原因となっている数値の問題を修正しました。したがって、$ keyに設定されているものはすべて、有効なコードに変更する必要があります。

0
JCBrown

私は同じ問題を抱えていましたが、これで修正しました

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