**
原理:
**
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运算的末尾处设置我们自己的值,即可改变。