如何编写与给定Java AES加密逻辑对等的CryptoJS加密代码
Java AES加密逻辑CryptoJS对齐方案
原有代码错误点
- PBKDF2哈希算法不匹配:Java使用
PBKDF2WithHmacSHA256生成密钥,CryptoJS默认PBKDF2采用SHA1哈希,二者生成的密钥完全不一致 - PBKDF2参数格式错误:CryptoJS.PBKDF2第三参数为配置对象,不能直接传入迭代次数和密钥长度
- IV转换逻辑错误:全0字节数组不能通过
CryptoJS.enc.Utf8.parse转换,该方法会按UTF-8字符规则解析字节,生成的IV和Java端不匹配 - 密文输出格式错误:Java最终返回Base64编码的密文,原有代码尝试用UTF-8编码输出加密结果,格式完全不兼容
修复后完整代码
const CryptoJS = require('crypto-js'); // 浏览器环境可直接通过script标签引入CryptoJS后使用 const aesEncrypt = () => { // 替换为和Java端完全一致的SECRET_KEY、SALT const SECRET_KEY = "你的实际密钥"; const SALT = "你的实际盐值"; const plainText = `{"company":"1","currency":"GBP","amount":"20","title":"Test"}`; // 生成和Java逻辑对齐的256位AES密钥 const aesKey = CryptoJS.PBKDF2(SECRET_KEY, SALT, { keySize: 256 / 32, // CryptoJS密钥长度单位为32位字,256位对应8个32位字 iterations: 65536, hasher: CryptoJS.algo.SHA256 // 明确指定哈希算法为SHA256 }); // 构造和Java完全一致的16字节全0IV const iv = CryptoJS.enc.Hex.parse('00000000000000000000000000000000'); // AES加密使用CBC模式+Pkcs7填充(和Java的Pkcs5Padding完全兼容) const encryptedResult = CryptoJS.AES.encrypt(plainText, aesKey, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); // 直接输出Base64格式密文,和Java返回格式一致 const encryptedBase64 = encryptedResult.toString(); console.log(encryptedBase64); return encryptedBase64; };
内容的提问来源于stack exchange,提问作者Luke Ireton
相关产品推荐
相关产品推荐

