无线局域网安全(三)————CCMP加密

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头部

无线局域网安全(三)————CCMP加密_第1张图片

下面我们来看看主要加密过程:

1. 每一个新的MPDU需要发送时,都会重新创建一个48bit的PN,如果是重传的MPDU,则使用原来发送MPDU的PN

2. 使用MPDU的头部构建AAD,如下图所示,它是MAC Header的构成,其中深灰色部分会被用来构建AAD,而且会被CCM保密;其中一些浅灰色的也会用于构建AAD,根据帧的类型不同,其中一些字段可能没有使用,那么就会用0覆盖。

无线局域网安全(三)————CCMP加密_第2张图片

这样计算出来的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字段给覆盖了


下图是CCMP MPDU的帧格式:
无线局域网安全(三)————CCMP加密_第3张图片

下图是802.11官方文档中的CCMP MPDU帧结构图,可以对照着看,其实上图省略了一个Rsvd字节,它应该有两个Rsvd字段,一个是8bit,一个是3bit(后面称为Rsvd1和Rsvd2),如下:

无线局域网安全(三)————CCMP加密_第4张图片

从图中可以看到,前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个字节

无线局域网安全(三)————CCMP加密_第5张图片


下面将对其中一些主要的步骤进行一些具体的分析:

PN processing
它是一个主动的自增计数器,每一个新发送的MPDU都会生成一个新的PN,如果是重传的MPDU就会使用旧的PN继续进行发送。如果在一系列的MPDUs发送过程中,使用的temporal key 是同一个,那么不同MPDUs必须使用不同的PN,也就是PN不会重复。


Construct AAD
前面我们由提到,AAD是从MAC头部其出相关字段进行构建的,下面是其中取出来的字段:

无线局域网安全(三)————CCMP加密_第6张图片

对于不同的网络架构和帧类型来说,有些字段并没有使用,也就是为空,比如QoS Control字段(2字节)和A4字段(6字节),所以AAD的长度也会因为是否有这些字段而不同(基于22字节,加上0,2或者6):

无线局域网安全(三)————CCMP加密_第7张图片

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位,主要内容如下:

无线局域网安全(三)————CCMP加密_第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的解密过程,理解加密过程后,可查询文档了解

无线局域网安全(三)————CCMP加密_第9张图片


下面介绍一下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路握手过程,看看是怎么完成密钥的交互的。

你可能感兴趣的:(无线局域网开发)