Java 之 Given final block not properly padded


  獲取Cipher對象的時候一定要寫成

  Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");

  不要寫成

  Cipher cipher = Cipher.getInstance("DES");

  否則解密的時候會報錯:

  Given final block not properly padded

 

  原因是Cipher cipher = Cipher.getInstance("DES");與Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");等同,填充方式錯誤,加密的時候會得到16長度的字節數組。

 

  解密的時候報錯: javax.crypto.BadPaddingException:   Given   final   block   not   properly   padded 

  仔細分析一下,不難發現,該異常是在解密的時候拋出的,加密的方法沒有問題。  

  但是兩個方法的唯一差別是Cipher對象的模式不一樣,這就排除了程序寫錯的可能性。再看一下異常的揭示信息,大概的意思是:提供的字塊不符合填補的。

  原來在用DES加密的時候,最后一位長度不足64的,它會自動填補到64,那么在我們進行字節數組到字串的轉化過程中,可以把它填補的不可見字符改變了,所以引發系統拋出異常。

  問題找到,怎么解決呢?大家還記得郵件傳輸通常會把一些信息編碼保存,對了,就是Base64,那樣保證了信息的完整性。為了方便使用,我們再寫一個新的方法封裝一下原來的方法:  

    public static String DataEncrypt(String str, byte[] key)
    {  
        String encrypt = null;  
        try
        {  
            byte[] ret = encode(str.getBytes("UTF-8"),key);  
            encrypt = new String(Base64.encode(ret));  
        }
        catch(Exception e){  
            System.out.print(e);  
            encrypt = str;  
        }  
        return encrypt;  
    }
public static String DataDecrypt(String str, byte[] key) {   String decrypt = null;   try {   byte[] ret = decode(Base64.decode(str),key);   decrypt = new String(ret,"UTF-8");   } catch(Exception e) {   System.out.print(e);   decrypt = str;   }   return decrypt;   }  

  我們把方法的參數改成了字串,但是為什么要用UTF-8呢?不指定它的字節格式不行嗎?大家知道,UTF-8是國際通用的字符編碼,用它傳輸任何字串都不會有問題,通過它也可以很完美的解決J2EE的中文問題!所以我們最好用UTF-8編碼,以減少不必要的麻煩。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM