802.11 WEP 的安全体现在2个部分, 分别是 认证 和 数据加密.
客户连接端连接到访问点之前都要经过 认证(Authentication) -> 关联(Association) 2个阶段.
即使是没有密码的访问点 (open network), 也需要 (Authentication)阶段: 客户连接端发出一个 Authentication request frame, 访问点返回一个 success Authentication response frame.
使用 WEP 加密的网络, 认证过程:
- 客户连接端发送一个认证请求消息
- 访问点回应一个挑战请求消息
- 客户连接段使用密码产生挑战请求答案消息
- 访问点回应成功接受或拒绝接受
这里的挑战请求可以理解为: 访问点发送一个随机字符串, 连接端使用密码去加密这个字符串, 发给访问点, 访问点用自己的密码也去加密, 对比结果.
以上这个过程并不能证明, 访问点就是真的访问点, 它只是发送一个随机字符串, 连接客户端就使用它的加密方法, 把结果给访问点了. 如果我们把加密方法虚拟为这个公式: 加密后字符 = 加密方法(随机字符串, 密码), 那么一个真正的访问点, 这3个数据都有, 一个假的访问点, 就有了: 加密后的字符 和 随机字符串, 如果公式是可逆的, 那么这个假的访问点就能推导出 密码了.
事实上, 大多数 WIFI 都没有使用密码认证, 而是设为 open network, 等 Association 之后, 进行加密数据传输.
后来, 很多厂家的 WEP 产品都 弃用 了认证阶段.
WEP 加密使用的是 RC4 算法.
WEP 最初的标准只能使用 40bit 的KEY, 后来厂家基本都扩展到104bit, WIFI 最后也接受了这个长度, 最后变成40~104 bit.
WEP 的密码是 40 ~ 104 bit, 也就是5 ~ 13 个 ASCII 码可打印字符. 另外有24 bit 的 Initialization Vector (IV), 每个包都使用不同的 IV. 这就是组成了128 bit 的加密强度.
RC4 使用上面 128 bit 的组合 Key 来对数据进行加密.
即使是一样的明文, 由于每个包使用不同的 IV , 所以生成的密文也不一样.
但是这个 IV 对于连接的另外一方, 却不知道, 所以它要传给对方, 并且是明文传过去的, 这样对方才能用它 加上自己的密码去解密.
由于IV 只有24bit, 24bit的可能值只有16777216个, 所以有大量的数据, 这个很快就会被遍历一遍.
在WEP 标准种有2种 WEP key, 分别是 Default Key(s) 和 Key mapping key(s)
Default Key(s): 所有的客户连接端和访问点都有共同的一个或一组key(最多4个, 多个是为了在key change 过程中使用);
Key mapping key(s): 每个客户连接端使用不同的key, 访问点有个key mapping 列表, 同时有个default key 用来广播什么的, 现在几乎没有厂商使用这种了.
你应该了解为什么当时WEP 标准对于 Default Key(s) 使用了4个key?
1) 发送和接收使用不同的key -> 2 个;
2) 当发生key 改变的时候 -> 2个.
当然你用一个key 也是完全可行的.
ICV: Integrity Check Value
MAC : Media Access Layer
MSDU :(MAC service data unit)
加密之前的数据用 ICV, 加密之后的数据frame 用CRC (cyclic redundancy check)
数据从TCP/IP 层进入到 链路层之后, 在物理层发出去之前的过程:
- 计算 ICV, 追加到数据之后
- 产生 IV, 和 WEP key 组合在一块(WEP 可能是多个当中选一个)
- 初始化 RC4 加密引擎, 进行加密
发出的数据 : MAC header | 24bit IV | 8bit Key Id | 加密后的 (data + ICV) | CRC
更多关于 MAC header 的图例, 可以google 一下, 里面有个bit 是用来标明是不是 WEP 加密的.
由于 RC4 的线性流加密, 由于前几个可猜测的字节, 由于弱的IV, WEP 可以在有一定样本数据的情况下被破解.