1

我有一个类似的方法。它工作正常,但问题是当我尝试解密填充错误甚至根本没有加密的文件时。通常我相信cipher.doFinal(..)通常会抛出一些与 , 相关的IllegalBlockSizeException异常 BadPaddingException。我相信这是由于掩盖了此处的那些异常。我的问题是我可以检测到这些异常情况吗?

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;
}
4

1 回答 1

1

在 bouncycastle-dev 和 openjdk-security 中已经对此进行了讨论。Oracle认为这是有意的行为,并且 JCE 的密码不会在关闭时进行身份验证检查,因此认为它是安全的。

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

您的选择是改用 BCs 流org.bouncycastle.crypto.io.CipherInputStream。他们修复了流(> 1.50)。菲利普写了一篇关于这一切的好博客。

于 2014-07-01T20:25:47.210 回答