在现实世界中如何实施针对 ECB 的选择明文攻击?

信息安全 密码学 AES
2021-08-25 10:19:32

阅读对 AES 的攻击,我看到了无数关于为什么 ECB 不好的例子,以及我能理解其背后的逻辑,但我无法理解这些攻击在现实世界中的实际运作方式。

因此,我看到经常使用的一个重要示例是使用 AES-ECB 加密的会话令牌,并且作为它的会话令牌(例如 cookie),我们可以重复注入选定的明文并监视密文的变化,假设会话令牌始终使用相同的密钥进行加密。但是我们如何从中推断出正确的明文呢?

例如,假设我注入了 64 个 A 作为我的用户名,并且在返回的 cookie 的十六进制转储中,我可以看到重复的 16 字节块,这非常明确地表明加密是 AES-ECB。我可以将最后的 16 个 A 更改为 15 个 A 的 B,所以我现在不仅知道 16 A 的密文是什么样的,而且知道所有 A 和 B 的密文是什么样的。

但在那之后我被卡住了,我看不出这种攻击是如何扩展成实用的。到目前为止,我所看到的只是我们知道最后一个字节的样子,以及一堆 A。

到目前为止我看到的很好的解释是:https ://vimeo.com/41116595尽管他在 42 分钟左右失去了我,以及http://www.slideshare.net/ceng/cryptography-for-penetration-testers -pdf-版本-演示文稿

编辑:在考虑了这个问题之后,我认为更好的表达这个问题的方法是 - 假设我们控制的块是密文中的任意长度,并且总密文是任意长度,你如何计算长度要注入的前缀(A 的数量),以便您可以破译每个连续的字节?

编辑:上面的编辑形成了对问题的补充,“我们如何计算前缀的长度”实际上是不准确的。我发现计算我们无法控制的密文的前缀长度是微不足道的,正如我所看到的,ECB 攻击旨在破译在所选明文密文之后显式出现的文本。

1个回答

听起来你已经很好地解决了这个问题。我从来没有利用过 ECB 选择的明文,但我最近做了一个 padding oracle 漏洞利用,所以我知道你会如何做到这一点。

基本思想是一次暴力破解一个字节。

假设我们有一个简单的例子,其中没有插入其他数据,所以它只是“[username][secret]”。首先,将您的用户名设置为 16 A。然后将最后一个字符更改为 B。实际上,遍历最后一个字节的所有 256 个可能值,并记录密文。

现在将您的用户名设置为 15 A。明文块将由您的 15 个 A 和一个来自秘密的字节组成。密文将匹配您之前生成的密文之一,并且您可以从中推断出秘密的一个字节。

现在将您的用户名设置为 16 个字符的值:14 个 A,您知道的一个明文字节,然后循环遍历最后一个字节的 256 个可能值。记录所有密文。下一步是将您的用户名设置为 14 A,仅此而已。从生成的密文中,您可以推断出秘密的第二个字节。

继续前进,很快你就会得到完整的秘密!

在实际场景中,可能还有其他因素使利用变得更加困难,但这是基本思想。