AES加解密的错误提示 javax.crypto.BadPaddingException: pad block corrupted

本文探讨了解决AES并发操作时出现的BadPaddingException异常问题,通过修改工具类中的cipher实例化方式,避免了多线程环境下的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AES解密的错误提示:

javax.crypto.BadPaddingException: pad block corrupted
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher.doFinal(Unknown Source)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at com.shangying.toolbox.security.AESUtil.decrypt(AESUtil.groovy:98)

问题描述:AES 可以正常加解密,但是多用户并发操作时,有时会出现以上错误!!!!!


从网上搜索这个错误的,大多数说是 SecureRandom 产生随机数问题,然后看下我的AES加解密工具类一看,额 没使用这种方式,代码如下:

初始化:

 Security.addProvider(new BouncyCastleProvider());
 key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
// 初始化cipher
 cipher = Cipher.getInstance(algorithmStr, "BC");

加密:

 cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(ivStr.getBytes("UTF-8")));
 byte[] enbytes = cipher.doFinal(contentStr.getBytes("UTF-8"));
 return new BASE64Encoder().encode(enbytes)

解密:

 byte[] contentBye = new BASE64Decoder().decodeBuffer(base64Str)
 cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivStr.getBytes("UTF-8")));
 byte[] dedata = cipher.doFinal(contentBye);
 return new String(dedata, "UTF-8");

将提示错误的Key 和密文拿出来 重新 解密下,哎解密成功了。。

单个密文解密都是成功的,性能压测的时候 就会出现大量的 成功和失败,报的错误都是 pad block corrupted,

然后就将代码重新梳理了变,原来是 工具类中 将 cipher 定义为静态常量了,cipher 不是单例模式,改为 多线程试下,果然 这个错误就没有了。。

微笑


### 回答1: "javax.crypto.badpaddingexception: pad block corrupted" 意思是在使用 Java Cryptography Extension (JCE) 进行解密时,出现了 "pad block corrupted" 的错误。这通常表明解密过程中出现了数据损坏或篡改的情况。可能原因包括:密钥不正确、输入数据已经被篡改、或者使用了错误的填充模式。 ### 回答2: javax.crypto.BadPaddingExceptionJava加密标准库中常见的异常之一,表示在进行解密操作时发生了填充错误,导致解密失败。 填充错误的原因有很多种,其中一种常见的情况是解密时所使用的密钥与加密时使用的密钥不一致,或者加密时使用了错误的填充模式。 当解密时所使用的密钥与加密时使用的密钥不一致时,解密器无法正确解密加密过的数据,因为加密的过程中使用的是一种基于密钥的算法对数据进行加密处理,如果使用了不同的密钥解密,就无法正确还原加密前的数据。 而填充模式则是在加密算法中用来填充数据的一种机制,有些填充模式在加密时可能会产生一些随机的字节,而在解密时,如果解密器无法正确识别这些填充字节,就会导致解密失败,抛出BadPaddingException异常。 解决这个异常的方法有很多种,但主要是要确保解密时使用的密钥与加密时使用的密钥一致,并且要根据加密时使用的填充模式来正确处理填充字节。另外,也可以尝试使用其他加密库来替换Java标准库中的加密模块,或者使用更高级的加密算法来保证数据的安全性和完整性。 总之,BadPaddingException异常代表着数据解密时发生了填充错误,需要仔细检查解密时所使用的密钥和填充模式,以确保数据的正确性和安全性。 ### 回答3: javax.crypto.BadPaddingExceptionJava加密库中的一个异常,表示在解密过程中发生了填充损坏的情况。这个异常通常在使用加密算法中的块密码模式时出现。 Java中常用的块密码模式有ECB、CBC和CTR等。在这些模式下,明文需要进行填充以保证加密后的数据长度符合块长要求。填充过程中,通常会在明文的末尾添加一些无用的数据,以防止破解者通过加密后的数据长度判断明文的长度。但是,当解密时出现填充损坏的情况,就会抛出BadPaddingException异常。 通常,这种异常的原因有以下几种: 1. 解密时使用了错误的密钥。如果密钥使用了错误的值,那么解密时就无法正确地还原出明文,从而导致填充出现错误。 2. 对称加密模式下,解密后得到了错误的块大小。如果使用的密钥和算法不是完全匹配的,解密后得到的块大小可能会出现偏差,导致填充错误。 3. 数据传输中发生了中断、丢包或数据损坏。在这种情况下,原始的密文可能会被破坏,导致在解密时填充出现错误。 为了避免这种异常,一般需要确保密钥的正确性,并且在解密过程中仔细检查解密后的结果。如果发现结果不正确,就要逐步排查原因,确定问题所在。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值