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

具体可以看如下这个图片的数据加密前后的对比图:

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

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

解密时很明显有(注意标识,参考上图红色标识):

由加密过程已知(参看上面 CBC 加密模式图,块分组运算模块送入和送出的内容相同):

由上两式子可得(同样,注意标识):