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
相关产品推荐
相关产品推荐

