使用Python计算WPA的PTK结果错误,请求排查解决
WPA PTK计算错误:PMK正确但PTK结果不符的修复方案
我尝试编写Python程序,基于PMK、四次握手的MAC地址和Nonce计算WPA的PTK,但结果始终不正确。参考过开源实现但仍有问题,当前代码生成的PMK与参考数据一致,但PTK开头应为fb18,实际输出以39e2开头。
核心错误点
- 十六进制字符串未转二进制:当前代码中的
aNonce、sNonce、apMac、cliMac都是十六进制格式的字节字符串,直接用min()/max()比较的是ASCII字符顺序,而非实际的二进制字节值顺序,这会导致B字段构造错误。 - PRF函数的计数字节错误:PRF中迭代计数
i应该以单字节二进制整数形式追加(比如i=0对应b'\x00'),而不是将数字转为ASCII字符串编码。 - 循环条件冗余:原循环条件的计算方式可以简化,直接按需要的SHA1迭代次数(4次,因为64字节=512位,每次SHA1输出160位,512/160=3.2,所以需要4次迭代)。
修正后的代码
import hmac import binascii from hashlib import pbkdf2_hmac, sha1 def PRF(key, A, B): nByte = 64 R = b'' # 每次SHA1生成160位,64字节需要4次迭代(4*160=640位,取前512位即64字节) for i in range(4): # 计数i以单字节二进制形式传入,而非ASCII字符串 hmacsha1 = hmac.new(key, A + B + bytes([i]), sha1) R += hmacsha1.digest() return R[:nByte] # 参考数据 pwd = "kemparajanusha" ssid = "Praneeth" # 将十六进制字符串转换为二进制字节流 aNonce = binascii.a2b_hex("ac9871c9ca129468708ca0d554e22f4f8b6eaa6dbaa121d2233bf33cbc29d346") sNonce = binascii.a2b_hex("5214c4dbe4a567e78b8f30b2b016a2d90ea50c27d408614c1fc0a0934a889ada") apMac = binascii.a2b_hex("60E327F814A0") cliMac = binascii.a2b_hex("C0F4E64B6ACF") A = b"Pairwise key expansion" # 对二进制字节流进行排序,而非字符串排序 B = min(apMac, cliMac) + max(apMac, cliMac) + min(aNonce, sNonce) + max(aNonce, sNonce) pmk = pbkdf2_hmac('sha1', pwd.encode('ascii'), ssid.encode('ascii'), 4096, 32) ptk = PRF(pmk, A, B) print("\nPMK (Pairwise Master Key):", binascii.hexlify(pmk).decode()) print("PTK:\t\t", binascii.hexlify(ptk).decode(), "\n")
关键修改说明
- 二进制转换:用
binascii.a2b_hex()将所有十六进制格式的Nonce和MAC地址转为二进制字节流,确保排序是基于实际字节值的比较。 - PRF计数修正:将
str(i).encode('ascii')改为bytes([i]),生成单字节的二进制计数(比如0对应0x00,1对应0x01),符合WPA规范中的PRF要求。 - 简化循环逻辑:直接循环4次(因为64字节需要4次SHA1输出拼接),避免原代码中复杂的条件计算。
内容的提问来源于stack exchange,提问作者Guillem Serrat
相关产品推荐
相关产品推荐

