首先了解下什么是CBC。
CBC全称Cipher Block Chaining模式(密文分组链接模式),“分组“是指加密和解密过程都是以分组进行的。每一个分组大小为128bits(16字节),如果明文的长度不是16字节的整数倍,需要对最后一个分组进行填充(padding),使得最后一个分组长度为16字节。“链接”是指密文分组分组像链条一样相互连接在一起。

CBC模式的加密:
加密时,第一个明文分组,需要通过和IV(初始化向量)进行异或处理之后,才可以进行加密处理;每一个明文分组(除了第一个明文分组)加密之前都需要和前一个密文分组进行异或处理之后,才可以进行加密处理。
• 加密过程
• 1.将明文的第一个分组与IV进行异或,送入加密模块进行加密,得到第一个密文分组。
• 2.从第二个明文分组开始,将明文分组与前一个密文分组进行异或。
• 3.将第2步得到的结果送入加密模块进行加密。
• 4.将每一个密文分组拼接起来形成密文。
有公式
CBC字节翻转攻击
如下所示
CBC字节翻转攻击
CBC模式的解密:
第一个密文分组,解密之后,需要通过和IV进行异或处理,才可以得到第一个明文分组;每一个密文分组(除第一个密文分组外)经过解密处理之后,都需要和前一个密文分组进行异或处理,才可以得到对应的明文分组。
• 解密过程
• 1.将密文的第一个分组进行解密,得到的结果与IV进行异或处理,得到第一个明文分组。
• 2.从第二个密文分组开始,先对每一个密文分组进行解密处理,到第3步。
• 3.将第2步得到的结果与前一个密文分组进行异或处理,得到对应的明文分组。
• 4.将每一个明文分组拼接在一块,便得到原先的明文。
有公式
CBC字节翻转攻击
如下所示
CBC字节翻转攻击
具体的实现我们可以使用python的crypto库
文件(1.py
代码如下:
CBC字节翻转攻击

定义了加密和解密的方法,然后在设置好**、初始向量和明文后调用相应的方法进行处理,一共有三个print,分别输出密文,使用**、解密算法解密后的数据,以及明文。
运行结果如图
CBC字节翻转攻击

通过具体的实现,我们不难看出这种模式的特点:前一块的密文会参与运算来产生后一块的密文。CBC字节翻转攻击正是针对这一特点进行。
提出的攻击的思路是:虽然我们不知道**(即代码中的key),但是我们可以通过篡改前一块的密文,来控制最终输出的明文
接下来就看看具体应该如果实现。

此次涉及到计算机中的一个最基础的知识点:异或
异或的算法就不提了,此处主要用到的是下面的公式
若C = A xor B,则有A = B xor C,同样也有B = A xor C
可以动手实验一下
CBC字节翻转攻击
更近一步,有
A xor B xor C = 0
CBC字节翻转攻击
更近一步,可以推出
A xor B xor C xor “任意值“ = 任意值
CBC字节翻转攻击
这其实就是我们提供的攻击思路中,关于如何篡改密文来控制明文的核心

为了便于理解,我们考虑单个字节的操作,则在CBC下存在如下相应的公式
CBC字节翻转攻击
Pnew为我们想要的明文,根据上述理论,我们只需控制前一个密文分组对应的字节为,
CBC字节翻转攻击
就可以达到修改明文的目的。
用文字来说就是,将前一个密文分组中的对应字节篡改为一个值,该值等于“前一个密文分组原来的值 xor 这一个明文分组中对应字节的值 xor 希望控制的解密后的新的明文的值”
在代码中的实现:
在原来代码基础中添加这一部分,关键是第二句,由上述的分析可知,这句代码的功能是控制字符串yalecbcbyteflippingattackdemo233中最后的一个3改为4
CBC字节翻转攻击
运行如图
CBC字节翻转攻击
可以看到字符串最后的3被篡改为了4。
放在具体攻击场景下,是这样子的:攻击者在不知道**的情况下就通过cbc字节翻转攻击,篡改了生成的明文

这时候又有个问题出来了,注意到输出的字符串中部分值成了乱码?
这是为什么呢?这是因为我们篡改了第一组的明文,虽然控制了第二组的明文,但是第一组的明文还是不受控制的(前面说过,第一组明文是在第一组密文解密之后和初试向量异或后得到),由于我们篡改了第一组的明文,所以第一组得到的明文变成了乱码
这时候如果控制乱码的产生呢?我们想一下,第一组明文的产生实际是只和第一组密文和初始向量有关,所以我们再篡改初始向量就可以了。但是在篡改初始向量的同时,得注意不能影响第二个明文分组,也就是说这一次的篡改得把影响控制在第一个分组。
同样基于上面提到的异或的逻辑,假设我们将第一个明文分组全部修改为A,那么初始向量的的值需要被修改为一个值,这个值等于 “原来初始向量的某一字节的值 xor 原来解密后的分组的某一字节的值 xor A”
我们在代码中添加如下代码即可
CBC字节翻转攻击
运行如图
CBC字节翻转攻击
可以看到,成功实现了目的。
总结一下cbc字节翻转攻击的流程:攻击者在不知道**的情况下,通过篡改密文和初始向量,就可以控制输出的明文为自己希望的内容。

分类:

技术点:

相关文章: