exception javax.crypto.BadPaddingException: Given final block not properly padded

exception javax.crypto.BadPaddingException: Given final block not properly padded

CreationTime--2018年8月10日14点46分

Author:Marydon

1.情景还原

  linux系统下,AES解密失败,报错信息以下:html

  javax.crypto.BadPaddingException: Given final block not properly paddedjava

  windows操做系统下,使用AES进行加密、解密正常;linux

  在Linux下,相同的待加密字符串,每次加密结果都不同,并且解密失败。算法

2.缘由分析

  缘由:因为key的生成方式不一样引发的!windows

// 强随机数生成器
SecureRandom random = new SecureRandom(password.getBytes(ENCODING))

  上面的强随机数生成器,并无指定算法名称,因此,会根据操做系统的生成随机数,dom

  因为windows和linux的内核不一样,所以生成的随机数也会不一样,因此致使解密失败!加密

3.解决方案

  因为SecureRandom没有指定算法名称时,随机数的生成会随操做系统自己的內部状态而变化,操作系统

  因此,咱们须要手动指定随机数的生成规则,如何实现?htm

  在调用 getInstance 方法以后,再调用 setSeed 方法;blog

// 只适用windows
// kgen.init(128, new SecureRandom(password.getBytes(ENCODING)));
// 指定强随机数的生成方式
// 兼容linux
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(password.getBytes(ENCODING));
kgen.init(128, random);

  

相关文章
相关标签/搜索