知其然,知其所以然。呵呵,有兴趣的人可以看下去,没兴趣的人跳过吧。前几天发过一个帖子,粗略讲了下WEP加密的破解原理。可能很多人看的云里雾里。最近几天因为忙着要准备考研,在复习线性代数和离散数学,学计算机的人都知道,这两门课是计算机的专业基础课,而很多密码学的知识都是建立的数学的基础上的,比如非常著名的非对称加密算法RSA就是建立在大素数分解难题上的。这个不是我们今天要讨论的主题,呵呵,我主要讲的WEP加密的原理和为什么我们抓包就能破解,尽量讲的通俗易懂点。
WEP是链路层的安全机制(关于7层模型,有疑问的,大家自己去百度google)。他的加密过程是这样的。
(1) 客户端计算原始数据包中明文数据(我们记做P)的32位CRC循环冗余校验码,实际上是计算整数检查向量(我们记做ICV),(又一堆专业术语,大家不理解没关系),这两个,也就是P和ICV构成我们要传输的数据(P+ICV),这才是需要加密的真正的明文。
(2) 我们用40位的密钥和24位的初始向量(IV)构成种子密钥(假设我们采用64位加密)。输入到采用RC4算法的伪随机数发生器,生成与我们要传输的明文(P+ICV)等长的随机数,我喜欢把这个称作为真正的密钥(Real Key)。我们输入的种子不同,生成的随机数也是不同的。这个类似于现在很多软件都靠MD5散列来检验有没有被人篡改过。又扯远了。回到正题。
(3) 将我们得到的随机数和传输明文数据(P+ICV)按位进行异或操作(所谓异或操作,就是比较相同位上的数字,如果相同值为0,不同则为1),得到密文(我们记做C),然后将前面的24位初始向量和密文(C)组合在一起,得到要传输的密文(IV+C)。
解密的过程只是个简单的取反。就是AP收到数据后,将得到的(IV+C),分解,提取IV,然后将自己所持有的密钥Key组合在一起,输入到采用RC4算法的伪随机数发生器,得到解密的随机数,实际上和加密的随机数是一样的。然后将解密的随机数和密文(C)做异或操作,就得到了明文(P+ICV);
这么说也许大家看不懂,我觉得例子吧。
假设我们要传输的明文(P+ICV)= 0001101101
与之等长的随机数列(Real Key)= 0111011010
将这两个进行异或操作 得到密文C=0110110111
解密过程就是将密文C和随机数列(Real Key)进行异或操作。得到的就是明文(P+ICV);
接下来就是最最关键的,就是为什么我们能够破解WEP。其实,产生Real Key的RC4算法本身就是有问题的,具体我就不讲了,涉及很复杂的数学知识,有兴趣的自己查资料。我这里要讲的就是我们现在所使用的,就是抓包很多包来破解。
我们来讨论下24位的初始向量,因为这个在密文(IV+C)中是明文传输的,我们可以很方便的得到。2的24次方是16777216。我们现在使用的网络一般是54Mb/s,我们假设传输分组的大小为2000字节,实际比这小,我们计算下 54(Mb/s) / (2000B/包 * 8bits/B) = 3375 包/秒,也就说大概经过16777216 /3375=4971秒,也就是差不多1.3个小时,初始向量就要被全部用光了,就会出现重复。呵呵,如果我们真的等一个多小时才抓到两个IV相同的包,那估计很多人会抓狂了,实际情况远比这个要好。我上面讲的是IV初始为0,然后随着数据包的个数的增加,逐渐按模2的24次方递增,到24位全部用完时,IV又返回为0这么一种情况。然后实际过程中,IV 是在[0,224-1]上随机取的值。
好吧,接下去就是概率的问题了(又是一门专业基础课概率论与数理统计),经过我的计算,在传输4823个数据包后,将会有50%的概率IV会相同,当发送12430个数据包时99%的概率会发生IV相同。也就是4秒钟左右,就会发生IV相同的情况。
假设我们抓到两个IV相同的包(IV+C1)和(IV+C2),因为IV相同,40位的密钥也相同,所以他们产生的Real Key也相同。那么我们可以将密文C1和密文C2进行异或操作,这个值和他们的明文异或操作时相同的。这一点大家可以按照我上面的例子自己算下。这样,如果我们抓到足够的包,也就是随着IV相同的密文数的增多,完全就可以分析出密钥和明文。
关于WEP协议,它犯了密码学中的大忌,就是避免使用线性运算。这里CRC冗余算法和RC4都是线性运算。至于为什么这么说,下次再说吧。呵呵