Forge.js RSA-OAEP加密后服务端解密失败,参数或格式哪里出问题?

FSD-玉曼 阅读 78

我在用Forge.js做RSA-OAEP加密表单数据时,服务端一直报解密失败。前端用的是公钥字符串直接加密,加密后的base64字符串传到后端Java就解不开,明明密钥是服务端提供的。我试过把公钥格式转成DER和PEM都试过了,错误还是”illegal key”。

加密代码是这样的:


const forge = require('node-forge');
const publicKey = forge.pki.publicKeyFromPem('-----BEGIN PUBLIC KEY...'); // 服务端给的公钥
const msg = '测试数据';
const encrypted = forge.pkcs.encrypt(
  msg,
  publicKey,
  'RSA-OAEP',
  { md: forge.md.sha256.create() }
);
const encryptedB64 = forge.util.encode64(encrypted);

服务端Java用的是Cipher.getInstance(“RSA/ECB/PKCS1Padding”),会不会是加密模式不匹配?或者我应该改用PKCS1padding方式?

我来解答 赞 10 收藏
二维码
手机扫码查看
1 条解答
端木东芳
你这问题八成是前后端算法不匹配导致的。Forge.js 用的是 RSA-OAEP,而你服务端 Java 用的 Cipher.getInstance("RSA/ECB/PKCS1Padding") 是 PKCS#1 v1.5 填充,这两种本来就不兼容,当然解不了。

RSA-OAEP 和 PKCS1Padding 是两种不同的填充方案,不能混用。你现在前端用了 OAEP(而且还是 SHA-256),后端却用 PKCS1Padding,肯定报“illegal key”或者解密失败。

解决办法有两个方向:

第一,统一用 RSA-OAEP。Java 那边要改成:

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding");
// 注意:还需要设置 MGF 和哈希算法,比如 SHA-256
// 可以通过参数指定


并且初始化的时候得配参数,不然默认可能用的是 SHA-1 + MGF1,和你前端 forge.md.sha256.create() 对不上。Java 要这么配:

OAEPParameterSpec spec = new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA_256, PSource.PSpecified.DEFAULT);
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding");
cipher.init(Cipher.DECRYPT_MODE, privateKey, spec);


第二,如果你不想改后端代码,那就改前端,让 Forge 用 PKCS#1 v1.5 加密。可以试试这样改:

const encrypted = forge.pki.encrypt(
msg,
publicKey,
'RSAES-PKCS1-V1_5' // 明确指定为 PKCS1 v1.5 填充
);


注意这里要用 forge.pki.encrypt,不是 pkcs.encrypt,API 别搞错了。

我个人建议优先考虑统一使用 OAEP,更安全,但现在主流兼容性上 PKCS1 v1.5 还是更稳一点。先确认你们服务端到底支持哪种,再定方案。别两边各说各话。
点赞 6
2026-02-09 12:00