web-dev-qa-db-fra.com

erreur mcrypt_decrypt () change la taille de la clé

mcrypt_decrypt (): Clé de taille 15 non prise en charge par cet algorithme. Prise en charge uniquement des clés de tailles 16, 24 ou 32

Comment puis-je résoudre ce problème? ma clé est définie - ne peut pas la changer. Ce doit être un changement local, je pense que ma version locale PHP version est trop avancée pour le projet que j'ai chargé. Comment puis-je résoudre ce problème?

18
Asaf Maoz

Avez-vous mis à jour vers 5.6? Ça dit

Les tailles de clé et iv non valides ne sont plus acceptées. mcrypt_decrypt () va maintenant lancer un avertissement et retourner FALSE si les entrées ne sont pas valides. Auparavant, les clés et les IV étaient remplis avec des octets "\ 0" à la taille valide suivante.

Référence

Lisez la dernière ligne de cette citation, et vous y trouverez votre solution :)

mcrypt_decrypt (): Clé de taille 15 non prise en charge par cet algorithme. Prise en charge uniquement des clés de tailles 16, 24 ou 32

Cela signifie que vous devez saisir votre clé avec \0 (c'est ce que les versions précédentes faisaient pour vous)

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

Je suis allé de l'avant et j'ai créé une fonction basée sur réponse de Hanky ​​웃 Panky .

Cela peut être utilisé avec n'importe quelle longueur de clé pour vous assurer que c'est la bonne taille.

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

Pour Laravel 5

Exécutez simplement php artisan key:generate:

Application key [EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va] set successfully.

Si vous ne voyez pas votre clé mise à jour, collez-la simplement dans votre .env fichier.

APP_KEY=EaaJgaD0uFDEg7tpvMOqKfAQ46Bqi8Va

Rafraîchissez votre page

3
kyo

Vous n'avez pas besoin de remplir la clé avec "\ 0".

J'ai eu le même problème lors de la migration vers un nouveau serveur PHP 7 et j'ai reçu le message:

mcrypt_decrypt (): Clé de taille 19 non prise en charge par cet algorithme. Seules les clés de tailles 16, 24 ou 32 sont prises en charge.

La clé que j'avais dans le code était une chaîne de 19 caractères, je l'ai simplement changée en une chaîne de 32 caractères et tout allait bien à nouveau.

Ainsi, comme l'indique le message d'erreur, utilisez une clé de taille valide.

1
Brac

J'ai eu ce problème avec OSTicket 1.6 ST (oui, je connais l'ancienne version). La société d'hébergement vient de passer à PHP 5.6 et il a cassé la récupération de courrier pour cron.php. Je publie ceci en espérant que cela aide les autres à résoudre ce problème plus rapidement.

Vous devez éditer le fichier "include/class.misc.php".

Ajoutez la fonction "pad_key" fournie dans la réponse rédigée par @troskater au fichier "include/class.misc.php" puis à la ligne 51 dans la fonction "décryptage" changez

retour trim (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ salt, ...

utiliser à la place

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

1
dan-iel

Vous pouvez simplement utiliser str_pad () pour cela. Dans sa forme la plus simple, cela suffira.

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"); 

}

Les autres réponses feront l'affaire. Je profite juste de la fonction intégrée PHP str_pad ici au lieu d'ajouter "\ 0" dans une boucle.

1
zgr024

Si votre code de cryptage ressemble à ceci:

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

Vous voudrez changer la clé $ en un code crypté de 128 ou 256 bits. J'ai simplement copié un code que j'ai généré à partir d'ici: Generate Code

J'ai créé un code 256 bits pour le mien qui se compose de 32 caractères et résout ainsi le problème de la taille de clé non valide de 15 ou du nombre provoquant l'erreur. Donc, tout ce qui est défini pour $ key, vous devez le changer en un code valide et cela devrait fonctionner correctement.

0
JCBrown

J'ai eu le même problème, mais je l'ai résolu avec ce

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
Dimitar Kalenderov