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

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");
    }
}

为什么这个修复有效?

  1. 过滤无效字符:第三方返回的加密数据可能包含换行、空格或其他非标准字符,这些都会干扰Base64解码,用正则[^A-Za-z0-9+/=]可以一次性清除所有非法字符。
  2. 补充填充字符:有些系统会自动去除Base64末尾的=(虽然不符合规范,但确实存在),导致字符串长度不是4的倍数。通过计算余数补充=,可以让输入符合Base64的格式要求。

额外检查点(确保万无一失)

  • 确认加密方使用的是标准Base64编码:如果对方用的是URL安全的Base64(用-_代替+/),你需要把Base64.getDecoder()换成Base64.getUrlDecoder()。不过根据你说在线工具能解密,大概率是标准Base64。
  • 私钥加载逻辑是正确的:你的私钥是PKCS#8格式(BEGIN PRIVATE KEY),用PKCS8EncodedKeySpec加载的方式完全正确,这部分不需要修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:12:46