如何在JavaScript中用公钥解密RSA私钥加密的数据?
用JavaScript公钥解密PHP私钥加密的数据
问题背景
我有一段PHP代码,用私钥对数据加密,想在客户端通过JavaScript使用公钥解密。但多数JS库仅支持私钥解密,常规的公钥加密、私钥解密流程能正常运行,反向操作却无法实现,想问是否存在JS中用公钥解密的方法?
解决方案
RSA算法本身支持私钥加密、公钥解密的操作,只是这种场景更多用于**身份验证(类似签名验证逻辑)**而非常规加密。你可以使用jsrsasign库实现该需求,它支持直接调用私钥加密、公钥解密的API,无需依赖JSEncrypt。
修改后的可运行代码
<html> <head> <script src="https://kjur.github.io/jsrsasign/jsrsasign-latest-all-min.js"></script> </head> <body> <div id="canvas"></div> <script> // 密钥对 const privatekey = `-----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDHMkHcZBWMCEuZ 9nOv9NISE0AePVca/jpmmQbBsV/XVdQLjb1TMBtxZNeVKu89lk7O6jhILVP7Hcxr Oy9bcn31mMeG0XuY/ivWrUEwmz4nuLBqiG6N1rI2VLv0KCx4rV7yEHGL8nv0EL2y +8ISDUPuwtWM+nsh2AxEuUuqsTDEOLjtmJHIGz+RRibmdS5OzHMNtUS3PP+wsnuH 9MW6bCX0Je1rm+Ksegdy/BbVAp2wpOTcAax2Rh4hWm21TYXK3OSa8KddiNC2ZXv9 pa0wf/PjeMOz9Qdy/ZSB/KraWjQBO+5JNvnHjzwAfmPKS52xzqIIa7Y31GwOEp7J HJJjgu6DAgMBAAECggEBALzLmnareWyelCEZ4C4eSViOXFAM7VkNKgcB9NByMBdl JrPIpG+LAgeof1fHOLdTleAxSCTIqXcxmATuNIVk75NuOXZDZ/TqulwfG9FY4kE9 oB9orffLTF+IUhgoV3YNRBcDlMsCiY8aquFQEnGPlxpeGY8j/L5oCcC9KsVeaY0f UwM4D2WYKsADum23FNk12qeWEZXqrGRflsGNji5RVXoJAQyDMYolh7dI2fLbjPqW 45och3j0WOvs7x0oYIeiTqoeTlgweuOFfO2nYAGYp92YjQcJI4yAdWw17J3FLoS5 bvBkHnF0/IoF7ep8UpWQV/ITbLTEs4EerkT5SRTzgckCgYEA/NKMT94mn4JtRVlP Ti0/XX78TDpHW8xQNx2MW204u9wrYpi/XDhHLrrn7109NTj/iHl0aLtsCd/M0QAm COM9JRSSpPBcriuT6JoRyYvwfeiZaPMeNgp/oluP37G2JxbR0sIU1prXjDRDDrYP l6CbOvhHdOpKGNZ6cZaLqtnLSAUCgYEAybMrAjxaJmsqD/TT3aYWgiEpJEpQmiHq j543cBFikF8g2rbzTL6tCbxIyZaEzDmYSXv54q1t45soJ+DWxIfD7KkaNwFMx7YD bAy8FApW5rHcQbvp09qH3tnbPT+Oe2b4pJsfMPiAfB+wHLNsDdcxS2HQSnwLXVX+ N2UvzvYNyucCgYEArif3gbj9EBoPXZsk9yxSHvyvnW7z4vd+NklDe2NklnwW4sdn 4oXd+wHDbW7kD/qghAluOAsLZE3nT/1zNeIbJ6ThU39DyLK6I5umLxkX5BPLQbFf mUhoHZZHKIfJe2nLxgvtwNtPKgSCQOsHGKMI63lF9/LAchWkqQRUV6/JyWUCgYEA ikwXSUkoZv9Dr/0m5+ths4gZNZDfA1AODLtnN6gz9NnFJTIcUJrM+sfnAJH8LCux h3FCPXK8zjsspWs81zRf2n14RA7YHndmkUeKDhOo0jVR2KCIC4LjdqHZ+X0CrQpF olfaYzGAp5rynjtH85WBbzZ6Ixg6kpzL2h+/UCDWBDECgYBaqrlJQdL0MTkKWYmh x4na8uN2fAJg1bNHLrz525wjX43B4hDX1zl8puqGoKhwZRqbdJ3ESkdiuL5Jw6SH EBTu9QIUU0F/M+qThy8xxSFyhU91gJS3DZKLszM9EpDrlDBWkHgO0BDhL5ejxU1U YgFx+1dCJOKwMR7F+ue3Q1SRZA== -----END PRIVATE KEY-----`; const publickey = `-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxzJB3GQVjAhLmfZzr/TS EhNAHj1XGv46ZpkGwbFf11XUC429UzAbcWTXlSrvPZZOzuo4SC1T+x3MazsvW3J9 9ZjHhtF7mP4r1q1BMJs+J7iwaohujdayNlS79CgseK1e8hBxi/J79BC9svvCEg1D 7sLVjPp7IdgMRLlLqrEwxDi47ZiRyBs/kUYm5nUuTsxzDbVEtzz/sLJ7h/TFumwl 9CXta5virHoHcvwW1QKdsKTk3AGsdkYeIVpttU2FytzkmvCnXYjQtmV7/aWtMH/z 43jDs/UHcv2Ugfyq2lo0ATvuSTb5x488AH5jykudsc6iCGu2N9RsDhKeyRySY4Lu gwIDAQAB -----END PUBLIC KEY-----`; console.log('私钥:\n', privatekey); console.log('公钥:\n', publickey); // 原始数据 const originalData = 'Stackoverflow'; // 用私钥加密数据 const encryptedData = KJUR.crypto.Cipher.encrypt(originalData, privatekey, 'RSA'); console.log('加密后的数据:', encryptedData); // 用公钥解密数据 const decryptedData = KJUR.crypto.Cipher.decrypt(encryptedData, publickey, 'RSA'); console.log('解密后的数据:', decryptedData); // 验证解密结果 const decryptionSuccessful = decryptedData === originalData; console.log('解密是否成功:', decryptionSuccessful); </script> </body> </html>
关键说明
- 直接使用
jsrsasign的KJUR.crypto.Cipher.encrypt和decrypt方法,支持指定密钥类型实现私钥加密、公钥解密。 - 注意:私钥加密的内容长度受限于密钥长度(比如2048位密钥最多加密245字节左右的内容),如果要加密大文件,建议结合对称加密(如AES),先用私钥加密对称密钥,再用对称密钥加密数据。
内容的提问来源于stack exchange,提问作者Shashi kumar S
相关产品推荐
相关产品推荐

