前端程式碼:
// 這個是加密用的 function encrypt(text){ var key = CryptoJS.enc.Utf8.parse('1234567890654321'); //為了避免補位,直接用16位的祕鑰 var iv = CryptoJS.enc.Utf8.parse('1234567890123456'); //16位初始向量 var encrypted = CryptoJS.AES.encrypt(text, key, { iv: iv, mode:CryptoJS.mode.CBC, padding:CryptoJS.pad.Pkcs7 }); return encrypted.toString(); }
encrypt(123); // AMFSKTJa3K092qSi5XC46w== // 這個是解密用的 function decrypt (text) { var key = CryptoJS.enc.Utf8.parse('1234567890654321'); //為了避免補位,直接用16位的祕鑰 var iv = CryptoJS.enc.Utf8.parse('1234567890123456'); //16位初始向量 var encrypted = CryptoJS.AES.decrypt(text, key, { iv: iv, mode:CryptoJS.mode.CBC, padding:CryptoJS.pad.Pkcs7
});
return encrypted.toString(CryptoJS.enc.Utf8);
}
php程式碼:
// 加密用的 // 引數1,為資料,引數2為加密演算法,AES裡最安全的一種 $a = openssl_encrypt('123', 'aes-128-cbc', '1234567890654321', 1, '1234567890123456'); echo base64_encode($a); // AMFSKTJa3K092qSi5XC46w== // 解密用的 $b = openssl_decrypt($encrypted, 'aes-128-cbc', $key, 0 , $iv); echo $b; // 其中,加密方法的第四個引數為1,而解密的第四個引數為0,不然解密不了
這樣可以實現js加密結果和php加密結果一致,而且兩者都能互相解密
另,其他引數不變情況下,修改js的 padding為 CryptoJS.pad.ZeroPadding 會是加密結果不同,但確可以php的 openssl_decrypt 解密,且解密結果一樣。