Menyahsulit Penyulitan AES dalam PHP dengan MCrypt
Dalam senario ini, kata laluan disulitkan menggunakan CryptoJS dalam JavaScript dan perlu dinyahsulit pada sisi pelayan dengan PHP menggunakan MCrypt. Begini cara untuk mencapainya:
Percubaan sebelumnya untuk menyahsulit kata laluan menggunakan fungsi mcrypt_decrypt() MCrypt gagal disebabkan oleh perbezaan dalam penjanaan kunci. CryptoJS menggunakan kata laluan untuk mencipta kedua-dua kunci AES dan vektor permulaan (IV), manakala MCrypt hanya menggunakan kunci untuk penyulitan/penyahsulitan.
Untuk menyelesaikan masalah ini, kita perlu mendapatkan kunci dan IV dalam PHP menggunakan kaedah yang sama seperti CryptoJS. Berikut ialah fungsi evpKDF() tersuai untuk tujuan ini:
<code class="php">function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") { // Code goes here... }</code>
Untuk menggunakan fungsi evpKDF(), kata laluan yang disulitkan dalam JavaScript harus mengandungi garam yang dijana. Berikut ialah kod CryptoJS yang dikemas kini:
<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>
Di bahagian pelayan dalam PHP, dapatkan semula garam dan teks sifir daripada permintaan. Kemudian, gunakan fungsi evpKDF() untuk mendapatkan kunci dan IV berdasarkan kata laluan dan garam:
<code class="php">$keyAndIV = evpKDF("Secret Passphrase", hex2bin($saltHex));</code>
Akhir sekali, lakukan penyahsulitan dengan MCrypt:
<code class="php">$decryptPassword = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $keyAndIV["key"], hex2bin($cipherTextHex), MCRYPT_MODE_CBC, $keyAndIV["iv"]);</code>
Ini sepatutnya berjaya menyahsulit kata laluan yang disulitkan menggunakan CryptoJS dengan AES. Selain itu, versi yang menggunakan sambungan OpenSSL disediakan sebagai alternatif kepada MCrypt.
Atas ialah kandungan terperinci Bagaimana untuk Menyahsulit Penyulitan AES dalam PHP dengan MCrypt Menggunakan evpKDF()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!