Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menyahsulit JavaScript CryptoJS AES Data Disulitkan dalam PHP?

Bagaimana untuk Menyahsulit JavaScript CryptoJS AES Data Disulitkan dalam PHP?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-02 11:09:31193semak imbas

How to Decrypt JavaScript CryptoJS AES Encrypted Data in PHP?

Penyulitan dalam JavaScript dan Penyahsulitan dalam PHP

Isu

Seorang pengguna sedang menyulitkan kata laluan dalam JavaScript menggunakan penyulitan CryptoJS AES dan cuba menyahsulitnya dalam PHP menggunakan mcrypt_decrypt() tetapi menemui keputusan yang salah.

Penyelesaian

Percanggahan timbul daripada kaedah yang digunakan untuk memperoleh kunci penyulitan dan vektor permulaan (IV) dalam JavaScript dan PHP. CryptoJS memperoleh nilai ini menggunakan kata laluan, manakala mcrypt_decrypt() PHP hanya mengharapkan kunci.

Pelaksanaan Penyahsulitan PHP

Untuk menyahsulit teks sifir dengan betul, kod PHP mesti memperoleh kunci penyulitan dan IV daripada kata laluan dan garam dengan cara yang sama seperti kod JavaScript. Ini boleh dicapai menggunakan fungsi seperti evpKDF(), yang melaksanakan fungsi terbitan kunci berasaskan cincang (HKDF).

<code class="php">function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") {
    // ... Implementation ...
}</code>

Setelah kunci dan IV diperoleh, mcrypt_decrypt() boleh digunakan seperti berikut :

<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>

Pelaksanaan Alternatif menggunakan OpenSSL

Sebagai alternatif, sambungan OpenSSL boleh digunakan untuk menyahsulit teks sifir:

<code class="php">function decrypt($ciphertext, $password) {
    $ciphertext = base64_decode($ciphertext);
    if (substr($ciphertext, 0, 8) != "Salted__") {
        return false;
    }
    $salt = substr($ciphertext, 8, 8);
    $keyAndIV = evpKDF($password, $salt);
    $decryptPassword = openssl_decrypt(
            substr($ciphertext, 16), 
            "aes-256-cbc",
            $keyAndIV["key"], 
            OPENSSL_RAW_DATA, // base64 was already decoded
            $keyAndIV["iv"]);

    return $decryptPassword;
}</code>

Atas ialah kandungan terperinci Bagaimana untuk Menyahsulit JavaScript CryptoJS AES Data Disulitkan dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn