我不确定填充oracle攻击的工作原理。

我没有得到的是如何一次更改一位允许一个人利用(获取密钥)ASP.NET计算机。

有人可以解释吗?

评论

欢迎使用加密堆栈交换。您的问题已转移到这里,因为它主要是关于密码学的理论基础,而不是密码学的应用(这将在Security Stack Exchange上讨论)。请在两个站点(使用相同的邮件地址)上注册您的帐户,以重新获得问题的所有权,并能够对其进行编辑,评论和接受答案。

实际上,填充oracle攻击不允许进行密钥恢复,而只能进行纯文本恢复。 (当然,如果明文包含密钥,则可以获取此密钥。)

我假设您已经阅读了相关论文?如果不是,则应先阅读它们,然后发布特定问题。

对我来说,使事情开始有意义的文档是hax.tor.hu/read/aes ..如果您还没有的话,可能不妨看看。

这是一篇博客文章,清楚,详细地说明了填充攻击的工作原理:blog.skullsecurity.org/2013/padding-oracle-attacks-in-depth

#1 楼

定义/简介

我们定义(仅用于示例):



$ enc()$和$ dec()$作为使用CBC模式并带有恒定密钥的加密和解密功能。

$ \ oplus $是XOR运算。
$ n $纯文本块的数量。
字节为$ 16 $(即128位)。

$ m_1 $至$ m_n $纯文本块。

$ c_0 $至$ c_n $密文块,而

$ c_0 $是初始化向量(即这里还有一个块!)。
对于每个块,第二个索引指向该字节,即$ m_ {1,0 } $是纯文本的第一个字节。

$ x_1 $到$ x_n $是中间的解密值,在$ dec()$之后和XOR之前。
符号$ = $用于赋值,双等号$ == $用于比较。

为了解释$ x $的含义,这又是CBC解密公式。对于每个加密块$ c_i $,我们通过以下方式确定$ m_i $:

$ m_i $ = $ x_ {i} \ oplus c_ {i-1} $(和值$ dec(c_0 )$也被命名为$ x_0 $)

对于第一个块,我们使用IV如下:

$ m_0 $ = $ dec(c_0)\ oplus iv $

我建议快速浏览这些图像以进行解密和加密(阅读整个Wikipedia文章也不会受到伤害)。

场景

对于这种攻击,我们需要一个所谓的padding oracle,例如一个Web应用程序。
此填充oracle接受任意密文,并给出有关纯文本无效还是解密失败的不同消息。

让我们想象一下这种填充:

对于所有纯文本,最后一个块被填充为16个字节,如下所示,即the end.\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x08
如果最后一个块为15个字节长,则填充为\x01
如果最后一个块的长度为16个字节,也就是说,消息的长度是16的倍数,则将附加一个15个任意值的块,后跟\x10
这意味着,最后一个块始终填充有从0到15个\xFF字节,直到最后一个字节,这提供了填充的长度。

解密后,现在可以读取最后一个字节,并在末尾切断给定的字节数。等于0且大于16的值无效并返回填充错误。

我们按以下方式定义Oracle:

$$
O(c)= \左\ {
\ begin {array} {ll}
0&\ quad \ text {如果$ c $具有有效的填充,而} \\
&\ quad \ text {解密产生格式正确的纯文本} \\
1和\ quad \ text {如果填充有效,但纯文本} \\
&\ quad \ text {格式不正确(包含\ xFF)} \\
2&\ quad \ text {如果$ c $具有无效的填充} \\
\ end {array} \ right。
$$

Web应用程序期望纯文本为XML(或JSON或其他),并且在解析失败时会报告不同的错误。对于我们的简化方案,我们只说存在一个邪恶字符,纯文本(在删除填充后)不得包含例如\xFF

攻击

要使此攻击起作用,您需要有效的密文$ c $,不需要知道正确的明文值$ m $。

我们将逐个字节地逐块解密。我们从第一个块开始,到最后一个字节。

让我们从头两个密文块开始
$ c_0c_1 $,并将它们发送到oracle。由于$ c_0 $只是IV,因此oracle将获得第一个纯文本块(16字节)。现在,这取决于值,但是填充很可能会出错,因此您将收到填充错误。

现在,通过将值$ j $从\x00\xFF异或到$ c_0c_1 $块的最后一个字节,您将获得总共256个不同结果的集合。这些结果,我们称它们为$ \ tilde {C} _j $,用从\x00\xFF的所有可能值组成最后一个字节的密文-尽管是随机分布的。
将它们全部发送到oracle将产生16其中$ O(\ tilde {C} _j)<2 $。这意味着,最后一个字节解密为有效字节,如\x01 through \x10。 $ j $的这16个值中,一个必须与纯文本字节\x10相对应。按位比较将帮助您注意到,它们都具有相同的第五位(从右边开始计数,最右边是1),除了一位。异常导致对应于0x10的异常。让我们将$ j $的值记为$ s $。

无论$ s $具有什么值,我们都可以将其与\x11进行XOR运算,然后将其生成为纯文本\x01。现在,我们有了一个带有有效\x01填充的块。 (哦,顺便说一句。$ s \ oplus j $是$ c_1 $的最后一个纯文本字节)

现在我们有了一个带有有效\ x01填充的块,我们还有15个字节可以找到
我们知道,每当纯文本中存在无效字节\xFF时,Web应用程序就会停止运行并说出这样的话。
因此,现在,我们可以遍历每个字节并按以下方式查找纯文本:


以$ c $为当前块,以$ p $纯文本结果为$ i $从1到8(块中的每个字节):$ \ quad $ for $ j $从0到255(所有ascii值):$ \ quad $ $ \ quad $ $ \ hat {c} _ {i,j} = c_0c_1 ...(c_i \ oplus j)。 .c_n $$ \ quad $ $ \ quad $如果$ O(\ hat {c} _ {i,j})== 1 $:$ \ quad $ $ \ quad $ $ \ quad $ $ p_i = j \ oplus 0xFF $


使用块对$ c_1c_2 $,$ c_2c_3 $,...重复此过程...免责声明

这是一个简化的示例,我尝试着重说明所有简化之处。我绝不是加密专家,我的知识是有限的。如果您发现任何未提及的简化或常见错误,请评论/编辑:)
我强烈建议您在此博客中阅读有关XML加密填充Oracle的很好的解释。关于该攻击的文章也很不错:Breaking XML Encryption

TODO:这篇文章缺少关于CBC方案为何具有延展性的很好的解释,我不介意是否有一个好的方法。要包含的图形。

评论


$ \ begingroup $
实际上,您的整个攻击根本没有使用AES这一事实-它适用于任何分组密码,仅取决于操作模式和填充方案。
$ \ endgroup $
–PaŭloEbermann
2012年9月11日18:12

$ \ begingroup $
感谢您浏览Pa,lo。我刚刚更改了此设置。
$ \ endgroup $
–freddyb
2012年9月11日19:07在

$ \ begingroup $
@ freddyb,CBC具有延展性,原因如下:如果我在块$ i $中翻转一点,解密块$ i $将是完全不可预测的,但是解密块$ i + 1 $然后用修改后的密文进行异或块$ i $,将在块$ i + 1 $的结果明文中翻转一位。
$ \ endgroup $
–mikeazo
2012年9月19日于14:42

$ \ begingroup $
感谢您对此进行跟进。我的意思是说“这篇文章缺乏很好的解释”;)编辑过。
$ \ endgroup $
–freddyb
2012-09-20 9:54

$ \ begingroup $
抬起头来,我认为“即m0,0是我们纯文本的第一个字节。”应该为“即m1,0是我们纯文本的第一个字节”。
$ \ endgroup $
–泰勒·弗莱明·克鲁蒂尔(Tyler Fleming Cloutier)
2014年3月6日在5:16

#2 楼

所有详细信息已发布在2011年IEEE安全和隐私研讨会上的论文中:网络密码学:ASP.NET中密码学设计的缺陷