C#加密后Java解密报PaddingException问题求助
C# AES加密与Java解密不兼容问题排查与修复
核心问题分析
你的代码存在两个致命错误,直接导致解密时抛出Padding异常:
- 密钥处理逻辑不一致
- C#中:将输入密钥转UTF8字节后,截断/补0到16字节作为AES密钥(因为KeySize设为128位=16字节)。若密钥长度超过16,仅取前16字节;不足则剩余字节补0。
- Java中:直接使用完整的密钥UTF8字节数组作为密钥,未做截断/补0处理,导致密钥长度不匹配(你的测试密钥长度远大于16字节)。
- 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
相关产品推荐
相关产品推荐

