实验五:Padding Oracle 攻击
一、问题描述:
理解 padding oracle 攻击的过程,验证攻击的可行性。
当用户 Alice 和网站进行交互时,网站将上述 URL 发送给 Alice。攻击者猜测在"po?er="这一 URL 变量的值可能 Alice 会话中的一个一些秘密数据。该数据使用 AES CBC(随机初始向量加密)模式进行加密并将加密结果使用hex 进行编码。攻击者发现上述网站存在 padding oracle 攻击:当解密的CBC 密文出现填充错误时,网站服务器返回 403 错误(forbidden request),当 CBC 填充合法,但是 MAC 验证失败时,网站返回 404 错误(URL not found)。
二、实验环境:
系统:Windows 10
IDE:pycharm
编译语言:python
三、程序代码与结果分析:
(1)问题分析
Padding Oracle 攻击是一种针对使用 padding 方式进行加密的系统的攻击方法。该攻击利用了系统在解密密文时会对密文进行解密、解密后进行 padding 验证的过程。攻击者可以通过向系统发送多次密文,逐步猜测出密文中的每个字节,并利用 padding 验证的结果来确定猜测的是否正确,最终破解密文。
在本实验中,我们使用了一个 Padding Oracle 来进行攻击。Padding Oracle 的实现方式是,当系统收到一个密文后,首先会解密该密文,然后对解密后的明文进行 padding 验证,如果验证失败,则返回 404。
我们可以通过构造不同的密文并发送给系统来逐步猜测出密文中的每个字节,并利用 padding 验证的结果来确定猜测的是否正确。
(2)实现步骤
首先,我们需要得到一个密文,这里我们使用了给定的密文 。
然后,我们需要构造一个 Padding Oracle 来进行攻击。在本实验中,我们使用了一个 Python 类 oraclePadding 来实现 Padding Oracle。
将加密后的密文分为若干个32字节的块,其中最后一个块作为当前待解密的块。
对于每个待解密的块,枚举该块中每一个字节的可能取值,然后构造一个新的IV和密文,并向Padding Oracle发送请求,查询是否存在解密失败的情况。
在猜测一个字节的值时,需要依次枚举该字节可能的取值,并将该值与前面已经猜测出来的字节的值进行异或,以得到中间结果。然后,将中间结果与当前的padding值进行异或,得到当前待猜测的IV。
对于每次发送的请求,如果返回404,则说明猜测的IV是正确的,我们继续猜测下一个字节;否则,说明猜测的字节值是错误的,需要重新猜测上一个字节的值。
当我们猜测到一个字节的值后,我们需要将其记录到当前块的中间结果中。
如果我们猜测的IV最终无法通过Padding Oracle验证,则说明我们之前猜测的IV是错误的。我们标记猜错的位置,然后退出循环。
对于每个猜测出的字节,将其与上一个块的对应位置进行异或操作,然后将结果添加到解密出的明文中。
当所有块都解密完毕后,得到的明文即为原文。
同时,因为会出现猜测256次之后都没有结果,所以会出现错误情况,我们把出错的位置统一标记为_以便区分。
(3)实验结果
可以看到部分密文被解密成功了,但是出于不知为何的情况,会有无法解密的部分。
相关资源
https://download.csdn.net/download/dxxmsl/87761397?spm=1001.2014.3001.5503