假设我有三条消息被 AES-128 加密,每次都使用相同的密钥和 IV。是否可以解密正在使用的密钥?更重要的是,是否可以解密这些消息的明文?
使用相同密钥和 IV 时的 AES 解密
此处发生的情况取决于操作模式。作为基本规则,消息的知识不允许您重新计算密钥本身,但它可能会为您提供足够的信息来(立即)破解使用相同密钥和 IV 加密的任何其他消息。
在 CTR 模式下,通过对计数器的连续值进行加密来生成依赖于密钥的流,并且计数器从 IV 中给出的值开始。实际的数据加密是通过将此流与要加密的数据进行异或运算来执行的。如果使用相同的密钥和 IV,那么您将获得相同的流,因此您处于(不)著名的两次 pad的条件下。在不知道密钥的情况下,您仍然可以通过利用它们的内部结构来计算任意两条消息的 XOR,这通常足以破解它们。一旦知道其中一条消息,这将显示依赖于密钥的流(直到消息长度),这允许立即解密使用相同密钥 + IV 加密的任何其他消息(直到该长度)。
OFB 模式的情况类似:它产生一个依赖于密钥的伪随机流。所以它可以像点击率一样轻松地破解。
使用 CBC 模式,对于攻击者来说,事情会变得有些困难。如果消息以相同的字节开头,那么您将能够看到它。在第一个不同的字节之后,解密变得更加困难。这是因为实际上,CBC 加密中的每个块都用作消息其余部分的 IV,并且使用块密码加密数据往往会为 CBC 生成正确分布的 IV。通常,CBC 需要一个统一随机的 IV,这是攻击者无法预测的,但在您的情况下,您设想的是一个被动攻击者,并且针对这样的对手,通过加密已知数据块选择的 IV 对 CBC 来说足够好,只要因为 IV 源没有被重复使用;这是您从消息中获得的,从消息不同的第一个块开始。
CFB 模式介于两者之间。如果两条消息以相同的n字节开头,则加密的消息也将以相同的n字节开头;然后,对于包含第n+1个字节的块的其余部分,这是两次填充。对于后续字节,流已经分叉并且攻击者的电源停止。
重要提示:尽管上面的段落似乎表明,只要您在每条消息的标题中包含一个计数器,CBC 或 CFB 对于密钥+IV 的重用是安全的,但请记住,这仅适用于被动攻击者。在许多(大多数)情况下,攻击者还可以在要加密的消息中嵌入他自己的一些数据,和/或更改加密字节并查看解密时会发生什么。对于这些现实的场景(最近的许多攻击 SSL都是关于此的),IV 重用,甚至是可预测的 IV 选择(使用 CBC),都非常弱。不要重复使用 IV。
唯一可以使用固定 IV 的情况是密钥从不重复使用,即每个密钥仅用于单个消息。在实践中,这比每条消息的新 IV 更难获得,因为密钥必须保密:拥有发送方和接收方都知道但其他人都不知道的密钥已经是一个挑战。至少,IV 没有这种保密要求,因此可以与消息本身一起传输。
对多条消息使用相同的 IV 和密钥不会危及密钥,但它确实使攻击者更容易获得纯文本。它如何做到这一点取决于所使用的操作模式。
如果操作模式是流密码(例如计数器模式或 OFB),那么对两条消息使用相同的 IV 和密钥就像对两条消息使用相同的“一次性密码” - 攻击者可以获得消息的 XOR通过简单地对加密消息进行异或运算。对于有能力的攻击者来说,这应该是足够的信息来获得明确的消息。有关更多详细信息,请参阅利用一次性键盘键重用?.
但即使操作模式不是流密码(例如 CBC),重用相同的 IV 和密钥也会泄漏有关消息的信息 - 例如,如果它们以相同的数据开头。
所以规则是 - 不要重复使用 IV。