Tajuk yang ditulis semula ialah: Versi PHP fungsi penyulitan aes CryptoJS
P粉329425839
2023-08-31 23:20:42
<p>Saya cuba mencipta PHP yang setara dengan kod JS ini menggunakan CryptoJS: </p>
<pre class="brush:php;toolbar:false;">fungsi aesEncrypt (data) {
kekunci const = 'GSTEGSTEjdfheyhdHSSHSHSHHHDHmdjjdn12ndndn5r=';
const iv = '
const cipher = CryptoJS.AES.encrypt(data, CryptoJS.enc.Base64.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv), // Parse IV
padding: CryptoJS.pad.Pkcs7,
mod: CryptoJS.mode.CBC
})
kembalikan cipher.toString()
}</pre>
<p>Hasil kod js: pHjpwiyKq7Rf4dFcBMbm1w==</p>
<p>Ini ialah kod PHP yang saya tulis dengan membaca soalan stackoverflow lain. Tetapi ia tidak mengembalikan hasil yang sama. </p>
<pre class="brush:php;toolbar:false;">$plaintext = "plainTeks";
$method = 'aes-256-cbc';
$key = base64_encode("GSTEGSTEjdfheyhdHSHSHSHHHHHDHmdjjdn12ndndn5r=");
$iv = hex2bin('0000000000000000000000000000000');
$ciphertext = openssl_encrypt(
$plaintext,
$kaedah,
$kunci,
OPENSSL_RAW_DATA,
$iv
);
$ciphertext = base64_encode($ciphertext);
echo $ciphertext;</pre>
<p>Hasil kod PHP: +YJOMi2vISmEXIjUZls3MA==</p>
Cuba ini:
Dalam kod PHP, kunci mestilah Base64 disulitkan, bukan Base64 dikodkan:
Dengan perubahan ini, teks sifir yang diperlukan dicipta.
Sila ambil perhatian bahawa jika dalam
openssl_encrypt()
调用的第四个参数中传递0
而不是OPENSSL_RAW_DATA
, teks sifir akan dikodkan Base64 secara lalai. Oleh itu, pengekodan Base64 secara eksplisit teks sifir adalah tidak diperlukan.Sila ingat bahawa IV statik tidak selamat. Biasanya semasa proses penyulitan, rawakIV dijana dan dihantar bersama teks sifir kepada pihak penyahsulitan (biasanya disambung bersama).