Maison > développement back-end > tutoriel php > Pourquoi Mcrypt et OpenSSL produisent-ils des résultats de chiffrement différents pour Blowfish-ECB ?

Pourquoi Mcrypt et OpenSSL produisent-ils des résultats de chiffrement différents pour Blowfish-ECB ?

Barbara Streisand
Libérer: 2024-11-20 19:10:16
original
783 Les gens l'ont consulté

Why Do Mcrypt and OpenSSL Produce Different Encryption Results for Blowfish-ECB?

Remplacement de Mcrypt par OpenSSL

Problème : Migration d'une application utilisant Mcrypt vers OpenSSL pour le cryptage des données. Le chiffrement est Blowfish et le mode est Electronic Code Book (ECB). Cependant, le résultat des fonctions Openssl_encrypt et Openssl_decrypt diffère de celui de ses homologues de MCrypt, bien qu'il ait les mêmes paramètres.

Cause :

L'écart provient des différents algorithmes de remplissage utilisés par Mcrypt et OpenSSL. Mcrypt utilise le remplissage PKCS#5, tandis qu'OpenSSL utilise le remplissage PKCS#7. Le remplissage PKCS#7 nécessite un minimum de 1 octet de remplissage, tandis que le remplissage PKCS#5 permet une longueur de remplissage de 0 octet. De plus, Mcrypt nécessite un vecteur d'initialisation (IV) pour le mode ECB, même si IV n'est pas nécessaire pour le mode ECB.

Résolution :

Pour résoudre le problème, soit Remplissez manuellement les données d'entrée avec un remplissage de style PKCS#7 avant d'utiliser les fonctions MCrypt ou chiffrez à nouveau les données en utilisant l'algorithme de remplissage correct.

Voici une version modifiée du code fourni dans la question qui utilise le remplissage PKCS#7 pour MCrypt :

$key = "anotherpassword1";
$str = "does it work 12";

$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $str."", MCRYPT_MODE_ECB);
$dec = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB);
echo(bin2hex($enc).PHP_EOL);
var_dump($dec);

$enc = openssl_encrypt($str, 'bf-ecb', $key, true);
$dec = openssl_decrypt($enc, 'bf-ecb', $key, true);
echo(bin2hex($enc).PHP_EOL);
var_dump($dec);
Copier après la connexion

En ajoutant 1 octet de remplissage aux données d'entrée avant le cryptage MCrypt, les sorties des fonctions Mcrypt et OpenSSL correspondra. A noter que le mode ECB ne nécessite pas d'IV, et qu'il n'est pas nécessaire d'en fournir une.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal