Java服务端AES加密后,如何用JavaScript实现带IV、密钥与填充的解密?
对应Java AES加密的JavaScript解密实现
没问题,我帮你把这段Java的AES加密逻辑转换成JavaScript的解密代码。先理清楚你Java代码里的关键配置,确保解密时完全匹配:
- 加密模式:AES-CBC
- 填充方式:PKCS#5(注:在AES的16字节块大小下,PKCS#5和PKCS#7填充是兼容的,JavaScript里用PKCS#7即可)
- IV(初始化向量):固定为
l353b3l3jk3bk3j3(UTF-8编码) - 密钥:固定为
2353c3l3jk3bk3j8(UTF-8编码) - 密文格式:加密后的数据经过Base64编码输出
浏览器环境(使用Web Crypto API)
现代浏览器原生支持Web Crypto API,下面是异步解密函数:
async function decryptAesCbc(encryptedBase64) { // 与Java代码一致的固定参数 const ivStr = 'l353b3l3jk3bk3j3'; const keyStr = '2353c3l3jk3bk3j8'; // 1. 将Base64密文解码为二进制数据 const encryptedData = Uint8Array.from(atob(encryptedBase64), c => c.charCodeAt(0)); // 2. 将IV和密钥转换为UTF-8编码的字节数组 const iv = new TextEncoder().encode(ivStr); const keyBytes = new TextEncoder().encode(keyStr); // 3. 导入原始格式的AES密钥 const key = await crypto.subtle.importKey( 'raw', keyBytes, { name: 'AES-CBC' }, false, ['decrypt'] ); // 4. 执行解密操作 const decryptedBuffer = await crypto.subtle.decrypt( { name: 'AES-CBC', iv: iv }, key, encryptedData ); // 5. 将解密后的二进制数据转换为UTF-8字符串 return new TextDecoder().decode(decryptedBuffer); } // 使用示例 // decryptAesCbc('你的Base64密文').then(result => { // console.log('解密结果:', result); // });
Node.js环境(使用内置crypto模块)
如果是在Node.js中解密,用内置的crypto模块更方便:
const crypto = require('crypto'); function decryptAesCbcNode(encryptedBase64) { const ivStr = 'l353b3l3jk3bk3j3'; const keyStr = '2353c3l3jk3bk3j8'; // 解码Base64密文、转换IV和密钥为Buffer const encryptedData = Buffer.from(encryptedBase64, 'base64'); const iv = Buffer.from(ivStr, 'utf8'); const key = Buffer.from(keyStr, 'utf8'); // 创建CBC模式的解密器 const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv); // 执行解密并拼接结果 let decrypted = decipher.update(encryptedData); decrypted = Buffer.concat([decrypted, decipher.final()]); // 转换为UTF-8字符串返回 return decrypted.toString('utf8'); } // 使用示例 // console.log(decryptAesCbcNode('你的Base64密文'));
关键注意事项
- 密钥长度匹配:你的密钥是16字节(128位),所以JavaScript中对应使用
aes-128-cbc,和Java代码自动识别的密钥长度一致。 - 填充兼容性:Java的
PKCS5PADDING在AES场景下和JavaScript的PKCS#7填充完全等价,无需额外处理。 - 编码一致性:所有字符串转字节的操作都使用UTF-8,和Java代码中的
getBytes("UTF-8")保持一致。
内容的提问来源于stack exchange,提问作者Sharan De Silva
相关产品推荐
相关产品推荐

