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

Node-RSA解密失败求助:前端JSEncrypt加密后端无法解密

RSA解密失败问题排查与解决

客户端(JSEncrypt)加密实现

import JSEncrypt from 'jsencrypt';
var cryptor = new JSEncrypt();
const publicEncrypt = (str:string, publicKey:string = PUBLIC_KEY) =>{
    cryptor.setPublicKey(publicKey);
    return cryptor.encrypt(str)
}
// 调用示例
publicEncrypt('q7jp7s13txqj968m',PUBLIC_KEY);

加密结果

生成的encodeKey:

Reb0MRnfT0q+ydl8xkR8gQ16jXUdyiwa9QJaz7sklBbq+b/j36u7OR4SR2Xqne19W1noQW77dcHP7qxCMq89w3zHXeto655XJIKaVxrJG+pO8PQHyqVOfMiAoCxPf7RqiPqvQ4Niv5uWURperkdnrXD95LMoYd4IBKKqVaGRDluZUpX0THiF2tN8SZ/EBPcWBvOHGPX24BmzfysmewdaQVJ1bh479KyINxTxysSdp1vglrywcZDVKE5geSkOY8WxQWtTuQPEi/OAtNxwFYae9mfssV1dV0LB6Lnpbm/C/51NlCwdddRogqywhLpEnCTbdm7xLoYj2TlwdJuJUWiiYA==

服务端(Node-RSA)解密实现

const NodeRSA = require('node-rsa');
const privateKeyObj = new NodeRSA(PRIVATE_KEY);
let AESkey = privateKeyObj.decrypt(encodeKey, 'utf8');

解密错误

Error: Error during decryption (probably incorrect key). Original error: Error: error:02000079:rsa routines::oaep decoding error

密钥信息

const PRIVATE_KEY = `-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDySf3VHbk81ukT
7PL/lNuqVHgFL2muW9mCCF6DqwwfporjstLg36BR/A87bzzferPuMVqCpSpJAXu5
9CuRp5lCB3yANF839CHmslOqwmlFeVoVvnuitdcVh9qvDmn1Ta2G4d47KL7ZVNWa
8RMulWx/ympdMnOJIg493YgMM2YPrW/Rh3+FRr8sqrkimWF+bnlzGoQMcj8nSS+J
KrNLtYIJ4x36o1Ml8SUoz0zuXOoL3O49vnA+tn6ItiPcduV9a6N7hHSOD9fEL4yS
Y84xpVDd8eK6rnUtUpiSANKuxIjPGNk6zkchPL+Lho3iTOz0bZ25hmrGtxg0JyqN
nJUwMWvDAgMBAAECggEAdunTt9YnxPFhYZMozEGd8iIU6c6UWqvfu88pvAumHp6Z
ihmJIC8BO1uviicVREWvq5bzai1v7Hba57Ar9gfA00RjWXTaytZ6EQSyxZs3GY7u
pL9hZMFEd9++d65mWKuwIAQZEwXzbS0SzUHGfVV+89U/kNAjHknlnX1tuTc8vzIW
tnd71zcLaXLzzpJhgkEEGc1IoW7DYfFMuPrhtXk7y+zLIWFbv+7GKDFRJ+e8KTqr
/swEGYshAmD9CRaqW3OGbLb65IOECZTDXFkUuWXSNjfiOYV38nVowq1NIYIQJxIH
JwsToCYfgZQciDvtOh6lZAV8bgG+gwFoPldAM0MfmQKBgQD7Klx2vPwJ1a8UuD7v
EVSPo5kyVr+AfT/CuZ5E1PFcyt7KMT4TsCWjOOSy4VrRHCyRpXwhBjI1uJV4hU4Q
qDIpJIal9F2esOvLdZMa6xQ1UVhn6HpOFj39FT2P8BA1SYaDECcyldr7z+63WsQG
eAZofSjbocbx7iItdODFl34etwKBgQD28+QT5T9YjuhfHtxuneKu6mtXTqJuLXUt
FsziucHZ5byNjSySMv3AdIBAV/Vm/4Ez/AIzamjejou41I4pTOmOE3z+jqFGII7G
pq9P1y1D+v1UUgTliGOvlUKKvkPea6XZpelJGH8MYGkL4Cd2ivQBgVSyfnukYJZP
Mf/ZCB+PVQKBgQCxr7pSVkiIPJ/sLJx5TO1h4P9UWYKJSBJ/lAmf8HYAi5UpvcSI
8SjvXCSPWFaDcUcmkshKJLQIxVkZNlWP+y3hZXHMniBNUCTAf6FefciCH9ZHTHSa
IaohDZHL7q3IxQdgWWEhrFqLowLivFfJq8f8y+7H0p+IMEwFlJYfs5kJ6QKBgQCA
qr4w54bDu2Gy/b9YGwcan6ThzmSvBxxAK9sAXkx0HVDKZ73LRqoTdh/EZo/D5GgL
D8iNxWlyW87MtGKFfj9J+Tls4B+DDD+XnQ1GihRZkRIgtsM6XH+j4h7TbyKpZmj5
J4qOvSak6i6RM28cQnWzuxDIF0KQeIqYJLLq/2KCKQKBgGmxU+ac7trUh3yAuY1t
DoJ1eicKAXCcYIGVs9+Me4WeeyTvZBxeqSYaone0G08JQT9xtCHSRoZPXnb0PL8U
6177XZfdqp6eFDh5kOXsyC9LQjEqYDFgQzRMwWY+yfpL6/o8Ibf5o3dS6me+pvU0
dk9pTm2dDpgZsz5d4tVkCVMp
-----END PRIVATE KEY-----`

const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8kn91R25PNbpE+zy/5Tb
qlR4BS9prlvZggheg6sMH6aK47LS4N+gUfwPO28833qz7jFagqUqSQF7ufQrkaeZ
Qgd8gDRfN/Qh5rJTqsJpRXlaFb57orXXFYfarw5p9U2thuHeOyi+2VTVmvETLpVs
f8pqXTJziSIOPd2IDDNmD61v0Yd/hUa/LKq5Iplhfm55cxqEDHI/J0kviSqzS7WC
CeMd+qNTJfElKM9M7lzqC9zuPb5wPrZ+iLYj3HblfWuje4R0jg/XxC+MkmPOMaVQ
3fHiuq51LVKYkgDSrsSIzxjZOs5HITy/i4aN4kzs9G2duYZqxrcYNCcqjZyVMDFr
wwIDAQAB
-----END PUBLIC KEY-----`

问题原因与解决方案

错误提示oaep decoding error的核心原因是两端加密/解密的填充模式不匹配:JSEncrypt默认使用PKCS#1 v1.5填充,而Node-RSA默认使用OAEP填充,导致解密时无法解析密文。

方案1:修改服务端Node-RSA填充模式

初始化Node-RSA时指定PKCS#1 v1.5填充,匹配客户端默认行为:

const NodeRSA = require('node-rsa');
// 明确指定pkcs1填充方案
const privateKeyObj = new NodeRSA(PRIVATE_KEY, 'pkcs1');
let AESkey = privateKeyObj.decrypt(encodeKey, 'utf8');

方案2:修改客户端JSEncrypt使用OAEP填充

如果需要使用更安全的OAEP填充,可在JSEncrypt中开启:

import JSEncrypt from 'jsencrypt';
var cryptor = new JSEncrypt();
// 开启OAEP填充,指定哈希算法
cryptor.setOAEPHash('sha256');
const publicEncrypt = (str:string, publicKey:string = PUBLIC_KEY) =>{
    cryptor.setPublicKey(publicKey);
    return cryptor.encrypt(str)
}

此时服务端保持默认OAEP填充即可正常解密。

额外注意事项

  • 确认密钥对有效性:公钥和私钥必须为同一对RSA密钥,可通过openssl rsa -check -in private.key命令验证私钥合法性。
  • JSEncrypt加密长度限制:2048位RSA密钥仅支持加密约245字节的明文,超过长度需分段加密,或改用"AES加密明文+RSA加密AES密钥"的混合加密方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:32:03