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

React应用JSEencrypt加密数据,Node.js crypto解密失败求助

问题原因

JSEencrypt 默认使用 RSA-PKCS1-V1_5 填充模式加密数据,但你的 Node.js 后端配置了 RSA_PKCS1_OAEP_PADDING 填充模式解密,两者不匹配,导致解密时出现 OAEP 解码错误。

解决方案

两种修复方式任选其一即可:

方式一:后端修改填充模式为 PKCS1_V1_5

将后端解密代码的padding参数改为crypto.constants.RSA_PKCS1_PADDING,移除oaepHash配置:

const crypto = require('crypto');

var privateKey = `
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF
z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5
rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM
V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
-----END RSA PRIVATE KEY-----`

const encryptedData = req.body.encrypted;

const decryptedData = crypto.privateDecrypt({
    key: privateKey,
    padding: crypto.constants.RSA_PKCS1_PADDING // 修改填充模式
}, Buffer.from(encryptedData, 'base64'));

console.log('Decrypted data:', decryptedData.toString('utf8'));

方式二:前端改用 OAEP 填充加密

若需使用更安全的 OAEP 填充,确保 JSEencrypt 版本在 3.0.0 以上(支持 OAEP),调用encryptOAEP方法替代encrypt:

var encrypt = new JSEncrypt();

var publicKey = `
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN
FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76
xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4
gwQco1KRMDSmXSMkDwIDAQAB
-----END PUBLIC KEY-----`;

encrypt.setPublicKey(publicKey);
const objectToEncrypt = {product_name: 'Testing', product_price: 10 };
const jsonString = JSON.stringify(objectToEncrypt);
// 使用OAEP加密,哈希算法与后端保持一致
var encrypted = encrypt.encryptOAEP(jsonString, 'sha256');

此时后端解密代码无需修改,保持原有 OAEP 配置即可。

补充说明
  • RSA 加密有长度限制:1024位密钥下,PKCS1_V1_5 最多加密117字节内容,OAEP-SHA256 最多加密86字节。若需加密大尺寸数据,建议先用对称加密算法加密数据,再用 RSA 加密对称密钥。
  • 你当前使用的密钥对是匹配的,无需更换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:44:51