源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

完美解决Linux操作系统下aes解密失败的问题

  • 时间:2021-06-04 22:53 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:完美解决Linux操作系统下aes解密失败的问题
[b]现象描述: [/b]windows上加解密正常,linux上加密正常,解密时发生如下异常:
[u]复制代码[/u] 代码如下:
javax.crypto.BadPaddingException: Given final block not properly padded        at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)        at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)        at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)        at javax.crypto.Cipher.doFinal(DashoA13*..)        at chb.test.crypto.AESUtils.crypt(AESUtils.java:386)        at chb.test.crypto.AESUtils.AesDecrypt(AESUtils.java:254)        at chb.test.crypto.AESUtils.main(AESUtils.java:40)
[b]解决方法: [/b]经过检查之后,定位在生成KEY的方法上,如下:
[u]复制代码[/u] 代码如下:
public static SecretKey getKey (String strKey) {          try {                     KeyGenerator _generator = KeyGenerator.getInstance( "AES" );             _generator.init(128, new SecureRandom(strKey.getBytes()));                 return _generator.generateKey();         }  catch (Exception e) {              throw new RuntimeException( " 初始化密钥出现异常 " );         }       }
[b]修改到如下方式,问题解决: [/b]
[u]复制代码[/u] 代码如下:
  public static SecretKey getKey(String strKey) {          try {                     KeyGenerator _generator = KeyGenerator.getInstance( "AES" );              SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );             secureRandom.setSeed(strKey.getBytes());             _generator.init(128,secureRandom);                 return _generator.generateKey();         }  catch (Exception e) {              throw new RuntimeException( " 初始化密钥出现异常 " );         }       }
[b]原因分析 [/b]SecureRandom 实现完全随操作系统本身的內部状态,除非调用方在调用 getInstance 方法之后又调用了 setSeed 方法;该实现在 windows 上每次生成的 key 都相同,但是在 solaris 或部分 linux 系统上则不同。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部