2013-02-28 51 views
3

我试图计算WPA握手数据包的MIC,但不幸的是它失败了。更确切地说,我使用了802.1x数据包(如规范所述)。用Python创建WPA消息完整性代码(MIC)

MIC = HMAC_MD5(MIC Key, 16, 802.1x data) 

这是相关代码:

mic = hmac.new(ptk[0:16],data) 
print "mic: " + mic.hexdigest() + "\n" 

凡hmac.new从HMAC LIB采取:

import hmac,hashlib,binascii 

为加密的密钥显然是由前16个字节的Pairwise Transcient Key(所谓的密钥确认密钥)。 PTK由一个名为cowPatty的程序确认。 所以我可以排除这两个因素是错误的。这是我的802.1x的数据,这是由十六进制值0103介绍:

01030077fe010a001000000000000000 
01ae11df37f5fb100665ce0c849f5950 
c0e7901da3224ddfc9e9434babad5512 
73000000000000000000000000000000 
00000000000000000000000000000000 
00e8b4b90bfc3fd97b657afeb66262ae 
940018dd160050f20101000050f20201 
000050f20401000050f202 

Wireshark的计算MIC是:

e8b4b90bfc3fd97b657afeb66262ae94 

,我计算为MIC:

5492624bb538b52d6aa6261c692bd595 

不幸的是,我所做的并不重要,我永远无法计算出相同的MIC。 也许一些专家有宝贵意见,真的很感谢!

此致敬礼!

+1

http://stackoverflow.com/questions/12018920/wpa-handshake-with-python-hashing-difficulties 这可能会有所帮助。 通知endianess-issues – 2014-04-17 12:20:07

回答

3

这里是一个4次握手,从第二个消息的EAPOL数据(逻辑链路控制后右起):

unsigned char eapol[] = 
{ 
    '\x01',  // Version 
    '\x03',  // Type 
    '\x00','\x77', // Length 
    '\xfe',  // Key Descriptor Type 
    '\x01','\x0a', // Key information 
    '\x00','\x10', // Key length 
    // Replay counter 
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01', 
    // WPA Key Nounce 
    '\x77','\xd6','\x54','\xad','\x0c','\x1f','\xea','\x2f', 
    '\x20','\x99','\xf1','\xdd','\x1c','\xae','\xdb','\xd8', 
    '\xf7','\xe8','\x86','\xb0','\x81','\x60','\xed','\x7f', 
    '\x70','\xdd','\xbb','\x33','\xb6','\xf1','\xd9','\x98', 
    // Key IV 
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', 
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', 
    // Key RSC 
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', 
    // Key ID 
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', 
    // MIC **************** CHANGE HERE ******************** 
// '\x0a','\x62','\x24','\x07','\x11','\x36','\xd5','\x67', 
// '\x87','\xc0','\x7b','\x82','\x6b','\x06','\xf7','\xff', 
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', 
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00', 
    // Key Data Length 
    '\x00','\x18', 
    // Key Data 
    '\xdd','\x16','\x00','\x50','\xf2','\x01','\x01','\x00', 
    '\x00','\x50','\xf2','\x04','\x01','\x00','\x00','\x50', 
    '\xf2','\x04','\x01','\x00','\x00','\x50','\xf2','\x02' 
}; 

,确保您更换16个字节MIC领域的“\ X00 '并且您将拥有一个有效的EAPOL数据,可以根据Michael算法进行计算。

此外,请确保您使用基于WPA版本的正确算法。 WPA1使用HMAC与MD5哈希函数,WPA2使用HMAC与SHA1哈希值,你可以在了Aircrack-ng的来源看:

if (ap->wpa.keyver == 1) 
    HMAC(EVP_md5(), ptk[j], 16, ap->wpa.eapol, ap->wpa.eapol_size, mic[j], NULL); 
else 
    HMAC(EVP_sha1(), ptk[j], 16, ap->wpa.eapol, ap->wpa.eapol_size, mic[j], NULL); 

我认为Python在默认情况下HMAC对象使用MD5。