问题描述
我正在尝试解密从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的加密/解密例程。