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

RSA加解密遇javax.crypto.BadPaddingException解密错误求助

问题分析与修复方案

核心问题:密钥对完全不匹配

你犯了RSA加密的基础逻辑错误:

  • 服务器用自身公钥加密消息,客户端必须用服务器对应的私钥才能解密。但你的客户端代码里key = rsa.initKey();生成了一套全新的、和服务器毫无关系的密钥对,用这个私钥去解密服务器加密的数据,必然会抛出BadPaddingException之类的异常。

其他需要修正的问题

1. RSA工具类的常量命名错误

工具类中PRIVATE_KEY常量被定义为"rsa",但注释明确写了应该是RSAPrivateKey。虽然当前代码存/取逻辑一致暂时没报错,但这是个极易引发后续bug的低级失误,赶紧改成:

private static final String PRIVATE_KEY = "RSAPrivateKey"; // 和公钥常量命名、注释保持一致

2. 客户端重复初始化输入流

客户端同时用BufferedReader和DataInputStream读取同一个socket输入流,两种流的缓冲机制会互相干扰,导致数据读取异常。直接删掉多余的流初始化,全程用DataInputStream/DataOutputStream即可:

// 删掉这两行无用代码:
// in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
inputStream = socket.getInputStream();
DataInputStream dIn = new DataInputStream(socket.getInputStream());

正确的实现流程

方案一:更安全的标准流程(推荐)

通常RSA用于加密会话密钥,或者客户端生成密钥对让服务器加密:

  1. 客户端生成自己的密钥对,将公钥发送给服务器;
  2. 服务器用客户端的公钥加密消息,客户端用自己的私钥解密。

方案二:沿用你当前的服务器加密逻辑(仅用于测试)

如果非要让服务器用自身公钥加密,客户端必须拿到服务器的私钥(注意:实际生产环境绝对不能明文传输私钥,这里仅做测试用):

  1. 服务器初始化密钥后,输出私钥的Base64字符串:
Map<String, Object> serverKeyMap = rsa.initKey();
String serverPublicKey = rsa.getPublicKey(serverKeyMap);
String serverPrivateKey = rsa.getPrivateKey(serverKeyMap);
// 将serverPrivateKey传递给客户端(比如硬编码到客户端代码里用于测试)
  1. 客户端替换密钥初始化代码,直接使用服务器的私钥解密:
// 删掉客户端的密钥生成代码,改用服务器提供的私钥
String serverPrivateKey = "服务器输出的Base64私钥字符串";
byte[] decodebyte = rsa.decryptByPrivateKey(array, serverPrivateKey);

内容的提问来源于stack exchange,提问作者Роман Дворниченко

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:42:48