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);

  

相關文章
相關標籤/搜索