解密纯文本时,Java Bouncy Castle是否总会抛出异常

时间:2012-08-30 13:57:18

标签: java aes bouncycastle

我的系统中有一个进程,可以接收随机纯文本或密文输入。由于性能不是问题,我打算尝试解密所有传入的输入,伪代码如下:

//get the input, either a plain text, or cipher text 'in disguise'
//ex of plain text: "some text".getBytes()
byte[] plainText = getInput();
try {

    //try to decrypt whatever it is. Using Bouncy Castle as the AES crypto engine
    plainText = AESDecryptor.decrypt(HARDCODED_AES_KEY, plainText);
} catch(Exception ex) {
    ...
}

//do some process with the plain text
process(plainText);

我正在使用AES加密方法。

上面的代码在很大程度上依赖于一个假设,即尝试使用充气城堡解密纯文本将始终抛出异常。但假设是100%正确吗?尝试解密普通的,人类可读的文本时,它会不会抛出异常?

提前致谢!

1 个答案:

答案 0 :(得分:2)

简短回答

不,你不能保证例外。

更长的答案

接收异常的概率取决于所使用的填充方案。当加密库使用包含填充的算法解密数据时,它期望找到正确填充的明文。如果填充格式错误(例如因为输入是纯文本而不是密文),则可能会抛出异常。

如果您在解密中没有使用填充方案,并且您的输入是密码的块大小的倍数(在AES的情况下 - 16字节),那么您的库将很乐意解密明文并为您提供垃圾。


举个例子,考虑PKCS #7 padding。这会在明文末尾附加一个非零数字的字节,其值等于填充字节数。添加足够的字节以将明文与密码的块大小对齐。例如:

12 34 56 78 9A BC DE F0 08 08 08 08 08 08 08 08

08值是八个字节的填充以与AES块大小对齐。那么,如果你解密一些明文,它可能导致有效的填充?可能不是。但它可以,所以它是一种设计你的系统的草率方式。


您需要在建议的协议中添加另一个图层,以指示数据是否已加密。此时指定所使用的算法也很有用,因为这可能会在将来为您提供更大的灵活性以支持其他算法。