Encryption in JavaScript and Decryption in PHP
A user is encrypting a password in JavaScript using CryptoJS AES encryption and attempting to decrypt it in PHP using mcrypt_decrypt() but encountering incorrect results.
The discrepancy arises from the method used to derive the encryption key and initialization vector (IV) in JavaScript and PHP. CryptoJS derives these values using a password, while PHP's mcrypt_decrypt() only expects a key.
To correctly decrypt the ciphertext, the PHP code must derive the encryption key and IV from the password and salt in the same manner as the JavaScript code. This can be achieved using a function like evpKDF(), which implements the hash-based key derivation function (HKDF).
<code class="php">function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") { // ... Implementation ... }</code>
Once the key and IV are derived, mcrypt_decrypt() can be invoked as follows:
<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>
Alternatively, the OpenSSL extension can be used to decrypt the ciphertext:
<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>
The above is the detailed content of How to Decrypt JavaScript CryptoJS AES Encrypted Data in PHP?. For more information, please follow other related articles on the PHP Chinese website!