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

Java Bouncy Castle在解密纯文本时是否总是抛出异常,java,aes,bouncycastle,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

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

//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%正确吗?当试图解密普通的、人类可读的文本时,它是否总是抛出异常


提前谢谢

简短回答

不,你不能保证例外

更长的答案

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

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


作为一个例子,考虑一下。这将在纯文本的末尾追加非零字节数,其值等于填充字节数。添加足够的字节以将明文与密码的块大小对齐。例如:

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



您需要在建议的协议中添加另一层,以指示数据是否加密。在这一点上,指定使用的算法可能也很有用,因为这可能会让您在将来更灵活地支持其他算法。

谢谢您的回答。如果您不介意的话,我可以作为参考链接吗?为了清楚地识别有效的密码文本,我会在OCB或GCM模式下使用加密。@riza我手头恐怕没有参考资料;这个答案基于我在应用程序安全领域的工作经验。如果你研究互联网上的填充物,你就会理解我的观点。请注意,我还对BouncyCastle如何处理格式错误的填充进行了假设,但老实说,如果它不引发异常(或返回
null
或其他什么),则不值得使用它。