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

Java无法解密Node.js加密字符串问题排查(仅可修改Node.js代码)

问题排查与修复方案

核心问题分析

  1. IV不匹配:Java解密硬编码使用了全0的16字节IV,但Node.js端用了随机生成的IV,CBC模式下加密和解密必须使用完全相同的IV,这是导致解密后开头乱码的根本原因。
  2. 加密结果编码错误:将加密后的二进制数据转成UTF-8字符串再做Base64编码,会破坏非UTF-8兼容的字节,导致解密时数据失真。

修改后的Node.js代码

const forge = require('node-forge');

const json = {
    number: '9246753466',
    lob: 'Prepaid',
    firstName: 'Mr. XYZ',
    leadId: 'yLWJjN2YtYWVlM2',
    address: {
        addressLine1: 'address line 1',
        addressLine2: 'address line 2 ',
        city: 'Delhi',
        pincode: '123456',
    },
};
let pk = 'SEC_PRV_KEY';
// 替换为和Java一致的全0IV
let iv = new Uint8Array(16).fill(0); 
// 转成forge需要的二进制字符串格式
iv = forge.util.binary.raw.encode(iv);

const cipher = forge.cipher.createCipher('AES-CBC', pk.toString('utf-8'));
cipher.start({ iv });
cipher.update(forge.util.createBuffer(JSON.stringify(json), 'utf-8'));
cipher.finish();
let encrypted = cipher.output;

// 直接对加密后的二进制数据做Base64编码,跳过错误的Buffer转UTF-8步骤
console.log(forge.util.encode64(encrypted.data));
console.log('done');

关键修改点说明

  • 统一IV:把随机生成的IV替换为全0的16字节数组,和Java端new byte[16]完全对齐。
  • 修正Base64编码:直接使用forge.util.encode64(encrypted.data)处理加密后的二进制数据,避免中间转UTF-8导致的数据损坏。
  • 额外注意:确保密钥SEC_PRV_KEY的UTF-8字节长度符合AES要求(16/24/32字节对应128/192/256位密钥),如果长度不符,Java端会抛出InvalidKeyException,需调整密钥到合法长度。

内容的提问来源于stack exchange,提问作者Sourav Mukherjee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:32:08