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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:25:01