使用Python创建WPA消息完整性代码(MIC)



我试图计算WPA握手包的MIC,但不幸的是它失败了。更准确地说,我取了802.1x数据包(如规范所述)。

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

这是相关代码:

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

hmac的地方。New取自hmac库:

import hmac,hashlib,binascii

用于加密的密钥显然由成对瞬态密钥(所谓的密钥确认密钥)的前16个字节组成。PTK是由一个名为cowPatty的节目确认的。所以我可以排除这两个因素是错的。这是我的802.1x数据,它是由十六进制值0103:

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

Wireshark计算的MIC为:

e8b4b90bfc3fd97b657afeb66262ae94

我计算的MIC是:

5492624bb538b52d6aa6261c692bd595

不幸的是,不管我做什么,我永远无法计算相同的MIC。也许一些专家有宝贵的意见,那真的会很感激!

致以最亲切的问候!

这是来自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

最新更新