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 不是单例模式,改为 多线程试下,果然 这个错误就没有了。