Counter Mode with Cipher-Block Chaining Message Authentication Code Protocol(CCMP)
CCMP加密在802.11i修正案中定义,用于取代TKIP和WEP加密。CCMP使用AES块加密算法取代WEP和TKIP的RC4流算法,它也是WAP2指定的加密方式,因为AES加密算法是和处理器相联系的,所以旧的设备中可以支持WEP和TKIP,但是不能支持CCMP/AES加密,关于AES算法的详细介绍可以查看文档《FIPS PUB 197-2001 》。值得注意的是,在CCMP加密使用的AES算法中都是使用的128bit的密钥和128bit的加密块,关于CCM的定义请参考《IETF RFC 3610 》。
CCM主要有两个参数:M=8,表示MIC是8个字节;L=2,表示长度域是两个字节一共16位,这样就可以满足MPDU最大的长度。
同时CCM需要给每个session指定不同的temporal key,而且每一个被加密的MPDU都需要一个指定的临时值,所以CCMP使用了一个48bit的PN(packet number),对同一个PN的使用将会使安全保证失效。
CTR(CounterMode ):用于提供数据保密性
CBC(Cipher-Block Chaining )
CBC-MAC(Cipher-Block Chaining Message Authentication Code ):用于认证和完整性
下图是CCMP的加密过程:
它的主要输入包括:
MAC header:802.11 MAC 头部
plaintext Data(MSDU): 需要发送的playload
PN(packet number): 长度128bit,它和TKIP中TSC(TKIP sequence number )很相似,它是每个帧的标识,而且它会随着帧的发送过程不断递增,他可以防止回放和注入攻击
TK(temporal key):和TKIP加密一样,CCMP也有一个128bit的TK,它可能是由SSID+passphase计算来的PTK(pairwise transient key ),也可能是GTK(group temporal key ),两者分别用于单播数据加密和组播数据加密
Key ID: 和TKPIP中的一样,用于指定加密用的key,注意这个ID是index的缩写,一般设为0
Nonce:他是一个随机数,而且只生成一次,它一共长104bit,是由PN(packet number,48bit), Qos中的优先级字段(8bit)和TK(transmitter address , 48bit)这三个字段组合来的,需要注意,不要和4路握手的Nonce混淆
AAD Additional authentication data (AAD):它是由MPUD的头部构建而来的,它用于确保MAC头部的数据完整性,接收端会使用这个字段来检验MAC头部
下面我们来看看主要加密过程:
1. 每一个新的MPDU需要发送时,都会重新创建一个48bit的PN,如果是重传的MPDU,则使用原来发送MPDU的PN
2. 使用MPDU的头部构建AAD,如下图所示,它是MAC Header的构成,其中深灰色部分会被用来构建AAD,而且会被CCM保密;其中一些浅灰色的也会用于构建AAD,根据帧的类型不同,其中一些字段可能没有使用,那么就会用0覆盖。
这样计算出来的MIC,不仅确保了MAC Header的完整性,也确保了frame body的完整性,而且所有的MAC address(包括BSSID)都有受到保护,同时MAC Header的其他一些域也有受到保护。接收端也会对这些受保护的MAC Header进行完整性校验,比如frame type and the distribution bits两个位是受保护的,那么接收端就会对这两个受保护的位进行校验,需要注意的是,AAD并不包括MAC头部的Duration 字段,因为在正常的IEEE 802.11 操作中,Duration 字段是会随时变动的。
通常在Frame Control域中的一些子域,Sequence Control域和Qos Control 域会覆盖为0,因此这些域不会受到保护,比如Retry bit and Power Management bits不会受到保护。
3. 由PN(packet number,48bit), Qos中的优先级字段(8bit)和TK(transmitter address , 48bit,Address 2)这三个字段组合生成一个Nonce
4. 构建8个字节的8-octet CCMP 头部,这个头部由Key ID 和PN构成,PN有被分成6个字段。你会发现它和8个字节的TKIP头部很相似
5. 使用temporal key, AAD, nonce, and MPDU data 作为输入和AES clock cipher 算法,生成8个字节的MIC和加密的MSDU,这个过程叫CCM originator processing
6. 将CCMP头部追加到MAC头部后面,尾随的是加密的MSDU和加密的MIC。接下来的是FCS,它是通过计算全部的头部的帧体而来,也就是计算FSC字段前面的所有字段,没有CRC字段,或者说CRC字段被FCS字段给覆盖了
下图是802.11官方文档中的CCMP MPDU帧结构图,可以对照着看,其实上图省略了一个Rsvd字节,它应该有两个Rsvd字段,一个是8bit,一个是3bit(后面称为Rsvd1和Rsvd2),如下:
从图中可以看到,前32个字节的MAC头部并没有任何变化,帧体由三个部分构成,CCMP Header + MSDU Payload + MIC , 其中CCMP的头部由Key ID和PN构成(PN被分为6个字段,分别放置)。CCMP的头部是没有被加密的,有加密的部分是MSDU Payload和MIC。
CCMP头部(8字节)和MIC(8字节)部分是基于原来的帧多出部分,当开启CCMP加密的时候,那么MPDU的frame body部分将会增大16个字节,这样所允许的最大frame body将是2304+16=2320个字节。
通过上面的分析,我们可以看出,TKIP加密是基于MSDU的加密,而CCMP加密是基于MPDU的加密,这样就避免了针对MSDU的攻击,解决了在MSDU加密中不能解决的问题。
下面是使用CCMP加密时,omnipeer抓包工具抓的两个加密包,该工具使用的是小端decode,从抓包来看,很难区分是用的哪种加密,因为它是从TKIP,但是我们可以从认证过程中的4路握手进行了解,我们先来分析一下这个加密数据包:
PN0=0x3A
PN1=0x00
Rsvd1=0x00
Rsvd2=0b00000
has Ext IV=0b1
Key ID=0b00
PN2-PN5全部是0
Encrypted Data=87 bytes, 其中MIC占8个字节
下面将对其中一些主要的步骤进行一些具体的分析:
PN processing
它是一个主动的自增计数器,每一个新发送的MPDU都会生成一个新的PN,如果是重传的MPDU就会使用旧的PN继续进行发送。如果在一系列的MPDUs发送过程中,使用的temporal key 是同一个,那么不同MPDUs必须使用不同的PN,也就是PN不会重复。
Construct AAD
前面我们由提到,AAD是从MAC头部其出相关字段进行构建的,下面是其中取出来的字段:
对于不同的网络架构和帧类型来说,有些字段并没有使用,也就是为空,比如QoS Control字段(2字节)和A4字段(6字节),所以AAD的长度也会因为是否有这些字段而不同(基于22字节,加上0,2或者6):
AAD是从MPDU构建而来的,它构建不包括Duration字段,因为这个字段会随着实际情况而变动,比如在重传的时候,速率发生了变化,Duration就会发生改变,那么AAD就会和原来的不一样,这样会导致后面的验证失败。同时AAD也不包括HT Control field,它也会在实际情况中随着速率变化而动态改变,同理,MAC头部的一些会动态改变的子域就不会纳入AAD的构建而以0进行覆盖,下面是构建AAD所使用的主要字段:
a) FC – MPDU Frame Control field, with
1) Subtype bits (bits 4 5 6) in a Data MPDU masked to 0
2) Retry bit (bit 11) masked to 0
3) Power Management bit (bit 12) masked to 0
4) More Data bit (bit 13) masked to 0
5) Protected Frame bit (bit 14) always set to 1
6) Order bit (bit 15) as follows:
i) Masked to 0 in all data MPDUs containing a QoS Control field
ii) Unmasked otherwise
b) A1 – MPDU Address 1 field.
c) A2 – MPDU Address 2 field.
d) A3 – MPDU Address 3 field.
e) SC – MPDU Sequence Control field, with the Sequence Number subfield (bits 4–15 of the Sequence
Control field) masked to 0. The Fragment Number subfield is not modified.
f) A4 – MPDU Address field, if present.
g) QC – QoS Control field, if present, a 2-octet field that includes the MSDU priority. The QC TID is
used in the construction of the AAD. When both the STA and its peer have their SPP A-MSDU
Capable fields equal to 1, bit 7 (the A-MSDU Present field) is used in the construction of the AAD.
The remaining QC fields are masked to 0 for the AAD calculation (bits 4 to 6, bits 8 to 15, and bit 7
when either the STA or its peer has the SPP A-MSDU Capable field equal to 0).
Construct CCM nonce
Nonce由13个字节构成,它的组成如下:
其中Nonce Flags一共8位,主要内容如下:
Priority subfield :如果没有支持Qos Control,那么这个位置0;如果由支持Qos Control,那么这个需要根据QC TID设成0-3
Management field :如果是管理帧,这个位置1
Reserved:保留位清0
A2和PN就不再解释了
CCM originator processing
这个处理过程由4个输入
a) Key: the temporal key (16 octets).
b) Nonce: the nonce (13 octets) constructed as described in 11.4.3.3.4.
c) Frame body: the frame body of the MPDU.
d) AAD: the AAD (22–30 octets) constructed from the MPDU header as described in 11.4.3.3.3.
下面是CCMP的解密过程,理解加密过程后,可查询文档了解
下面介绍一下PN和回放攻击检测:
a) 每一个MPDU都一个对应的PN
b) 每一个发送端都应该分别为PTKSA, GTKSA, and STKSA 维护一个PN生成器
c) PN应该是一个48-bit的非负整数,每次初始化或者更新temporal key时都会被置1
d) 每一个接收端都应该分别为PTKSA, GTKSA, and STKSA 维护一个PN生成器,用于回复包,如果有给某个STA重置temporal key,那么他们的PN需要初始化成0
e) 对于不同优先级的MSDU or A-MSDU,也要维护对应的PN计数器,回复的PN不应该小于或等于收到的PN值
CCMP的加密就介绍到这里,有时间可能还会继续整理802.1x加密,毕竟它号称是当今商用最安全的加密方式。
了解到这里,应该知道使用WEP,TKIP或者CCMP加密时,数据报文是怎么封装的了,后面将继续分析Wlan认证的4路握手过程,看看是怎么完成密钥的交互的。