2

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

//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 作为加密方法。

上面的代码很大程度上依赖于一个假设,即尝试使用 bouncy castle 解密纯文本总是会抛出异常。但是这个假设是 100% 正确的吗?尝试解密普通的、人类可读的文本时总是会抛出异常吗?

提前致谢!

4

1 回答 1

2

简短的回答

不,你不能保证例外。

更长的答案

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

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


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

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

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


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

于 2012-08-30T14:12:47.027 回答