Java无法解密Node.js加密字符串问题排查(仅可修改Node.js代码)
问题排查与修复方案
核心问题分析
- IV不匹配:Java解密硬编码使用了全0的16字节IV,但Node.js端用了随机生成的IV,CBC模式下加密和解密必须使用完全相同的IV,这是导致解密后开头乱码的根本原因。
- 加密结果编码错误:将加密后的二进制数据转成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
相关产品推荐
相关产品推荐

