CipherInputStream永远不会抛出异常

时间:2013-11-12 12:44:35

标签: java bouncycastle

我有一个类似的方法。它工作正常,但问题是当我尝试解密一个文件有错误的填充,甚至根本没有加密。通常我相信 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;
}

1 个答案:

答案 0 :(得分:1)

在bouncycastle-dev和openjdk-security中已经讨论过这个问题。 Oracle thinks这是预期的行为,并且JCE的密码不会在关闭时进行身份验证检查,认为它是安全的。

BC密码的行为方式不同,因为它们允许流式传输和(并发布未经身份验证的数据)。

您的选择是使用BCs流org.bouncycastle.crypto.io.CipherInputStream代替。他们修复了流(> 1.50)。 Phillipp wrote一个关于这一切的好博客。