如何用已知的IV解密AES / CBC

时间:2010-07-12 03:08:34

标签: java aes encryption

我无法解密从客户端发送的AES / CBC加密数据包。我做了大量的研究,让我相信如果IV是静态的,加密是不安全的。具体来说,对于此任务,IV始终静态设置为0.有什么办法可以做到这一点吗?

修改 纯文本是哈姆雷特剧本的片段。客户端以随机块的形式发送它们,因此长度甚至不一致。数据包可能最终重复,但我不是百分百肯定。

4 个答案:

答案 0 :(得分:3)

不是没有钥匙。

具体来说,假设没有填充,每次使用相同的IV时出现的漏洞是,如果您开始加密上次加密的相同数据,您将同时获得相同的加密字符串。这允许攻击者推断出有关消息内容的内容,但它无法帮助他们解密它。

答案 1 :(得分:2)

仅用于表示法,术语"解密"表示使用密钥的正常操作。如果你没有钥匙,这通常被称为"打破","破解"或者"密码分析"。

具有固定初始化向量的CBC具有以下特性:具有相同起始块的消息(使用相同密钥加密)也将在密文中显示相同的起始块......这是唯一的弱点。因此,如果您可以让受害者对您的消息加密(使用相同的密钥),您可以将其密文与您正在使用的消息中使用的密文进行比较。

当消息具有某种固定格式时,这会更容易,如果消息在有趣的部分之前包含足够的随机数据(这是"穷人的初始化矢量"),则会毫无意义。

其他CBC弱点依赖于选择的密文攻击,您选择初始化向量并观察其解密的一些验证可能也适用(您可以设置第一个密文块并观察第二个块是否具有有效的填充)。 / p>

答案 2 :(得分:1)

非随机IV的主要问题是使用相同密钥加密的两个相同的初始块将产生相同的输出。所以,鉴于你对哈姆雷特的描述,知道你反复使用相同的IV,我会做以下事情:

  • 我会为各种可能的密码(可能由John the Ripper生成)计算“To be or to to”(16字节)的密文。
  • 我会将得到的cipertext与所有消息进行比较,前提是它们可能以这16个字节开头。
  • 如果匹配,我知道密码。完成。

我会对其他几个众所周知的短语做同样的事情。这是一个我可以大规模并行执行的操作,甚至在我捕获文件和缓存到数据库之前。此方法的一般术语是rainbow table

如果我碰巧知道邮件的前16个字节(例如,如果他们是向已知人员发送电子邮件,或者使用已知邮件的HTTP请求等),我的工作就会变得更容易。

但是如果你使用随机密钥(或者像PBKDF2那样合适的KDF)呢?好吧,假设我收到了一些消息,至少其中一些消息具有相同的前16个字节(同样,协议中的标题对我有很大帮助)。那么,第一步是我知道这些消息具有相同的前16个字节。这是非常有用的信息。现在我有一个crib来攻击你的消息。

在CBC中重用IV + Key并不会完全破坏其安全性(因为在CTR模式下重用Nonce + Key会这样做)。但它为攻击者提供了许多有助于简化攻击的有用工具。

我并不是说任何这些都可以让你在很短的时间内解密你的特定密文。但它们都强烈地降低了所谓的AES加密技术。

答案 3 :(得分:0)

零IV可以泄漏有关数据的第一个字节的一些信息,但是,如果它们不同,这不应该是一个问题(但是,不建议使用)。 例如,在某些情况下,OpenPGP使用零IV。