Cryptage en JavaScript et décryptage en PHP
Un utilisateur crypte un mot de passe en JavaScript à l'aide du cryptage CryptoJS AES et en essayant de le déchiffrer en PHP en utilisant mcrypt_decrypt() mais en rencontrant des résultats incorrects.
La divergence provient de la méthode utilisée pour dériver la clé de chiffrement et le vecteur d'initialisation (IV) en JavaScript et PHP. CryptoJS dérive ces valeurs à l'aide d'un mot de passe, tandis que mcrypt_decrypt() de PHP n'attend qu'une clé.
Pour déchiffrer correctement le texte chiffré, le code PHP doit dériver la clé de cryptage et l'IV de le mot de passe et le sel de la même manière que le code JavaScript. Ceci peut être réalisé en utilisant une fonction comme evpKDF(), qui implémente la fonction de dérivation de clé basée sur le hachage (HKDF).
<code class="php">function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") { // ... Implementation ... }</code>
Une fois la clé et l'IV dérivées, mcrypt_decrypt() peut être invoquée comme suit :
<code class="php">$keyAndIV = evpKDF("Secret Passphrase", hex2bin($saltHex)); $decryptPassword = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $keyAndIV["key"], hex2bin($cipherTextHex), MCRYPT_MODE_CBC, $keyAndIV["iv"]);</code>
Alternativement, l'extension OpenSSL peut être utilisée pour déchiffrer le texte chiffré :
<code class="php">function decrypt($ciphertext, $password) { $ciphertext = base64_decode($ciphertext); if (substr($ciphertext, 0, 8) != "Salted__") { return false; } $salt = substr($ciphertext, 8, 8); $keyAndIV = evpKDF($password, $salt); $decryptPassword = openssl_decrypt( substr($ciphertext, 16), "aes-256-cbc", $keyAndIV["key"], OPENSSL_RAW_DATA, // base64 was already decoded $keyAndIV["iv"]); return $decryptPassword; }</code>
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!