JavaScript 中的加密和 PHP 中的解密
用户正在使用 CryptoJS AES 加密在 JavaScript 中加密密码并尝试在 PHP 中使用 mcrypt_decrypt() 对其进行解密,但遇到了不正确的结果。
差异源于 JavaScript 中用于导出加密密钥和初始化向量 (IV) 的方法,以及PHP。 CryptoJS 使用密码导出这些值,而 PHP 的 mcrypt_decrypt() 仅需要密钥。
要正确解密密文,PHP 代码必须从以下位置导出加密密钥和 IV密码和盐的方式与 JavaScript 代码相同。这可以使用像 evpKDF() 这样的函数来实现,它实现了基于哈希的密钥派生函数 (HKDF)。
<code class="php">function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") { // ... Implementation ... }</code>
派生密钥和 IV 后,可以按如下方式调用 mcrypt_decrypt() :
<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>
或者,OpenSSL 扩展可用于解密密文:
<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>
以上是如何在 PHP 中解密 JavaScript CryptoJS AES 加密数据?的详细内容。更多信息请关注PHP中文网其他相关文章!