暂且先不讨论CBC模式本身而言在密码学上的安全性。首先看为什么不能直接使用块加密例如:AES或者3DES之类的对保密性数据进行加密。

0x01为什么要使用CBC模式

暂且先不讨论CBC模式本身而言在密码学上的安全性。首先看为什么不能直接使用块加密例如:AES或者3DES之类的对保密性数据进行加密。

以AES为例,我们知道,对于长序列加密的时候,首先是分组成 128 bit,然后分别用给定的K进行加密。那么显然,对一般数据而言,如果两个分组恰巧值相同,那么加密结果必然相同,如果值不同,加密结果在很大的可能上不同。
具体可以看如下这个图片的数据加密前后的对比图:

加密对比图

很显然,图片很直观地反映出了这种加密方式的弊端----存在某种程度的信息“暴露”。图片加密之后依旧能依稀辨认出那是一张短头发人的照片。所以说,CBC加密模式应运而生。(实际上,没有采用计数器或者随机值介入,这种确定性加密在面对选择明文攻击的时候是不安全的)

0x02什么是CBC加密模式

这一点当然还是用图片最形象了:

CBC加密模式图解

可见,这个时候每一个分组在加密之前,都先于前一个分组进行异或,从而“打乱”原来的信息。而解密则是与其类似,只不过运算块变成了解密,且先解密再与前一组密文异或,从而还原出明文。这样就避免了之前所提到的问题。但是,如果你仔细想一想就会发现,如果攻击者可以修改密文的话,那就会出现很大的问题。

具体如下图所示:

CBC-bit反转攻击图解

假设明文块用P表示,密文块用C表示,解密出来异或之前用D表示,攻击思路如下:
  假设现在要改变的明文块P(i+1)
  解密的时候显然P(i+1) = C(i) ^ D(i+1)
  而由加密过程,显然有如下等价关系: D(i+1) = C(i) ^ P(i+1)
  现在假设密文我们可以随意修改,那么:
  修改C(i)为? ^ C(i)
  那么 P(i+1) = ?^C(i)^C(i)^P(i+1) = ? ^ P(i+1)
  那么显然,可以做到随意修改P(i+1)
  例如要把明文分组(这里为讨论方便,假设分组就是一个字节)P(i+1)处的”7”换成”A”,那么,把C(i)替换成C(i)^‘7’^‘A’即可
  此时,P(i+1) = C(i)^‘7’^‘A’^C(i)^‘7’ = ‘A’
  从而达到了攻击的效果。

0x03具体应用

上面说的自己都感觉复杂了,主要还是在于自己表述能力不行,其实仔细看图还是比较好理解的。这个的具体应用也是有的,此刻时间比较晚了,再加上篇幅所限就不挤在这篇文章了,回头另外写一篇把链接贴过来。

Update:2015/11/15

之前说要写的具体应用例子已经写了,传送门: CBC比特翻转攻击应用实例