重寫後的標題為:PHP版本的CryptoJS aes加密函數
P粉329425839
2023-08-31 23:20:42
<p>我正在嘗試用CryptoJS創建一個與此JS代碼等效的PHP代碼:</p>
<pre class="brush:php;toolbar:false;">function aesEncrypt (data) {
const key = 'GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r=';
const iv = '\0';
const cipher = CryptoJS.AES.encrypt(data, CryptoJS.enc.Base64.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv), // 解析IV
padding: CryptoJS.pad.Pkcs7,
mode: CryptoJS.mode.CBC
})
return cipher.toString()
}</pre>
<p>js程式碼的結果:pHjpwiyKq7Rf4dFcBMbm1w==</p>
<p>這是我透過閱讀其他stackoverflow問題所寫的PHP程式碼。但是它沒有傳回相同的結果。 </p>
<pre class="brush:php;toolbar:false;">$plaintext = "plainText";
$method = 'aes-256-cbc';
$key = base64_encode("GSTEGSTEjdfheyhdHSHSHSHHDHmdjjdn12ndndn5r=");
$iv = hex2bin('00000000000000000000000000000000');
$ciphertext = openssl_encrypt(
$plaintext,
$method,
$key,
OPENSSL_RAW_DATA,
$iv
);
$ciphertext = base64_encode($ciphertext);
echo $ciphertext;</pre>
<p>PHP程式碼的結果: YJOMi2vISmEXIjUZls3MA==</p>
嘗試這個:
在PHP程式碼中,金鑰必須進行Base64 解碼,而不是Base64編碼:
透過這個改變,所需的密文被創建出來。
請注意,如果在
openssl_encrypt()
呼叫的第四個參數傳遞0
而不是OPENSSL_RAW_DATA
,則密文字預設會進行Base64編碼。因此,明確對密文進行Base64編碼是不必要的。請記住,靜態IV是不安全的。通常在加密過程中,會產生一個隨機的IV,並將其與密文一起傳遞給解密方(通常是拼接在一起)。