为什么用AES加密后前端和后端的密文结果不一致?
我在给表单数据做AES加密时遇到奇怪的问题。用前端库加密后的密文,后端用同样的密钥解密总报错。之前用jsencrypt试过RSA没问题,换成AES-256-CBC后就乱了。
前端代码是这样的:
const CryptoJS = require("crypto-js");
let ciphertext = CryptoJS.AES.encrypt('测试数据', 'secret-key-123', {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).ciphertext.toString();
后端用Node.js的crypto模块:
const cipher = crypto.createCipheriv('aes-256-cbc', 'secret-key-123', iv);
let encrypted = cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
明明都用了CBC模式,为什么密文完全不一样?是不是库的默认参数有差异?试过调整padding和编码方式都没用,求大神指条明路…
改成这样:
前端代码:
后端代码:
记得两边都用固定IV,生产环境要把IV和密文一起传输,别忘了处理好编码问题。