En PHP, il est très courant d'utiliser le mode AES CBC pour le cryptage et le déchiffrement. Cependant, lorsque vous utilisez le mode AES CBC pour décrypter, vous risquez de rencontrer des caractères tronqués. Ce problème est très courant, mais facile à résoudre. Dans cet article, je vais vous présenter comment décrypter normalement les données cryptées AES CBC via PHP et éviter les caractères tronqués.
1. Description du problème
En PHP, nous pouvons utiliser les fonctions openssl_encrypt et openssl_decrypt pour effectuer respectivement des opérations de cryptage et de décryptage. Par exemple, le code suivant utilise le mode AES CBC pour chiffrer les données :
$key = '1234567890123456'; $data = 'hello world'; $iv = '1234567890123456'; $encrypted = openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
où $key est la clé, $data est les données à chiffrer et $iv est le vecteur initial. Après le cryptage, la variable $encrypted obtiendra les données cryptées. Maintenant, nous devons le déchiffrer :
$key = '1234567890123456'; $encrypted = 'soLPpFUpwJdVEaYpuu6zRg=='; $iv = '1234567890123456'; $decrypted = openssl_decrypt($encrypted, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); echo $decrypted;
Cependant, après avoir exécuté le code ci-dessus, vous pouvez obtenir le résultat suivant :
纭洏鍥?J 鍗虫槑涓?
Ceci est un charabia, pas les données originales "hello world". En effet, la fonction de décryptage a des limites strictes sur la longueur des paramètres d'entrée, donc si la longueur des données à décrypter est incorrecte, des caractères tronqués apparaîtront.
2. Solution
Afin de résoudre ce problème, nous devons comprendre quelques connaissances de base du mode AES CBC.
En mode AES CBC, le cryptage et le déchiffrement nécessitent un vecteur d'initialisation (IV). Ce vecteur initial doit utiliser la même valeur lors du cryptage et du déchiffrement, sinon cela provoquera des erreurs de données lors du déchiffrement.
La longueur du vecteur initial doit être égale à la taille de bloc requise par l'algorithme de cryptage. Par exemple, lors de l'utilisation du mode AES CBC 128 bits, le vecteur d'initialisation doit avoir une longueur de 16 octets (128 bits / 8 bits). Si cette condition n'est pas remplie, des caractères tronqués ou d'autres problèmes surviendront lors du décryptage.
Par conséquent, nous devons vérifier si la longueur du paramètre d'entrée répond aux exigences. Lorsque la longueur est illégale, une opération de remplissage est requise. Un remplissage peut être effectué avant le décryptage pour garantir que la longueur des données d'entrée est la même que celle utilisée lors du cryptage.
Compte tenu des problèmes et des solutions ci-dessus, nous pouvons modifier le code original pour l'adapter aux exigences du mode AES CBC, comme indiqué ci-dessous :
$key = '1234567890123456'; $encrypted = 'soLPpFUpwJdVEaYpuu6zRg=='; $iv = '1234567890123456'; // 检查初始向量长度是否正确 if (strlen($iv) != 16) { echo 'Error: IV length is not valid!'; exit; } // 检查输入参数长度是否正确 $decrypted = openssl_decrypt($encrypted, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); if ($decrypted === false) { // 进行填充操作 $padded_data = $encrypted . str_repeat(chr(16), 16 - (strlen($encrypted) % 16)); $decrypted = openssl_decrypt($padded_data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); } echo $decrypted;
Dans le code ci-dessus, vérifiez d'abord si la longueur initiale du vecteur est correcte. S'il est incorrect, une erreur est générée et le programme se termine. Ensuite, la longueur des données d'entrée avant le décryptage est vérifiée. Si la longueur est incorrecte, un remplissage est effectué pour garantir que la longueur des données répond aux exigences.
De cette façon, vous pouvez éviter les caractères tronqués lors du décryptage.
3. Résumé
Lors de l'utilisation du mode AES CBC pour le cryptage et le décryptage, si la longueur du paramètre d'entrée est incorrecte, le décryptage peut échouer et des caractères tronqués peuvent apparaître. Pour éviter ce problème, nous devons vérifier la longueur des paramètres d'entrée et effectuer le remplissage nécessaire.
Ce qui précède est ma solution au problème du déchiffrement des caractères tronqués en mode PHP AES CBC. J'espère que ça aide.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!