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

C#加密后Java解密报PaddingException问题求助

C# AES加密与Java解密不兼容问题排查与修复

核心问题分析

你的代码存在两个致命错误,直接导致解密时抛出Padding异常:

  1. 密钥处理逻辑不一致
    • C#中:将输入密钥转UTF8字节后,截断/补0到16字节作为AES密钥(因为KeySize设为128位=16字节)。若密钥长度超过16,仅取前16字节;不足则剩余字节补0。
    • Java中:直接使用完整的密钥UTF8字节数组作为密钥,未做截断/补0处理,导致密钥长度不匹配(你的测试密钥长度远大于16字节)。
  2. IV初始化逻辑不一致
    • C#中:IV和处理后的16字节密钥完全相同。
    • Java中:IV被初始化为全0数组,与C#的IV完全不匹配。

关于PKCS5Padding与PKCS7Padding的说明

对于AES(块大小128位=16字节),Java的PKCS5Padding和PKCS7Padding功能完全等价。PKCS5原本针对64位块定义,但Java的PKCS5Padding实现兼容16字节块的填充逻辑,和PKCS7一致。因此填充方式不是问题根源。

修正后的Java解密代码

public String decryptInputData(String encryptedRequest, String key1)  {
    byte[] cipherData = Base64.getDecoder().decode(encryptedRequest);
    byte[] pwdBytes = key1.getBytes(StandardCharsets.UTF_8);
    byte[] keyBytes = new byte[16]; // 128位密钥对应16字节长度
    int len = pwdBytes.length;
    if (len > keyBytes.length) {
        len = keyBytes.length;
    }
    // 对齐C#的密钥处理逻辑:复制字节,不足补0
    System.arraycopy(pwdBytes, 0, keyBytes, 0, len);
    
    // IV与处理后的密钥保持一致,对齐C#逻辑
    IvParameterSpec iv = new IvParameterSpec(keyBytes);
    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

    Cipher aesCBC;
    try {
        aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding");
        aesCBC.init(Cipher.DECRYPT_MODE, key, iv);
        byte[] decryptedData = aesCBC.doFinal(cipherData);
        return new String(decryptedData, StandardCharsets.UTF_8);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

验证说明

使用你提供的测试数据(密钥、加密字符串、明文),修正后的代码可正常解密,不会再抛出Padding相关异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:54:27