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

Java AES解密抛出Exception decrypting with padded cipher异常

异常产生原因

抛出BadPaddingException: Exception decrypting with padded cipher的核心原因是密文输入处理逻辑错误,和密钥生成逻辑无关:

  • 你代码中key变量存储的是经过Base64编码的AES密文字符串,解密前没有做Base64解码,直接调用key.getBytes(StandardCharsets.UTF_8)拿到的是Base64字符串本身的UTF-8编码字节,并非AES加密输出的原始二进制密文。
  • 错误的字节输入不符合AES/ECB/PKCS5Padding的块解密要求,解密过程中PKCS5填充位校验完全不匹配,直接抛出填充解密异常。
  • 你的密钥生成逻辑是正确的:对字符串MiClave做SHA-256哈希取32字节结果作为256位AES密钥的实现没有问题,不存在密钥不匹配的问题。
修复方案
  1. 解密前先对key存储的Base64密文做解码,拿到原始二进制密文再传入解密方法
  2. 解密得到的明文字节直接转UTF-8字符串输出即可,不需要额外做Base64编码

修复后的完整可运行代码如下:

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;

public class gtUF2 {

    public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException,
            IllegalBlockSizeException, BadPaddingException, InvalidKeyException {
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        SecretKey sKey = passwordGeneration("MiClave", 256);

        // 打印生成的AES密钥Base64值,可用于校验
        System.out.println("AES Key(Base64): " + Base64.getEncoder().encodeToString(sKey.getEncoded()));

        String cipherTextBase64 = "7JUQgSTY3kFSYQC6/0L89rdYW36ArmK75Kdn3+cOvaE=";
        cipher.init(Cipher.DECRYPT_MODE, sKey);
        // 修复点:先Base64解码得到原始密文字节,再执行解密
        byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(cipherTextBase64));
        // 修复点:解密得到的明文字节直接转UTF-8字符串输出
        System.out.println("Decrypted plaintext: " + new String(decrypted, StandardCharsets.UTF_8));
    }

    public static SecretKey passwordGeneration(String text, int keySize) throws NoSuchAlgorithmException {
        byte[] data = text.getBytes(StandardCharsets.UTF_8);
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] hash = md.digest(data);
        byte[] key = Arrays.copyOf(hash, keySize/8);
        return new SecretKeySpec(key, "AES");
    }
}

补充说明:如果使用JDK 8u161之前的旧版本运行AES-256加解密,需要提前安装JCE无限制权限策略文件,新版本JDK默认开启256位密钥加解密权限,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:09:24