javax.crypto.BadPaddingException: Given final block not properly padded解決方案
阿新 • • 發佈:2018-12-29
解密的時候報錯:
javax.crypto.BadPaddingException: Given final block not properly padded
該異常是在解密的時候丟擲的,加密的方法沒有問題。
但是兩個方法的唯一差別是Cipher物件的模式不一樣,這就排除了程式寫錯的可能性。再看一下異常的揭示資訊,大概的意思是:提供的字塊不符合填補的。原來在用DES加密的時候,最後一位長度不足64的,它會自動填補到64,那麼在我們進行位元組陣列到字串的轉化過程中,可以把它填補的不可見字元改變了,所以引發系統丟擲異常。大家還記得郵件傳輸通常會把一些資訊編碼儲存,就是Base64,那樣保證了資訊的完整性,所以我們就是利用一下下了。
原來的程式碼:
private Key initKeyForAES(String key) throws NoSuchAlgorithmException {
if (null == key || key.length() == 0) {
throw new NullPointerException("key not is null");
}
SecretKeySpec key2 = null;try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(key.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
key2 = new SecretKeySpec(enCodeFormat, "AES");
} catch (NoSuchAlgorithmException ex) {
throw new NoSuchAlgorithmException();
}
return key2;
}
主要是紅色部分的問題
修改後程式碼:
private Key initKeyForAES(String key) throws NoSuchAlgorithmException {
if (null == key || key.length() == 0) {
throw new NullPointerException("key not is null");
}
SecretKeySpec key2 = null;
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(key.getBytes());
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, random);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
key2 = new SecretKeySpec(enCodeFormat, "AES");
} catch (NoSuchAlgorithmException ex) {
throw new NoSuchAlgorithmException();
}
return key2;
}
其實就是SecureRandom建立的方式不同而引起的錯誤