首页  >  文章  >  后端开发  >  如何使用 evpKDF() 使用 MCrypt 解密 PHP 中的 AES 加密?

如何使用 evpKDF() 使用 MCrypt 解密 PHP 中的 AES 加密?

DDD
DDD原创
2024-11-03 02:02:02353浏览

How to Decrypt AES Encryption in PHP with MCrypt Using evpKDF()?

使用 MCrypt 在 PHP 中解密 AES 加密

在这种情况下,密码是在 JavaScript 中使用 CryptoJS 加密的,需要在使用 MCrypt 的 PHP 服务器端。以下是实现此目的的方法:

PHP 中的解密问题

之前使用 MCrypt 的 mcrypt_decrypt() 函数解密密码的尝试由于密钥生成的差异而失败。 CryptoJS 使用密码来创建 AES 密钥和初始化向量 (IV),而 MCrypt 仅使用密钥进行加密/解密。

使用 evpKDF() 函数的解决方案

要解决此问题,我们需要使用与 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 中的解密过程

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn