使用RSA加密AES密钥时触发IllegalBlockSizeException错误求助
解决RSA加密时的IllegalBlockSizeException异常
问题根因
你代码里犯了逻辑错误:尝试用RSA加密的是自己的RSA公钥(Store.myPublicEncoded),而非要传输的AES对称密钥。
- 2048位RSA搭配
PKCS1Padding时,最大可加密明文长度为密钥字节数 - 11,也就是2048/8 -11 = 245字节。 - 2048位RSA公钥的X.509编码(
PublicKey.encoded输出格式)大小约294字节,远超245字节限制,因此抛出IllegalBlockSizeException。
修正代码
将加密目标替换为AES密钥的编码(Store.simmetrycKeyEncoded),关键代码修改如下:
// 替换原错误代码,加密AES密钥而非RSA公钥 Base64.encode(cipher.doFinal(Store.simmetrycKeyEncoded), Base64.NO_WRAP).decodeToString()
额外安全优化建议
- 指定AES安全模式与填充:
原代码Cipher.getInstance("AES")会使用系统默认的ECB模式(不安全),建议改用带完整性校验的GCM模式:
private val simmetrycCipher = Cipher.getInstance("AES/GCM/NoPadding") private val simmetrycDecodeCipher = Cipher.getInstance("AES/GCM/NoPadding")
注意GCM模式需要初始化向量(IV),初始化Cipher时需传入IvParameterSpec。
- RSA使用更安全的OAEP填充:
PKCS1Padding安全性弱于OAEP,建议替换为:
private val cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding") private val decrCipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding")
内容的提问来源于stack exchange,提问作者mark egorov
相关产品推荐
相关产品推荐

