首頁  >  文章  >  後端開發  >  如何在 PHP 中使用 mcrypt 解密 CryptoJS 加密密碼?

如何在 PHP 中使用 mcrypt 解密 CryptoJS 加密密碼?

Patricia Arquette
Patricia Arquette原創
2024-11-05 07:31:01628瀏覽

How to Decrypt CryptoJS Encrypted Passwords in PHP Using mcrypt?

使用mcrypt 在PHP 中解密CryptoJS 加密密碼

問題陳述

在JavaScript 中,使用CryptoJS 建立加密的使用者密碼,利用密碼基於金鑰和IV 的金鑰派生。然而,在 PHP 伺服器上使用 mcrypt 庫的解密嘗試失敗了,導致了無意義的解密字串。

主要錯誤源自於 JavaScript 中所使用的不同加密方法(CryptoJS ) 和 PHP (mcrypt)。在CryptoJS中,key和IV源自密碼,而mcrypt僅依賴密碼進行加密/解密。為了修正這個問題,必須使用類似於 CryptoJS 中使用的技術在 PHP 中產生金鑰和 IV。

修訂的JavaScript 代碼

將saltHex 和cipherTextHex 參數傳輸到PHP 伺服器,增強型JavaScript 加密過程現已實現:

<code class="javascript">var encryptedPassword = CryptoJS.AES.encrypt(password, "Secret Passphrase");
var ivHex = encryptedPassword.iv.toString();
var saltHex = encryptedPassword.salt.toString(); 
var cipherTextHex = encryptedPassword.ciphertext.toString();</code>

在PHP 中派生密鑰和IV

以下PHP 函數從密碼和鹽派生金鑰和IV:

<code class="php">function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") {
    /* ... code for key and IV derivation ... */
    return [
        "key" => substr($derivedBytes, 0, $keySize * 4),
        "iv"  => substr($derivedBytes, $keySize * 4, $ivSize * 4)
    ];
}</code>

使用mcrypt 在PHP 解密

使用派生金鑰和IV,在PHP 中執行解密:

<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 在PHP 中解密(替代方法)

使用OpenSSL 擴充功能是解密的另一種選擇:

<code class="php">$decryptPassword = openssl_decrypt(
        substr($ciphertext, 16), 
        "aes-256-cbc",
        $keyAndIV["key"], 
        OPENSSL_RAW_DATA, 
        $keyAndIV["iv"]);</code>

透過這些修改,現在可以在JavaScript 和PHP 之間實現使用者密碼的無縫加密和解密,確保安全的資料處理。

以上是如何在 PHP 中使用 mcrypt 解密 CryptoJS 加密密碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn