CBC字节翻转

**

原理:

**

CBC模式:Cipher Black Chaining mode(密码分组链接模式)

CBC模式进行加解密是都需要一个随机初始向量iv,在第一轮进行加解密是都需要与iv进行xor的。
1.加解密过程

0x01:加密过程如下图(来自《图解密码技术》一书)
在这里插入图片描述0x02:解密过程(来自《图解密码技术》一书)
在这里插入图片描述

CBC模式的加密过程主要分为这几步:

1. 将明文分为若干组(16个字节为一组),最后一组不足则用特殊字符填充

2.生成一个初始向量iv和密钥

3.用iv与第一组明文异或(iv只影响第一组生成的密文)

4. 然后再用前n组密文与后n+1组明文异或生成第n+1组密文,以次重复

5.最后将生成的密文拼接起来,就成了最终密文
CBC模式的解密过程主要分为这几步:

1.将密文分组

2.用iv与第一组密文xor,解密得到第一组明文

3.用第n组密文与第n+1组密文xor,解密得到第n+1组明文,以此类推

4.将各组的明文拼接在一起就是最终要得到的明文了

这里注意一下:解密的时候前一组密文只影响后一组明文的结果,而不会影响其他组明文的结果,由图也可看得出,这个也是进行攻击的重要之处。

2.CBC字节翻转攻击:

我们需要改变前一组密文的一个字节,然后与下一组的密文异或,我们就可以得到一个不同的明文了,从而就能达到攻击的效果。如图:
在这里插入图片描述

举个例子:

我现在有个明文序列:helloworld,现在我以它2个字节为一组进行分组(一般是16个字节为一组,但是这里为了方便起见就以2个字节为一组了)

第一组:he

第二组:ll

第三组:ow

第四组:or

第五组:ld

现在我想把第三组 “ow”中的o翻转为x,那么我们就需要改变第二组的密文从而改变第三的明文

phaintext=“helloworld”

enc=encrypt(phaintext)

enc1=chr(ord(enc[5]) ord(“o”)ord(“x”)) #enc[5]即是与“o”相同比特位的密文,也就是说第三组只有"o"这个比特位受影响,而“w”不受影响

result=decrypt(enc1)

这里注意一下:任何字符与本身xor都是为0,任何字符与0xor都为本身,如A xor A=0,A xor 0=A

**

CBC翻转攻击方法的精髓在于:

**

通过损坏密文字节来改变明文字节。(注:借助CBC内部的模式)借由此可以绕过过滤器,或者改变用户权限提升至管理员,又或者改变应用程序预期明文以尽猥琐之事。
在这里插入图片描述
Plaintext:待加密的数据。
IV:用于随机化加密的比特块,保证即使对相同明文多次加密,也可以得到不同的密文。
Key:被一些如AES的对称加密算法使用。
Ciphertext:加密后的数据。

在这里重要的一点是,CBC工作于一个固定长度的比特组,将其称之为块。在本文中,我们将使用包含16字节的块。

整个加密的过程简单说来就是:

首先将明文分组(常见的以16字节为一组),位数不足的使用特殊字符填充。
生成一个随机的初始化向量(IV)和一个密钥。
将IV和第一组明文异或。
用密钥对3中xor后产生的密文加密。
用4中产生的密文对第二组明文进行xor操作。
用密钥对5中产生的密文加密。
重复4-7,到最后一组明文。
将IV和加密后的密文拼接在一起,得到最终的密文。

从第一块开始,首先与一个初始向量iv异或(iv只在第一处作用),然后把异或的结果配合key进行加密,得到第一块的密文,并且把加密的结果与下一块的明文进行异或,一直这样进行下去。因此这种模式最重要的特点就是:前一块的密文用来产生后一块的密文。
在这里插入图片描述这是解密过程,解密的过程其实只要理解了加密,反过来看解密过程就也很简单了,同样的,前一块密文参与下一块密文的还原。

从密文中提取出IV,然后将密文分组。
使用密钥对第一组的密文解密,然后和IV进行xor得到明文。
使用密钥对第二组密文解密,然后和2中的密文xor得到明文。
重复2-3,直到最后一组密文。

这幅图是我们进行翻转攻击的原理图:
这里可以注意到前一块Ciphertext用来产生下一块明文,如果我们改变前一块Ciphertext中的一个字节,然后和下一块解密后的密文xor,就可以得到一个不同的明文,而这个明文是我们可以控制的。利用这一点,我们就欺骗服务端或者绕过过滤器。

具体怎么翻转呢,因为涉及到异或,这里稍微介绍下异或的概念:

当我们的一个值C是由A和B异或得到
C = A XOR B
那么
A XOR B XOR C很明显是=0的
当我们知道B和C之后,想要得到A的值也很容易
A = B XOR C
因此,A XOR B XOR C等于0。有了这个公式,我们可以在XOR运算的末尾处设置我们自己的值,即可改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值