javax.crypto.BadPaddingException: Given final block not properly padded解決方案

解密的時候報錯: 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

相關文章
相關標籤/搜索