我有一个类似的方法。它工作正常,但问题是当我尝试解密一个文件有错误的填充,甚至根本没有加密。通常我相信 cipher.doFinal(..)通常会抛出一些与IllegalBlockSizeException
相关的异常,
BadPaddingException
。我相信它是由于屏蔽了here中的那些例外。我的问题是我可以检测到这些例外情况吗?
public myDecryptMethod(byte[] sessionKey, FileInputStream encryptedFileStream) throws Exception{
....
SecretKeySpec symmKeySpec = new SecretKeySpec(sessionKey, "AES/CBC/PKCS5Padding");
Cipher symmCipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
IvParameterSpec ivParameterSpec = new IvParameterSpec("0000000000000000".getBytes());
symmCipher.init(Cipher.DECRYPT_MODE, symmKeySpec, ivParameterSpec);
CipherInputStream cis = new CipherInputStream(encryptedFileStream, symmCipher);
byte[] inputByteArray = new byte[10240];
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
while (true) {
int length = cis.read(inputByteArray);
if (length < 0)
break;
outStream.write(inputByteArray, 0, length);
}
outStream.close();
byte[] data = outStream.toByteArray();
InputStream inStream = new ByteArrayInputStream(data);
cis.close();
return inStream;
}
答案 0 :(得分:1)
在bouncycastle-dev和openjdk-security中已经讨论过这个问题。 Oracle thinks这是预期的行为,并且JCE的密码不会在关闭时进行身份验证检查,认为它是安全的。
BC密码的行为方式不同,因为它们允许流式传输和(并发布未经身份验证的数据)。
您的选择是使用BCs流org.bouncycastle.crypto.io.CipherInputStream
代替。他们修复了流(> 1.50)。 Phillipp wrote一个关于这一切的好博客。