CBC比特翻转攻击详解
暂且先不讨论CBC模式本身而言在密码学上的安全性。首先看为什么不能直接使用块加密例如:AES或者3DES之类的对保密性数据进行加密。
0x01为什么要使用CBC模式
暂且先不讨论CBC模式本身而言在密码学上的安全性。首先看为什么不能直接使用块加密例如:AES或者3DES之类的对保密性数据进行加密。
以AES为例,我们知道,对于长序列加密的时候,首先是分组成 128 bit,然后分别用给定的K进行加密。那么显然,对一般数据而言,如果两个分组恰巧值相同,那么加密结果必然相同,如果值不同,加密结果在很大的可能上不同。
具体可以看如下这个图片的数据加密前后的对比图:
很显然,图片很直观地反映出了这种加密方式的弊端 —— 存在某种程度的信息“暴露”。图片加密之后依旧能依稀辨认出那是一张短头发人的照片。所以说,CBC加密模式应运而生。(实际上,没有采用计数器或者随机值介入,这种确定性加密在面对选择明文攻击的时候是不安全的)
0x02什么是CBC加密模式
这一点当然还是用图片最形象了:
可见,这个时候每一个分组在加密之前,都先与前一个分组密文结果进行异或,从而“打乱”原来的信息。而解密则是与其类似,只不过运算块变成了解密,且先解密后再与前一组密文异或,从而还原出明文。这样就避免了之前所提到的问题。但是,如果你仔细想一想就会发现,如果攻击者可以修改密文的话,那就会出现很大的问题。
具体如下图所示:
假设明文块序列用 $( P )$ 表示,密文块序列用 $( C )$ 表示(参看图2: CBC 加密模式图解),块分组运算出来(用来与前一分组的密文执行异或运算)的序列用 $( D )$ 表示(参看图3:CBC-bit 反转攻击图解),流程中可控的内容如 $( x )$ ,通过撇号标识为 $( x' )$ 以示区分,攻击思路如下:
现假设要通过攻击改变的明文块为 $( P_{i+1}' )$
解密时很明显有(注意标识,参考上图红色标识):
$$ P_{i+1}' = C_i' \oplus D_{i+1} $$
由加密过程已知(参看上面 CBC 加密模式图,块分组运算模块送入和送出的内容相同):
$$ D_{i+1} = C_i \oplus P_{i+1} $$
由上两式子可得(同样,注意标识):
$$ P_{i+1}' = C_i' \oplus C_i \oplus P_{i+1} $$
注意分辨 $( C_i )$ 与 $( C_i' )$ ,前者表示加密过程中该块的密文结果,后者通过撇号标识表示被攻击的解密过程中可控的密文块。当然,在正常情况下,没有受到攻击,两者相等,解密无误。
现在假设密文我们可以随意修改,即解密时密文块可控(这种假设是符合网络攻击时的具体情况的),那么,若将 $( C_i' )$ 修改为 $( W \oplus C_i )$ (回忆上述内容,撇号只是标识可控,这是敌手可以做到的),此时有:
$$ \begin{split} P_{i+1}' &= W \oplus C_i \oplus C_i \oplus P_{i+1} \\ &= W \oplus P_{i+1} \end{split} $$
由此可知,可以做到随意修改 $( P_{i+1}' )$ ,因为 $( W )$ 可以随便设。例如要把明文分组 $( P_{i+1} )$ 处的 $( A )$ 换成 $( B )$ ,那么,把 $( C_{i}' )$ 替换成 $( C_i \oplus A \oplus B )$ 即可。此时有:
$$ \begin{split} P_{i+1}' &= C_i \oplus A \oplus B \oplus C_i \oplus A \\ &= B \end{split} $$
可见,达到了攻击的效果。
0x03具体应用
上面说的自己都感觉复杂了,主要还是在于自己表述能力不行,其实仔细看图还是比较好理解的。 CBC 比特翻转攻击的具体应用也是有的,此刻时间比较晚了,再加上篇幅所限就不挤在这篇文章了,回头另外写一篇把链接贴过来。
Update:2015/11/15
之前说要写的具体应用例子已经写了,传送门: CBC比特翻转攻击应用实例
- ⇦ 没有了
- CBC比特翻转攻击应用实例 ⇨
这尼玛有点高深啊~