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