JAVA實現AES 解密報錯Input length must be multiple of 16 when decrypting with padded cipher

加密代碼

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**解密
  * @param content  待解密內容
  * @param password 解密密鑰
  * @return
  */
public static byte [] decrypt( byte [] content, String password) {
         try {
                  KeyGenerator kgen = KeyGenerator.getInstance( "AES" );
                  kgen.init( 128 , new SecureRandom(password.getBytes()));
                  SecretKey secretKey = kgen.generateKey();
                  byte [] enCodeFormat = secretKey.getEncoded();
                  SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES" );           
                  Cipher cipher = Cipher.getInstance( "AES" ); // 建立密碼器
                 cipher.init(Cipher.DECRYPT_MODE, key); // 初始化
                 byte [] result = cipher.doFinal(content);
                 return result; // 加密
         } catch (NoSuchAlgorithmException e) {
                 e.printStackTrace();
         } catch (NoSuchPaddingException e) {
                 e.printStackTrace();
         } catch (InvalidKeyException e) {
                 e.printStackTrace();
         } catch (IllegalBlockSizeException e) {
                 e.printStackTrace();
         } catch (BadPaddingException e) {
                 e.printStackTrace();
         }
         return null ;
}

  

 

解密代碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**解密
  * @param content  待解密內容
  * @param password 解密密鑰
  * @return
  */
public static byte [] decrypt( byte [] content, String password) {
         try {
                  KeyGenerator kgen = KeyGenerator.getInstance( "AES" );
                  kgen.init( 128 , new SecureRandom(password.getBytes()));
                  SecretKey secretKey = kgen.generateKey();
                  byte [] enCodeFormat = secretKey.getEncoded();
                  SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES" );           
                  Cipher cipher = Cipher.getInstance( "AES" ); // 建立密碼器
                 cipher.init(Cipher.DECRYPT_MODE, key); // 初始化
                 byte [] result = cipher.doFinal(content);
                 return result; // 加密
         } catch (NoSuchAlgorithmException e) {
                 e.printStackTrace();
         } catch (NoSuchPaddingException e) {
                 e.printStackTrace();
         } catch (InvalidKeyException e) {
                 e.printStackTrace();
         } catch (IllegalBlockSizeException e) {
                 e.printStackTrace();
         } catch (BadPaddingException e) {
                 e.printStackTrace();
         }
         return null ;
}

  

解密代碼

  

偶爾會報錯 拋出異常,java

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
 
緣由  加密後的byte數組是不能強制轉換成字符串的,換言之:字符串和byte數組在這種狀況下不是互逆的;要避免這種狀況,咱們須要作一些修訂,能夠考慮將二進制數據轉換成十六進制表示
解決方案 
 

二進制轉換成16進制

  

16進制轉換爲二進制

 

  

 測試結果,問題解決數組

 

?
1
2
3
4
5
6
7
8
9
10
11
String content = "test" ;
String password = "12345678" ;
//加密
System.out.println( "加密前:" + content);
byte [] encryptResult = encrypt(content, password);
String encryptResultStr = parseByte2HexStr(encryptResult);
System.out.println( "加密後:" + encryptResultStr);
//解密
byte [] decryptFrom = parseHexStr2Byte(encryptResultStr);
byte [] decryptResult = decrypt(decryptFrom,password);
System.out.println( "解密後:" + new String(decryptResult));

  

測試結果以下:
加密前:test
加密後:73C58BAFE578C59366D8C995CD0B9D6D
解密後:test
 
 
 
相關文章
相關標籤/搜索