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 address):指接收端的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时候,不能够使用<RA,TA> 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文档推荐并且在新的设备中必须强制支持的一种加密方式。
————————————————
版权声明:本文为CSDN博主「奔跑的路」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lee244868149/article/details/52701703