使用 MCrypt 在 PHP 中解密 AES 加密
在这种情况下,密码是在 JavaScript 中使用 CryptoJS 加密的,需要在使用 MCrypt 的 PHP 服务器端。以下是实现此目的的方法:
之前使用 MCrypt 的 mcrypt_decrypt() 函数解密密码的尝试由于密钥生成的差异而失败。 CryptoJS 使用密码来创建 AES 密钥和初始化向量 (IV),而 MCrypt 仅使用密钥进行加密/解密。
要解决此问题,我们需要使用与 CryptoJS 相同的方法在 PHP 中导出密钥和 IV。这是用于此目的的自定义 evpKDF() 函数:
<code class="php">function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") { // Code goes here... }</code>
要使用 evpKDF() 函数,JavaScript 中的加密密码应包含生成的盐。这是更新后的 CryptoJS 代码:
<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>
在 PHP 的服务器端,从请求中检索盐和密文。然后,使用 evpKDF() 函数根据密码和盐导出密钥和 IV:
<code class="php">$keyAndIV = evpKDF("Secret Passphrase", hex2bin($saltHex));</code>
最后,使用 MCrypt 执行解密:
<code class="php">$decryptPassword = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $keyAndIV["key"], hex2bin($cipherTextHex), MCRYPT_MODE_CBC, $keyAndIV["iv"]);</code>
这应该成功解密使用 CryptoJS 和 AES 加密的密码。此外,还提供了使用 OpenSSL 扩展的版本作为 MCrypt 的替代方案。
以上是如何使用 evpKDF() 使用 MCrypt 解密 PHP 中的 AES 加密?的详细内容。更多信息请关注PHP中文网其他相关文章!