首頁  >  文章  >  後端開發  >  如何使用 evpKDF() 使用 MCrypt 解密 PHP 中的 AES 加密?

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

DDD
DDD原創
2024-11-03 02:02:02348瀏覽

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