mcrypt_decrypt():サイズ15のキーは、このアルゴリズムではサポートされていません。サイズ16、24、または32のキーのみがサポートされます
この問題を修正するにはどうすればよいですか?私の鍵が設定されている-それを変更することはできません。ローカルの変更である必要があります。ローカルのPHPバージョンは、ロードしたプロジェクトに対して高度すぎます。どうすれば修正できますか?
5.6に更新しましたか?それは言います
無効なキーとivサイズは受け入れられなくなりました。 mcrypt_decrypt()は、入力が無効な場合に警告をスローし、FALSEを返すようになりました。以前は、キーとIVに '\ 0'バイトが次の有効なサイズまで埋め込まれていました。
その引用の最後の行を読んでください、そしてあなたはあなたの解決策を見つけるでしょう:)
mcrypt_decrypt():サイズ15のキーは、このアルゴリズムではサポートされていません。サイズ16、24、または32のキーのみがサポートされます
つまり、\0
でキーをパディングする必要があることを意味します(これは以前のバージョンがやっていたことです)
$key=$key."\0";
先に進み、 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;
}
Laravel 5
ただ走れ php artisan key:generate
:
Application key [EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va] set successfully.
更新されたキーが表示されない場合は、.env
ファイル。
APP_KEY=EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va
ページを更新する
キーに「\ 0」を埋め込む必要はありません。
新しいPHP 7サーバーに移行するときに同じ問題が発生し、次のメッセージが表示されました。
mcrypt_decrypt():サイズ19のキーはこのアルゴリズムでサポートされていません。サイズ16、24、または32のキーのみがサポートされます。
コードに含まれていたキーは19文字の文字列でしたが、単純に32文字の文字列に変更しただけで、すべて問題ありませんでした。
そのため、エラーメッセージが示すように、有効なサイズキーを使用します。
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)、...
これには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を利用しています。
暗号化コードが次のような場合:
<?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に設定されているものはすべて、有効なコードに変更する必要があります。
私は同じ問題を抱えていましたが、これで修正しました
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;
}