DBMNG数据库管理与应用

书籍是全世界的营养品。生活里没有书籍,就好像没有阳光;智慧里没有书籍,就好像鸟儿没有翅膀。
当前位置:首页 > 经验分享 > Java组件

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

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


本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号