【发布时间】:2014-05-06 09:43:31
【问题描述】:
我尝试解密从网络服务收到的加密数据。
使用AES 128完成加密。
我使用以下代码解密数据:
public static String decrypt(String strToDecrypt)
{
try
{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); //AES/CBC/PKCS7Padding
SecretKeySpec secretKey = new SecretKeySpec(AppConstants.AESEncryptionKey.getBytes("UTF8"), "AES");
int blockSize = cipher.getBlockSize();
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(new byte[blockSize])); //new IvParameterSpec(new byte[16])
byte decBytes[] = cipher.doFinal(Base64.decode(strToDecrypt, 0));
// byte decBytes[] = cipher.doFinal(Base64.decodeBase64(strToDecrypt));
String decStr = new String(decBytes);
System.out.println("After decryption :" + decStr);
return decStr;
}
catch (Exception e)
{
System.out.println("Exception in decryption : " + e.getMessage());
}
return null;
}
在
cipher.doFinal()
我得到以下异常:
javax.crypto.badpaddingexception 垫块损坏
我浏览了我的帖子,但最终没有解决方案。我被困在这里了。
【问题讨论】:
-
要么加密方使用其他填充(或模式,或密码),要么
strToDecrypt包含截断或损坏的数据(字符串本身可以是正确的 Base64,但它表示的数据已损坏)。 -
strToDecrypt 拥有完美的 Base64 编码加密数据,甚至填充、模式和算法都相同
-
在这种情况下,最后一个选项是用于编码和解码的密钥不同:使用错误的密钥解密将导致最后一个块不包含正确填充的数据,并且可以检测到这种情况并导致 BadPaddingException。
-
不应该是
.getBytes("UTF-8")吗?
标签: java android exception encryption aes