使用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中文網其他相關文章!