赞
踩
PSK 即是ap的密码,密码不足64位,则使用密码加ssid然后hash算出64字节的PSK
PMK使用PSK前32字节,256bit。
Anonce是ap的随机数, Snonce是sta的随机数,各32字节。
PTK = PMK + MAC(AP)+无线网卡MAC(STA)+AP产生的随即值(ANonce)+wifi产生的随机值(SNonce)+登陆密码(pairewise),SHA256和MD5算法得到的,而这种算法是不可逆的。
PTK ← PRF-X(PMK, “Pairwise key expansion”, Min(AA,SPA) || Max(AA,SPA) ||Min(ANonce,SNonce) || Max(ANonce,SNonce))
X = 256 + TK_bit 是生成的PTK的长度,参数X是256加上对应加密的TK位数,不同的加密方式TK_bits不一样,可查下表:
KCK ← L(PTK, 0, 128),它是PTK的前128bit(0-127),用于计算密钥生成消息的完整性校验值
KEK ← L(PTK, 128, 128),它是PTK的中间128bit(128–255),用来加密密钥生成消息
TK ← L(PTK, 256, TK_bits),它是PTK中256bit以后的所有位(256 — 255 + TK_bits),用来对数据包中的数据进行加密。从表中可看出,对于TKIP加密PTK的长度是512bit, 对于CCMP加密PTK的长度是384bit。
KCK和KEK将用于后续EAPOL Key帧中某些信息的加密。 TKIP TK和CCMP TK就是TKIP和CCMP算法中用到的密钥。
后面贴出一个示例,wep目前基本不用了,主要ccmp和tkip。
抓包:
auth req open system, seq = 1
auth rsp open system, seq = 2, status = 0(success)
assoc req
assoc rsp
eapol 1
这里第一个eapol报文的data应该是空的,我这里用的wifi芯片在第一个报文里填了个固定值,不确定有什么作用,看注释是为intel加的。
除此之外,第一个报文发送时携带了ap的Anonce。
eapol 2
sta收到ap的Anonce之后,加上自己输入的密码,已经具备了计算PTK的所有元素。
这里应该由wap_supplicant计算出来,对这里代码细节不熟悉,我后面贴出ap的计算代码。
sta计算完成后发出第二个eapol报文,报文中携带sta的Anonce和KCK计算的MIC值。
这个keydata好像是PMKID,不过我用的这款wifi里面没处理这个data。
eapol 3
AP收到第二个报文后会根据Snonce计算出对应的PTK,然后再用KCK算一遍MIC,比对一下,成功则继续。
PTK计算:
计算成功后,回复sta第三个eapol报文,携带MIC和group key,group key应该在data中。
static void CalcPTK(unsigned char *addr1, unsigned char *addr2, unsigned char *nonce1, unsigned char *nonce2, unsigned char * keyin, int keyinlen, unsigned char *keyout, int keyoutlen ) { unsigned char data[2*ETHER_ADDRLEN+ 2*KEY_NONCE_LEN], tmpPTK[128]; unsigned char keydata[32]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10, 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20 }; unsigned char plainData[10]="abc"; unsigned char **ptr; unsigned char encryptedData[32]; if(MIN(addr1, addr2, ETHER_ADDRLEN)<=0) { memcpy(data, addr1, ETHER_ADDRLEN); memcpy(data + ETHER_ADDRLEN, addr2, ETHER_ADDRLEN); }else { memcpy(data, addr2, ETHER_ADDRLEN); memcpy(data + ETHER_ADDRLEN, addr1, ETHER_ADDRLEN); } if(MIN(nonce1, nonce2, KEY_NONCE_LEN)<=0) { memcpy(data + 2*ETHER_ADDRLEN, nonce1, KEY_NONCE_LEN); memcpy(data + 2*ETHER_ADDRLEN + KEY_NONCE_LEN, nonce2, KEY_NONCE_LEN); }else { memcpy(data + 2*ETHER_ADDRLEN, nonce2, KEY_NONCE_LEN); memcpy(data + 2*ETHER_ADDRLEN + KEY_NONCE_LEN, nonce1, KEY_NONCE_LEN); } sha256_prf(keyin, keyinlen, (unsigned char*)PMK_EXPANSION_CONST, data, sizeof(data),tmpPTK, keyoutlen); memcpy(keyout, tmpPTK, keyoutlen); }
eapol 4
sta进行验证之后安装PTK,GTK,并回复确认报文,之后ap也会安装PTK。
贴一个描述更详细的帖子
https://blog.csdn.net/lee244868149/article/details/52743302
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。