You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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密文'));

关键注意事项

  1. 密钥长度匹配:你的密钥是16字节(128位),所以JavaScript中对应使用aes-128-cbc,和Java代码自动识别的密钥长度一致。
  2. 填充兼容性:Java的PKCS5PADDING在AES场景下和JavaScript的PKCS#7填充完全等价,无需额外处理。
  3. 编码一致性:所有字符串转字节的操作都使用UTF-8,和Java代码中的getBytes("UTF-8")保持一致。

内容的提问来源于stack exchange,提问作者Sharan De Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:40:31