JAVA-AES解密-使用填充密码解密时,输入长度必须为16的倍数

问题描述

我正在尝试解密从API获得的ResponseText变量。我收到以下错误

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be 
  multiple of 16 when decrypting with padded cipher

下面是我的用于解密响应的代码段。 Decrytpt方法引发错误

public static String decrypt(String encryptedText) throws Exception 
{
        Key key = generateKey();
        Cipher chiper = Cipher.getInstance("AES/CBC/PKCS5Padding");
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        chiper.init(Cipher.DECRYPT_MODE,key,ivspec);
        byte[] encVal = chiper.doFinal(encryptedText.getBytes("UTF-8"));
        Base64.Encoder base64Encoder = Base64.getEncoder();
        String decryptedValue = base64Encoder.encodetoString(encVal);
        String decryptedString= new String("");                
        return decryptedString;
}

我没有在此处发布实际的加密值,因为加密值的长度太长。我是Java新手。预先感谢。

解决方法

您可能应该将base 64解密为密文,解密二进制密文,然后然后将生成的明文解码为UTF-8。

换句话说,您没有正确逆转加密例程(对UTF-8进行编码,对base64进行加密和编码)。


有一个generateKey()用于解密;除非它返回一个静态值(并且不生成一个值,如方法名所示),否则解密很可能会失败。因此,要么名称错误,要么解密。

IV似乎也未包含在密文中,这意味着这是下一个要解决的问题。

最后,您将需要了解how to handle exceptions的加密/解密例程。