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

Java使用文件存储的RSA密钥解密报IllegalBlockSizeException如何解决

RSA加密IllegalBlockSizeException报错解决

javax.crypto.IllegalBlockSizeException: Data must be longer than 256 bytes.

根本原因

2048位RSA算法有固定的块大小要求:

  • 加密后生成的密文长度固定为256字节(2048bit/8)
  • 解密操作要求输入的密文必须是完整的256字节二进制数据

你当前代码的核心错误是加解密流程不匹配:
加密侧逻辑:明文 → RSA加密得到二进制密文 → Base64编码为字符串后发送
解密侧逻辑错误:直接把收到的Base64编码字符串转成字节数组就传给解密方法,没有先做Base64解码,导致传入的字节数组长度不符合解密要求的256字节。

排查步骤

  • 打印切完后缀后的chatMessage内容,确认是完整的Base64编码字符串,没有被substring操作截断
  • 打印getKeyPair方法读取到的公钥、私钥字节数组长度,X509格式公钥正常长度在294字节左右,PKCS8格式私钥正常长度在1218字节左右,确认密钥文件读取无异常
  • 把chatMessage做Base64解码后打印字节数组长度,确认长度为256字节

修复方案

修改解密调用的代码,先对收到的密文字符串做Base64解码,再传入解密方法:

// 替换原错误的解密调用代码
// chatMessage = Encryption.Decrypt(chatMessage.getBytes(), privateKey);
byte[] cipherBytes = Base64.getDecoder().decode(chatMessage);
chatMessage = Encryption.Decrypt(cipherBytes, privateKey);

额外优化建议

  • 当前你用的RSA加密仅适合加密短文本(最大明文长度约190字节),如果需要加密长文本,建议采用「AES加密明文 + RSA加密AES密钥」的混合加密方案
  • 字符串转字节数组时显式指定编码(比如StandardCharsets.UTF_8),避免不同环境默认编码不一致导致乱码

内容的提问来源于stack exchange,提问作者jed101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:15:02