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

NodeJS RSA加密后Java解密抛出BadPaddingException问题解决

解决NodeJS RSA加密后Java解密抛出BadPaddingException的问题

这个问题基本是NodeJS与Java在RSA加密的密钥格式、明文编码、填充配置上的差异导致的,既然Java代码无法修改,直接调整NodeJS代码适配Java逻辑即可,具体步骤如下:

1. 统一密钥格式

Java端的公钥/私钥一般用标准PEM格式(带首尾标记+每64字符换行),如果你的NodeJS用的是纯Base64编码密钥,必须先转成PEM格式:

// 将Base64公钥转为标准PEM格式
function formatToPemPublicKey(base64Key) {
  const cleanedKey = base64Key.replace(/\s/g, ''); // 清除所有空格、换行
  const splitKey = cleanedKey.match(/.{1,64}/g).join('\n'); // 每64字符换行
  return `-----BEGIN PUBLIC KEY-----\n${splitKey}\n-----END PUBLIC KEY-----`;
}

2. 强制明文用UTF-8编码

Java默认用UTF-8处理明文,NodeJS加密时必须显式指定编码,避免默认编码差异导致明文不一致:

// 错误写法:可能隐式使用系统默认编码
// Buffer.from(plainText)
// 正确写法:强制UTF-8编码
Buffer.from(plainText, 'utf8')

3. 明确指定PKCS1填充模式

NodeJS的crypto.publicEncrypt方法若不指定填充,可能默认使用OAEP填充,必须手动指定PKCS1Padding对齐Java逻辑:

const crypto = require('crypto');

function rsaEncrypt(plainText, base64PublicKey) {
  const pemPublicKey = formatToPemPublicKey(base64PublicKey);
  const encryptedBuffer = crypto.publicEncrypt(
    {
      key: pemPublicKey,
      padding: crypto.constants.RSA_PKCS1_PADDING, // 强制指定PKCS1PADDING
    },
    Buffer.from(plainText, 'utf8')
  );
  return encryptedBuffer.toString('base64'); // 返回Base64编码,与Java端解码逻辑对齐
}

4. 清理密钥无效字符

如果密钥是从其他渠道复制的,可能带有多余换行、空格甚至特殊字符,必须先清除,否则NodeJS解析密钥出错会导致加密结果异常。

验证方法

用上述代码加密测试文本"test_rsa_verify",将得到的Base64字符串拿到Java端解密,若能正常解密则问题解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:23:09