1. 程式人生 > >javax.crypto.BadPaddingException: Given final block not properly padded解決方案

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

解密的時候報錯: 

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建立的方式不同而引起的錯誤