Temporal Key Integrity Protocol (TKIP) 临时秘钥完整性协议
TKIP 是用来解决 WEP 容易被破解而提出的临时性加密协议,它并不是 802.11 推荐的强制加密协议,简单来说,TKIP 主要是用来加强 WEP 加密,这个升级主要体现在算法上,这一点很重要,为什么这么说呢?因为使用 TKIP 加密,并不需要进行硬件的升级,也就是说只要你的硬件支持 WEP 加密,那么同时也能够支持更安全的 TIKP 加密,同过软件升级来达到安全系数提高的目的,这种做法更加的平滑,也更容易被市场接受。
但是 CCMP 不同,它必须要更新的硬件支持才能使用,所以 TKIP 成了从 WEP 过渡到 CCMP 的中间产物,按照标准来说,如果你的设备可以用 TKIP 加密,就不要用 WEP 加密,如果可以支持 CCMP 加密,就不要用 TKIP。所以在了解 CCMP 加密前,我们有必要先了解一下 TKIP。
基于 WEP,TKIP 主要做了以下改动:
(1)发送端会使用加密算法计算一个 MIC(message integrity code,消息完整码),这个 MIC 是通过计算 SA,DA,priority 和 plaintext data 而来,TKIP 会将 MIC 追加到 MSDU 的后面,如果 MSDU + MIC 的 size 过大,需要分片,那么只要将 MSDU + MIC 看成一个整体 MSDU‘进行分片就好了。也就是说,TKIP 只要在 MSDU 进行分片前将 MIC 追加到 MSDU 后面,形成一个新的 MSDU 就好了,分片的事,它不管, 那是 MPDU 的事情。接收端收到 MPDU 分片以后,会先将它们重组成一个 MSDU,然后进行 MIC 的校验。
(2)TKIP 虽然包含了 MIC,但仍然不够,所以 TKIP 实现了 countermeasures 功能,它可以限制可能的伪装和学习被攻击的信息
(3)TKIP 使用一个 per-MPDU TKIP sequence counter (TSC) 来理顺 MPDUs 的发送,如果接收端收到的 MPDUs 不符合顺序(比如序号没有递增),那么将会被丢弃.TKIP 会像 WEP IV 和附加 IV 一样 对 TSC 进行编码。
(4)TKIP 使用一个密码混合功能,结合 TK,TA 和 TSC 生成一个 WEP seed。
下面我们来看一下 TKIP 加密的流程图:

TSC0-TSC5: 他们是由 TSC 派生而来的,在 TKIP 中有一个 TSC 计数生成器,它会为每一个 MPDU 递增的生成一个 6 字节的 TSC 序列号,TSC0-TSC5 则分别代表其中的每个字节 TK(temporal key):临时密钥,它是从 PTK 或者 GTK 派生而来的,而 PTK 也就是相当于 WEP 加密中的由 SSID 和 pairewise 计算出来的 keyplaintext MSDU: 未加密的 MSDU,也就是要发送的 playload
MIC Key: 它是从 TK 中取出来的指定位,文档中规定
A STA shall use bits 128–191 of the temporal key as theMichael key for MSDUs from the Authenticator’s STA to the Supplicant’s STA.
A STA shall use bits 192–255 of the temporal key as the Michael key for MSDUs from the Supplicant’s STA to the Authenticator’s STA.
关于 802.11 的 MAC 有 4 个,分别是 DA(destination address),SA(source address),RA(receiver address),TA(transmitter address), 他们在报文中的对应关系是如下:
(BSSID 可以看作是 AP 的 MAC 地址,在基础结构型结构中它往往是 TA)

TA(Transmit Address): 一般是指 AP 的 mac 地址
SA(Source Address): 指发送端的 mac 地址
DA(Destination Aaddress): 指接收端的 MAC 地址
从流程图来看,其实 TKIP 相对于 WEP 主要是多了左半部分,右半部分的内容其实大同小异;从 MPDU 的内容来看,主要多了 extender IV 和 MIC 两个部分。下面是基本过程:
(1)MIC 是用来弥补 WEP 不能够抵御伪装攻击、位翻转攻击、分片攻击、重定向攻击和模仿攻击。这里需要先区分一下 MIC 算法和 MIC 码,MIC 算法是 Michael 算法的别名,MIC 码是 message integrity code 的缩写,两者不要混淆。MIC 码是使用 destination address (DA), source address (SA), MSDU priority, and the entire unencrypted MSDU plaintext data 这些参数,通过 Michael 算法计算的出来的结果。当生成 MIC 后,TKIP 算法会将它追加到 MSDU payload 后面。
MIC 的长度是 8 个字节,分别被标记为 M0-M7,MIC 只有 20bit 能够起到安全作用导致它很容易受到 brute-force 攻击,所以 802.11 标准定义了 TKIP countermeasures 程序:
关于 MIC 的计算过程和 TKIP countermeasures 工作原理,我们后面分析。
(2)MIC 追加到 MSDU 尾部后,我们就可以将它们看成一个新的 MSDU’,如果有开启分片功能,而且符合分片要求,就会对 MSDU’进行分片,比如分成两片,那么 plaintext MSDU 和 MIC 就可能分别组装在两个 MPDUs 中进行发送, 接收端会将这些 MPDUs 进行重组,生成原来的 MSDU’(Plaintext MSDU + MIC)。所以从这样来看,帧的分段对我们 MDSU 的加密的影响不大的,只要将(Plaintext MSDU + MIC)看出一个整体就好了。
但是值得注意的是,如果一个 MSDU 因为过大需要在 3 个 MPDU 中进行发送,使用 TKIP 加密时,他们都会使用一个相同的 extended IV,但是每一个 MPDU 会分别使用一个单调递增的 TSC。
(3)MSDU 经过封装,生成没有加密的 plaintext MPDU,同 WEP 一样经过计算生成 ICV,并将它追加到 plaintext MPDU 的尾部。
(4)TKIP 通过 phase1 和 phase2 两个 key mixing 阶段生成 WEP seed。
(5)TKIP 将上面得到的 WEP IV 和 ARC4 key 作为 WEP seed 通过 ARC4 算法生成 keystream(请对照 WEP 加密)
(6)最后将 keystream,plainte MPDU,ICV,IV(TSC0,TSC1 Key ID),extended IV,MIC 进行异或计算生成最后用于发送的 Encrypted MPDU
下面是经过 TKIP 加密以后生成的加密 MPDU:

从图中可以看到,该帧主要由 802.11 MAC Header(前 32 个字节)、Frame Body 和 CRC 三个部分构成,Frame Body 部分主要由以下 5 部分组成:
(a)IV/Key ID
(b)Extended IV
(c)MSDU payload
(d)MIC
(e)ICV
(1)第一部分是 802.11 MAC Header(前 32 个字节),可以看出头部并没有作任何改动
(2)IV/Key ID : 它的长度是 4 个字节,和 WEP 加密中的 IV 长度一样,但是其中的内容并不一样,它的前三个字节分别是 TSC1,WEP Seed 和 TSC0 (TSCn 后面分析);最后一个字节分别由 Reserved(5bit),EXT IV 1bit,Key ID 2bit;EXT IV 是用来指定是否传送后面的 Extended IV,对于 WEP 来说不需要这部分,所以设为 0,对于 TKIP 加密来说,Extended IV 是必须的,所必须设为 1;Key ID 需要根据帧封装的加密算法来设,它一般都是由 MLMESETKEYS.request 原语完成,它是 key index 缩写,是从 WEP 继承而来的,在 WEP 中可以用于指定使用第几个 key,但是在 TKIP 中一般设为 0,在没有 key mapping key 时候,不能够使用 pair 来鉴别要用哪个 key,这时会用到这个默认的 key 0。
TSC5 是最高有效位,而 TSC0 是最低有效位,因为 TSC0-TSC5 是从 6 个字节长的 TSC 派生而来的(MSB 是 Most Significant Bit 的缩写,最高有效位。在二进制数中,MSB 是最高加权位。与十进制数字中最左边的一位类似。通常,MSB 位于二进制数的最左侧,LSB 位于二进制数的最右侧)。
WEP Seed 是 (TSC1 | 0x20) & 0x7f 的结果
(3)Extended IV:它的长度 4 个字节,它是从 48-bit TKIP sequence counter (TSC2 through TSC5) 派生而来的;从图中可以看出 IV/Key ID 和 Extended IV 字段都是没有加密的,我们也可将这两个字段一共 8 个字节看成 TKIP 的头部
(4)接下来是加密的 payload MSDU
(5)MSDU 后面是 MIC,8 个字节,当它追加到 MSDU 后面时,就成了 MSDU 的一部分,用于后面的 MPDU 分片
(6)Frame Body 的最后是 Integrity Check Value(ICV),4 个字节,它是通过计算整个 MPDU 而来的。MSDU upper-layer payload 和 MIC 及 ICV 一样,都有进行加密
(7)帧的最后一部分是 CRC,它是 4 个字节的 FCS,它是通过计算全部的帧头和帧体部分得来的(calculated over all the fields of the header and frame body)
由于额外的 IV(4 字节),Extended IV(4 字节),MIC(8 字节)和 ICV(4 字节),一共 20 个字节。也就是说 TKIP 加密额外的给数据帧体添加了 20 个字节,那么 TKIP 加密的数据帧中 MSDU‘的最大值将会达到 2324 字节(802.11 规定一个帧中 MSDU 的最大 size 是 2304 字节)。
下面是使用 TKIP 加密时,omnipeer 抓包工具抓的两个加密包,该工具使用的是小端 decode,我们来分析一下:
IV=0x002016, 其中 TSC0=0x16, WEP seed=0x20, TSC1=0x00
Reserved=0b00000,has Ext IV=0b1, Key ID=0x00
Ext IV=0x0000 0000
Encrypted Data 一共 60 个字节,其中 MIC 占 8 个字节,ICV 占 4 个字节
从抓包来看,两个数据帧的主要区别是 TSC0 一个是 0x16,一个是 0x17,符合 TSC 递增的规律


下面我们来了解一下 MIC
MIC 的设计主要是弥补 WEP 加密存在的一下攻击:
— Bit-flipping attacks
— Data (payload) truncation, concatenation, and splicing
— Fragmentation attacks
— Iterative guessing attacks against the key
— Redirection by modifying the MPDU DA or RA field
— Impersonation attacks by modifying the MPDU SA or TA field
因为 MIC 追加到 MSDU 后面,我们一般会将它和 MSDU 看作一个整体,叫做 MSDU-with-MIC,然后将这个整体用于后面的 MPDU 分片,如下图:

在发送时,MSDU 经过 TKIP 加密生成 MSDU+MIC,然后将 MSDU+MIC 用于 MPDUs 分片;在接收时,将 MPDUs 进行重组,得到 MSDU+MIC,对 MSDU+MIC 解密后得到需要的 MSDU。
TKIP 加密中,MIC 的计算主要包括以下元素:

— The MSDU DA
— The MSDU SA
— The MSDU Priority(对于支持 Qos 功能的数据帧才有这个字段)
— The entire unencrypted MSDU data (payload)
关于 MIC 的具体计算方法可以参考《802.11-2010》中的“11.4.2.3.3 Definition of the TKIP MIC” 章节
下面介绍一下 TKIP countermeasures 程序
其实 MIC 只是基于 WEP 提供了一种较弱的攻击保护,它缺少一个检测和预防的机制,不能阻止字典式的暴力破解,而 TKIP countermeasures 就是用来解决这样的问题。下面是 TKIP countermeasures 的基本原则:
Logging:MIC 的校验失败意味着一次主动的攻击,应该记录到 log 里面,那么管理员就可以跟踪这个现象
60 Second Shutdown:如果在 60s 内有两次 MIC 校验失败,那么 STA 和 AP 都要等待 60s 后再接收 TKIP 帧
New Temporal Keys:如果有发现攻击现象,应该更新 PTK 和 GTK
在验证 MIC 前,接收端首先需要校验 MPDUs 的 FCS,ICV 和 TSC,如果其中有任何一个 FCS,ICV 或者 TSC 值小于或等于回复计数器中的值,都会被丢弃。这样就减少了不必要的 MIC 校验失败事件发生。
下面是 countermeasures 的工作流程,因为比较简单,就不详述了(请参考 802.11-2010 文档“11.4.2.4 TKIP countermeasures procedures”节)。


从上面可以看出,通过 MIC 和 countermeasures 的结合,可以抵御大多数 WEP 加密中不能处理的攻击。一是 MIC 通过加入 DA 和 SA 参数,可以确保 STA 和 AP 的唯一性,也就是说每一个 STA 和 AP 交互的过程中 MIC 都是惟一的,不像 WEP 加密那样开放。二是通过 countermeasures 保证在对这个唯一性进行攻击时进行检测,并进行采取预防措施。
802.11-2010 中还定义了 Phase1 和 Phase2 的计算算法,如果想了解它的具体实现或者编程方法,可以查阅 ”11.4.2.5 TKIP mixing function” 节,下面简单了解一下 TSC 的内容:
(1) 每一个 MPDU 都应该有一个惟一的 TSC
(2) 每一个发送端都应该维护多个 48 比特的 TSC 计数器,比如一个用于 PTKSA,一个用于 GTKSA,一个用于 STKSA,具体个数根据实际情况支持的加密而定
(3) TSC 是一个自动累加的 48bit 计数器,初始值是 1,每次 TK 初始化或者刷新都会重置这个值
(4) 在 WEP IV 字段中有携带 48-bit TSC 中的 16 LSBs(TSC0 和 TSC1),它用于 TKIP 混合加密中的 (Phase 2, STEP3),剩下的 TSC 部分(TSC2-TSC5) 在 Extended IV field 进行携带
(5) 每一个接收端也要为 PTKSA,GTKSA 和 STKSA 分别维护一个 TKIP TSC 回复计数器
(6) 在 MIC 校验成功和 ACK 处理被记录以后,TKIP 回复检测才会触发,因此只有 MIC 检测通过以后 TKIP TSC 计数器才会加一。
(7) 对于每一个 PTKSA,GTKSA 和 STKSA,接收端都应该分别为每个帧的优先级维护一个 TSC 计数器,而且接收端的 TSC 计数器会根据接收到的 MPDU 中的 TSC 来决定下一个发送帧中的 TSC 值。关于 TSC 和优先级的关系,可以看文档
(8) 如果接收端收到一个 MPDU,它的 TSC 值不符合顺序,那么应该给这个密钥增加 dot11RSNAStatsTKIPReplay 值
(9) 对于 MSDUs,如果发送时有使用 Block Ack 特性,会优先根据 Block Ack receiver operation (described in 9.21.4) 重新排列 MSDUs
关于 TKIP 的解密过程这里就不分析了,如果有理解加密过程,解密过程应该也不难,它的主要输入是 TA,TK,TSC 和已加密的 MPDU

这篇文章主要对 TKIP 加密进行了分析,主要参考的是《802.11-2012》和《CWSP Certified Wireless Security Professional Official Study Guide – Exam PW0-204》文档,对其中的详细过程,如果只是站在开发的角度,其实可以不用了解太详细,不管是加密过程还是解密过程,我们调用函数时,知道要传入什么参数,然后它会得出什么返回就够了,毕竟函数内部的实现都是开源的。
后面将继续分析我们比较关注的 CCMP 加密,它也是 802.11 文档推荐并且在新的设备中必须强制支持的一种加密方式。
写出 TKIP 协议及 CCMP 协议能够提供的服务:
答:TKIP 提供两种服务:
(1)消息完整性:TKIP 在 MAC 数据帧后面加了一个消息完整
性码(MIC)。
(2)数据保密:通过加密 MDPU 提供数据保密服务。
CCMP 协议提供两种服务:
(1)消息完整性:CCMP 使用加密 - 阻塞 - 链接消息认证码
(CBC-MAC)。
(2)数据保密性:CCMP 使用 CTR 模式下的 AES 加密。