前端用 RSA 加密时公钥格式不对怎么办?

夏侯金利 阅读 11

我在前端用 jsencrypt 做 RSA 加密,后端给的公钥是 PEM 格式的,但直接传进去加密失败了。

试过把公钥头尾的 -----BEGIN PUBLIC KEY----------END PUBLIC KEY----- 去掉,还是不行,控制台报错说“Invalid PEM formatted message”。

后端说是标准的 PKCS#8 公钥,我该怎么处理才能让 jsencrypt 正确识别?

const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey); // 这里 publicKey 是后端给的完整 PEM 字符串
const encrypted = encrypt.encrypt('test');
我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
书生シ慧芳
遇到这种问题太常见了,jsencrypt确实对PEM格式有点挑剔。先确认下你的公钥格式,PKCS#8的公钥应该以-----BEGIN PUBLIC KEY-----开头,而不是-----BEGIN RSA PUBLIC KEY-----

推荐的做法是确保公钥字符串完整包含头尾标记,并且换行符要正确。可以这样处理:

const publicKey = -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...(你的公钥内容)
-----END PUBLIC KEY-----
;

const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);


如果还是报错,可能是换行符问题。试试用n明确指定换行:
const publicKey = "-----BEGIN PUBLIC KEY-----nMIIBIj...n-----END PUBLIC KEY-----"

实在不行就检查下公钥内容是否完整,有时后端传过来的公钥可能被截断。我之前就遇到过因为一个空格导致的加密失败,排查了半天想打人...

另外jsencrypt的文档里明确说了需要完整的PEM格式,包括头尾标记。所以千万别手贱去掉那些标记,它们其实很重要。
点赞
2026-03-05 14:01