解密的時候報錯: java
javax.crypto.BadPaddingException: Given final block not properly padded 數組
該異常是在解密的時候拋出的,加密的方法沒有問題。 dom
可是兩個方法的惟一差異是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; }
主要是紅色部分的問題spa
修改後代碼:code
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建立的方式不一樣而引發的錯誤orm