PHP 和 CryptoJS AES 加解密互通
PHP 和 CryptoJS AES 加解密互通
使用
名称 | 值 |
---|---|
模式 | CBC |
填充 | Pkcs7 |
长度 | 128 ,key 和 iv 的长度均为 16 |
输出 | Base64 |
import * as CryptoJS from 'crypto-js'
/**
* AES 加密
* @param plaintext 明文
* @param key 加密 key
* @param iv 偏移量
* @returns 密文
*/
export const AESencrypt = (plaintext, key, iv) => {
key = CryptoJS.enc.Utf8.parse(key)
iv = CryptoJS.enc.Utf8.parse(iv)
const encryptedData = CryptoJS.AES.encrypt(plaintext, key, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return encryptedData.toString()
}
/**
* AES 解密
* @param ciphertext 密文
* @param key 加密 key
* @param iv 偏移量
* @returns 明文
*/
export const AESdecrypt = (ciphertext, key, iv) => {
key = CryptoJS.enc.Utf8.parse(key)
iv = CryptoJS.enc.Utf8.parse(iv)
const decryptedData = CryptoJS.AES.decrypt(ciphertext, key, {
iv,
padding: CryptoJS.pad.Pkcs7
})
return decryptedData.toString(CryptoJS.enc.Utf8)
}
class AESHelper
{
public static function encrypt($data, $key, $iv)
{
return base64_encode(openssl_encrypt($data, 'AES-128-CBC', $key, 1, $iv));
}
public static function decrypt($data, $key, $iv)
{
return openssl_decrypt(base64_decode($data), 'AES-128-CBC', $key, 1, $iv);
}
}
常见问题
CryptoJS
解密时不需要设置模式- 解密失败,
Error: Malformed UTF-8 data
- 解密失败,解密结果为空字符串或者乱码
检查方法
- 模式设置不正确
- 填充设置不正确
key
和iv
不正确key
和iv
未处理,const key = CryptoJS.enc.Utf8.parse(key)
// `key` 和 `iv` 正确处理方式,明文和密文不需要
const key = CryptoJS.enc.Utf8.parse(key)
const iv = CryptoJS.enc.Utf8.parse(iv)
CryptoJS supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key