前端用公钥加密数据后端却解密失败,怎么回事?

夏侯丽丽 阅读 3

我在前端用 RSA 公钥加密用户密码,传给后端 PHP 解密,但总是报错“Decryption error”。明明公私钥是配对的,本地测试也正常,怎么一到前后端联调就不行了?

我用的是 jsencrypt 库,代码大概这样:

const encrypt = new JSEncrypt();
encrypt.setPublicKey(<code>-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC...
-----END PUBLIC KEY-----</code>);
const encrypted = encrypt.encrypt('123456');
fetch('/login', { method: 'POST', body: JSON.stringify({ pwd: encrypted }) });

后端用 openssl_private_decrypt() 解密,但一直失败。是不是加密方式或者填充模式的问题?

我来解答 赞 0 收藏
二维码
手机扫码查看
1 条解答
UX-冰杰
UX-冰杰 Lv1
RSA加密解密最容易出问题的就是填充方式了。前端默认用的是PKCS#1 v1.5,后端也得保持一致才行。

先检查下你的PHP代码,确保openssl_private_decrypt的时候指定填充方式:


$privateKey = openssl_get_privatekey($pemKey);
$encryptedData = base64_decode($requestData['pwd']);
$result = openssl_private_decrypt(
$encryptedData,
$decryptedData,
$privateKey,
OPENSSL_PKCS1_PADDING // 这里要指定
);


另外记得前端发过来的数据要用base64编码一下,后端再decode回来。JS的加密结果是二进制的,直接传输容易出错。

复制这个加密后的数据处理:
const encrypted = encrypt.encrypt('123456');
改成:
const encrypted = btoa(encrypt.encrypt('123456'));

这俩改完应该就能正常解密了。搞这种加密真挺烦的,但没办法,安全要求高啊。
点赞
2026-03-30 20:26