Spring Boot应用中使用RSA/ECB/PKCS1Padding私钥解密时出现“Input byte array has wrong 4-byte ending unit”错误的解决求助
RSA解密报错"Input byte array has wrong 4-byte ending unit"的解决方案
这个错误的核心原因是Base64解码时输入的字符串不符合Base64格式要求——Base64编码的字符串长度必须是4的倍数,且只能包含A-Za-z0-9+/=这些字符,缺少填充字符=或者混入无效字符都会触发这个错误。结合你的代码和场景,我给你以下具体的修复方案:
第一步:修复解密方法中的Base64处理逻辑
你当前的代码只移除了空格,但没有处理Base64填充问题,也没有过滤其他可能的无效字符。修改后的代码如下:
@Autowired @Qualifier("btob_decryption_cipher") private Cipher btobDecryptionCipher; public synchronized byte[] btobDecryptRSA(String encryptedData){ try { // 1. 过滤所有非Base64合法字符(包括空格、换行、制表符等) String cleanedData = encryptedData.replaceAll("[^A-Za-z0-9+/=]", ""); // 2. 补充Base64必要的填充字符 int mod = cleanedData.length() % 4; if (mod != 0) { cleanedData += "=".repeat(4 - mod); } // 3. 解码并解密 return btobDecryptionCipher.doFinal(Base64.getDecoder().decode(cleanedData)); } catch (Exception e){ log.error("decryptRSA process failed",e); throw new IciciBankPaymentException("decryptRSA process failed"); } }
为什么这个修复有效?
- 过滤无效字符:第三方返回的加密数据可能包含换行、空格或其他非标准字符,这些都会干扰Base64解码,用正则
[^A-Za-z0-9+/=]可以一次性清除所有非法字符。 - 补充填充字符:有些系统会自动去除Base64末尾的
=(虽然不符合规范,但确实存在),导致字符串长度不是4的倍数。通过计算余数补充=,可以让输入符合Base64的格式要求。
额外检查点(确保万无一失)
- 确认加密方使用的是标准Base64编码:如果对方用的是URL安全的Base64(用
-_代替+/),你需要把Base64.getDecoder()换成Base64.getUrlDecoder()。不过根据你说在线工具能解密,大概率是标准Base64。 - 私钥加载逻辑是正确的:你的私钥是PKCS#8格式(
BEGIN PRIVATE KEY),用PKCS8EncodedKeySpec加载的方式完全正确,这部分不需要修改。
内容的提问来源于stack exchange,提问作者Himanshu Ranjan
相关产品推荐
相关产品推荐

