Comment résoudre le code tronqué de décryptage php aes cbc

PHPz
Libérer: 2023-04-11 13:51:36
original
2629 Les gens l'ont consulté

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);
Copier après la connexion

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;
Copier après la connexion

Cependant, après avoir exécuté le code ci-dessus, vous pouvez obtenir le résultat suivant :

纭洏鍥?J    鍗虫槑涓?
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!