Forge.js RSA-OAEP加密后服务端解密失败,参数或格式哪里出问题?
我在用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方式?
RSA-OAEP 和 PKCS1Padding 是两种不同的填充方案,不能混用。你现在前端用了 OAEP(而且还是 SHA-256),后端却用 PKCS1Padding,肯定报“illegal key”或者解密失败。
解决办法有两个方向:
第一,统一用 RSA-OAEP。Java 那边要改成:
并且初始化的时候得配参数,不然默认可能用的是 SHA-1 + MGF1,和你前端 forge.md.sha256.create() 对不上。Java 要这么配:
第二,如果你不想改后端代码,那就改前端,让 Forge 用 PKCS#1 v1.5 加密。可以试试这样改:
注意这里要用
forge.pki.encrypt,不是pkcs.encrypt,API 别搞错了。我个人建议优先考虑统一使用 OAEP,更安全,但现在主流兼容性上 PKCS1 v1.5 还是更稳一点。先确认你们服务端到底支持哪种,再定方案。别两边各说各话。