jsencrypt 加密后端解不开,是哪里出问题了?

a'ゞ普涵 阅读 57

我用 jsencrypt 在前端加密手机号,传给 Java 后端,但后端一直报解密失败。我确认公钥是从后端拿的,格式也没动过,不知道是不是加密方式不对?

这是我的前端代码:

<script src="https://cdn.jsdelivr.net/npm/jsencrypt@3.0.0/bin/jsencrypt.min.js"></script>
<script>
  const encrypt = new JSEncrypt();
  encrypt.setPublicKey(-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----);
  const encrypted = encrypt.encrypt('13800138000');
  console.log(encrypted); // 传给后端
</script>

后端用的是标准 RSA/ECB/PKCS1Padding,难道 jsencrypt 默认不是 PKCS#1 v1.5?

我来解答 赞 12 收藏
二维码
手机扫码查看
2 条解答
子骞的笔记
jsencrypt 默认确实用的是 PKCS#1 v1.5 填充方式,跟你说的后端解密配置是一致的。问题可能出在几个地方。

首先确认公钥传递过程没问题,最好在前端加密前打印一下拿到的公钥内容,确保和后端生成的一模一样。有时候格式不对或者中间多了换行、空格都会导致加密结果异常。

另外要注意安全,不要直接在页面上写明文公钥,建议通过接口动态获取。虽然公钥本身不敏感,但暴露太多信息总是不好。

后端这边也检查一下是不是真的用了正确的私钥来解密。要是私钥错了或者被篡改过,肯定会解不开的。

最后提醒一下,手机号这种敏感信息建议使用 HTTPS 传输,即使加密了也要注意中间人攻击风险。

如果还是不行的话,可以试试用 openssl 命令行工具模拟一下加解密流程,排查到底是哪边的问题:

echo -n '13800138000' | openssl rsautl -encrypt -inkey public.pem -pubin | base64


这个命令可以用你的公钥文件测试下加密结果是否一致。希望这些能帮到你。
点赞
2026-03-30 08:02
建杰酱~
jsencrypt 默认就是 PKCS#1 v1.5,加密方式没问题。大概率是公钥格式的问题,把单行字符串换成带换行符的格式试试。

const pubKey = -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----
;
encrypt.setPublicKey(pubKey);
点赞 2
2026-03-04 17:06