gpt4 book ai didi

java - Cipher.doFinal() 在使用无效 key 时不抛出异常

转载 作者:行者123 更新时间:2023-11-29 04:54:25 25 4
gpt4 key购买 nike

我有一些解密代码期望 Cipher.doFinal() 在使用不正确的 key /iv 时抛出异常。这似乎没有发生。好吧,它确实发生了,但并非总是如此。

我的加密使用当前时间的“秒”作为 Random() 类的种子。然后它使用 16 个(伪)随机值,以 256 为模生成一个 16 字节的 key 。它使用此 key 进行加密。它对 IV 使用相同的字节数组。我正在按如下方式初始化密码:

Cipher.getInstance("AES/CBC/ISO10126Padding");

解密循环遍历所有可能的 60 秒值 (0 - 59),使用相同的逻辑生成 key 和 IV。对于每个 key 和 IV,它都会尝试解密加密值。我通常会抛出一些 BadPaddingException,但大多数时候它会在不正确的“第二”值上成功。正如预期的那样,我得到了垃圾回收。我期望 doFinal() 在使用错误的 key/iv 时总是抛出异常。有什么理由不这样做吗?

举个例子:

如果我加密时当前秒数为 45,它将使用该值生成 key /iv。当我尝试解密时,我坐在一个从 0 到 59 的 for 循环中尝试每个值,直到 doFinal() 成功(例如,不抛出异常)。我通常会看到一些 BadPaddingException,但循环会在 45 之前结束,我会返回垃圾。

我确实找到了这个:

Java AES decryption detect incorrect key

这似乎是相关的,尽管我没有使用密码流。

最佳答案

解密本身无法检测到错误的 key ,结果只是垃圾。这是一个常见的误解,它将加密与身份验证混为一谈。

这就是为什么使用 crib 来暴力破解加密的原因,这样就可以区分正确和不正确的加密,查看如何 Bletchley Park打破了德国加密并需要婴儿床。婴儿床是确定解密可能正确/不正确的某种方式。

有时,如果使用了填充,则填充会出现错误,一些(但所有)实现将返回错误。这实际上是一种安全违规行为,它通过填充泄漏信息。这是婴儿床的一种形式。

如果您想验证加密,您将需要提供一些其他方法,例如添加数据的哈希值以进行验证。

关于java - Cipher.doFinal() 在使用无效 key 时不抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34303398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com