WEP安全性能研究及其攻击
上述第一个条件意味着输出的每个比特依赖于加密密钥所有比特的值。密钥中任意比特值的改变均有1/2的几率影响到输出的每一个比特。如果满足此条件,那么,破解此加密需要尝试所有可能的密钥值,输出值同加密密钥之间几乎不存在任何联系。
如果上面的条件得不到满足,那么就可被利用来对其进行攻击。举例来说,假设输出的某8个比特仅仅依赖于加密密钥的某8个比特,那么就可以简单地进行对此8比特密钥的所有可能值进行尝试,并与实际输出相比较获取此8比特密钥的值,这样就大大降低了穷举攻击所需的计算量。
因此,如果输出以比较高的概率由密钥的某些比特所确定,那么此信息就可被利用来对此流密码进行攻击。
第二个条件意味着即使已知两个加密密钥之间的联系,也无法得出PRNG输出之间的联系。此信息也可用来降低穷举攻击的搜索空间,从而导致加密强度的降低。
RC4算法属于二进制异或流密码,相同的密钥总是产生相同的PRNG输出。为解决密钥重用的问题,WEP中引入了初始化向量IV(Initialization Vector)。初始化向量为一随机数,每次加密时随机产生。初始化向量以某种形式与原密钥相组合,作为此次加密的加密密钥。由于IV并不属于密钥的一部分,所以无须保密,多以明文传输。虽然初始化向量的使用很好地解决了密钥重用的问题,然而,Fluhrer S等人在文献2中指出:初始化向量的使用将导致严重的安全隐患。
下面详细地讨论本文所提出的KSA攻击方法。
2 KSA攻击
本文着重讨论WEP中所采用的RC4算法,即前附加初始化向量IV的RC4算法。
2.1 KSA
考虑KSA,注意到唯一影响状态表的是交换操作。因此,状态表的每个元素至少交换一次(尽管有可能同它自己交换)。假设j是一个均匀分布的随机数,那么,考虑状态表中某一个特殊元素,在所有初始化期间j都不指向此元素的概率为:
P=(255/256)∧255≈37%
(指数为255是因为当index2和counter相等时可以忽略)
这意味着有37%的概率某一特定元素在初始化期间仅交换一次。
由此可看出:
给定一密钥长度K(bytes),如果E<K,那么元素E有37%的概率仅在i指向它时被交换。
那么由RC4的KSA 算法可看出仅K[0]....K[E-1],和K[E]影响它。这只是近似估算,因为index2不可能是均匀分布。
为利用上述结果,需要确定状态表最可能的值。因为每个元素至少交换一次(当counter指向它时),所以有必要对交换可能带来的影响加以考虑。交换是令人讨厌的非线性操作,难于分析。然而当处理状态表前几个元素时,某个具体元素有很高的概率没有参与它前面的几次交换,因此还保留初始值(S[X]=X)。
相似地,仅处理状态表中前几个元素时,即i比较小时,S[j]有很高的概率等于j。因此,可以得到:
状态表中元素S[E](E比较小时)最可能的值为:
javascript:window.open(this.src);" style="cursor:pointer;"/>
注意,本文中两个元素操作均为模256操作。
基于以上分析,可以计算出状态表中各个元素满足B的概率。为统计状态表中元素满足上式的概率,采用8比特RC4算法进行实验。下面为100000次实验中S[E]中前48个元素满足上式的概率:
Probability %
0~7 37.0 36.8 36.2 35.8 34.9 34.0 33.0 32.2
8~15 30.9 29.8 28.5 27.5 26.0 24.5 22.9 21.6
16~23 20.3 18.9 17.3 16.1 14.7 13.5 12.4 11.2
24~31 10.1 9.0 8.2 7.4 6.4 5.7 5.1 4.4
32~39 3.9 3.5 3.0 2.6 2.3 2.0 1.7 1.4
40~47 1.3 1.2 1.0 0.9 0.8 0.7 0.6 0.6
结果表明,经过KSA后,状态表中前面的一些元素实际值与用B所预测出的值强相关。
2.2 弱密钥
首先定义it,jt分别为KSA算法经过t步后相应的两个计数器的值,St为KSA经t步后状态盒的状态。从其流程可以看出,PRNG首字节输出仅仅依赖于状态盒S中的三个值:S[1]、S[S[1]]和S[S[1]+S[S[1]]]。如果此三个值为已知,那么就可以完全确定PRNG的首字节输出。
KSA经过i步操作后(i>1),设Si[1]=X,S[X]=Y,假设j为均匀分布的随机数,那么S[1],S[X],S[X+Y]均不参与剩余交换的概率约为e-3≈0.05,此时RC4的首字节输出为S[X+Y]。
假设IV的长度为I个字节,IV附加在密钥Key前面组成加密密钥K,即K=IV|Key,且我们已知K中前B个字节的值(初始化时