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
相关产品推荐
相关产品推荐

