我没有得到的是如何一次更改一位允许一个人利用(获取密钥)ASP.NET计算机。
有人可以解释吗?
#1 楼
定义/简介我们定义(仅用于示例):
$ enc()$和$ dec()$作为使用CBC模式并带有恒定密钥的加密和解密功能。
$ \ oplus $是XOR运算。
字节为$ 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
评论
欢迎使用加密堆栈交换。您的问题已转移到这里,因为它主要是关于密码学的理论基础,而不是密码学的应用(这将在Security Stack Exchange上讨论)。请在两个站点(使用相同的邮件地址)上注册您的帐户,以重新获得问题的所有权,并能够对其进行编辑,评论和接受答案。实际上,填充oracle攻击不允许进行密钥恢复,而只能进行纯文本恢复。 (当然,如果明文包含密钥,则可以获取此密钥。)
我假设您已经阅读了相关论文?如果不是,则应先阅读它们,然后发布特定问题。
对我来说,使事情开始有意义的文档是hax.tor.hu/read/aes ..如果您还没有的话,可能不妨看看。
这是一篇博客文章,清楚,详细地说明了填充攻击的工作原理:blog.skullsecurity.org/2013/padding-oracle-attacks-in-depth