前端用 RSA 加密登录密码,为什么后端解密失败?

开发者梦幻 阅读 16

我在 React 项目里用 jsencrypt 做登录密码的 RSA 加密,本地测试加密看起来没问题,但传给 Java 后端后一直报“解密失败”或“BadPaddingException”。是不是公钥格式或者加密方式哪里不对?

我用的公钥是后端给的 PEM 格式,直接复制进来的。代码大概这样:

import JSEncrypt from 'jsencrypt';

const encryptPassword = (password) => {
  const publicKey = <code>-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC...
-----END PUBLIC KEY-----</code>;
  const encrypt = new JSEncrypt();
  encrypt.setPublicKey(publicKey);
  return encrypt.encrypt(password);
};

试过把换行符替换成 n,也试过 base64 编码后再传,但后端还是解不开,到底卡在哪了?

我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
Designer°西西
直接用这个

首先确保公钥在前后端一致,PEM格式的公钥前后端都要能识别。你提到的换行符替换是个好思路,不过要小心处理。

在前端,确保公钥字符串里的换行符都去掉,中间的空格也要去掉,然后试试看:

const encryptPassword = (password) => {
const publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...";
const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
return encrypt.encrypt(password);
};


注意,上面的 publicKey 字符串已经去掉了换行符和空格。

然后在后端,确保你用的是对应的私钥来解密,并且解密的时候也要注意编码问题,通常是 Base64 编码。

Java 后端解密的代码示例(假设你用的是 BouncyCastle 库):

import org.bouncycastle.util.encoders.Base64;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;

public class RSAUtil {
public static String decrypt(String encryptedData, String privateKeyString) throws Exception {
byte[] keyBytes = Base64.decode(privateKeyString);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher.doFinal(Base64.decode(encryptedData));
return new String(decryptedBytes);
}
}


确保你的私钥也是正确的 Base64 编码格式。

如果还是有问题,检查一下加密算法是否一致,前后端都应该用 RSA/ECB/PKCS1Padding 或类似的填充方式。
点赞
2026-03-23 08:00