【发布时间】:2016-03-22 01:55:38
【问题描述】:
我有一些解密代码期望 Cipher.doFinal() 在使用不正确的密钥/iv 时抛出异常。这似乎没有发生。嗯,确实会发生,但并非总是如此。
我的加密使用当前时间的“秒”作为 Random() 类的种子。然后它使用 16 个(伪)随机值,以 256 为模,生成一个 16 字节的密钥。它使用此密钥进行加密。它对 IV 使用相同的字节数组。我正在按如下方式初始化密码:
Cipher.getInstance("AES/CBC/ISO10126Padding");
解密使用相同的逻辑循环遍历所有可能的 60 秒值 (0 - 59) 以生成密钥和 IV。对于每个密钥和 IV,它都会尝试解密加密的值。我通常会抛出一些 BadPaddingException,但大多数时候它会在不正确的“第二个”值上成功。正如预期的那样,我得到了垃圾返回。我期待 doFinal() 在使用错误的键/iv 时总是抛出异常。有什么理由不这样做吗?
举个例子:
如果我加密时当前秒为 45,它将使用该值生成密钥/iv。当我尝试解密时,我坐在一个从 0 到 59 的 for 循环中,尝试每个值,直到 doFinal() 成功(例如,不抛出异常)。我通常会看到一些 BadPaddingException,但循环将在 45 之前结束,并且我会返回垃圾。
我确实找到了这个:
Java AES decryption detect incorrect key
这似乎是相关的,虽然我没有使用密码流。
【问题讨论】:
-
根据我的计算,只有 6% 的错误键应该使用 ISO10126Padding 产生垃圾。其他 94% 应该导致 BadPaddingException。是你看到的还是你的结果不同?
标签: java encryption