Maison > Article > développement back-end > Comment décrypter le cryptage AES en PHP avec MCrypt en utilisant evpKDF() ?
Déchiffrement du cryptage AES en PHP avec MCrypt
Dans ce scénario, un mot de passe est crypté à l'aide de CryptoJS en JavaScript et doit être déchiffré sur le côté serveur avec PHP en utilisant MCrypt. Voici comment y parvenir :
La tentative précédente de déchiffrement du mot de passe à l'aide de la fonction mcrypt_decrypt() de MCrypt a échoué en raison de différences dans la génération de clé. CryptoJS utilise un mot de passe pour créer à la fois la clé AES et le vecteur d'initialisation (IV), tandis que MCrypt utilise uniquement la clé pour le cryptage/déchiffrement.
Pour résoudre ce problème, nous devons dériver la clé et IV en PHP en utilisant la même méthode que CryptoJS. Voici une fonction evpKDF() personnalisée à cet effet :
<code class="php">function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") { // Code goes here... }</code>
Pour utiliser la fonction evpKDF(), le mot de passe crypté en JavaScript doit inclure un sel généré. Voici le code CryptoJS mis à jour :
<code class="javascript"> var encryptedPassword = CryptoJS.AES.encrypt(password, "Secret Passphrase"); var ivHex = encryptedPassword.iv.toString(); var ivSize = encryptedPassword.algorithm.ivSize; // same as blockSize var keySize = encryptedPassword.algorithm.keySize; var keyHex = encryptedPassword.key.toString(); var saltHex = encryptedPassword.salt.toString(); // must be sent var openSslFormattedCipherTextString = encryptedPassword.toString(); // not used var cipherTextHex = encryptedPassword.ciphertext.toString(); // must be sent</code>
Côté serveur en PHP, récupérez le sel et le texte chiffré de la requête. Ensuite, utilisez la fonction evpKDF() pour dériver la clé et l'IV en fonction du mot de passe et du sel :
<code class="php">$keyAndIV = evpKDF("Secret Passphrase", hex2bin($saltHex));</code>
Enfin, effectuez le décryptage avec MCrypt :
<code class="php">$decryptPassword = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $keyAndIV["key"], hex2bin($cipherTextHex), MCRYPT_MODE_CBC, $keyAndIV["iv"]);</code>
Cela devrait réussir à décrypter le mot de passe crypté à l'aide de CryptoJS avec AES. De plus, une version utilisant l'extension OpenSSL est fournie comme alternative à MCrypt.
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!