You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python计算WPA的PTK结果错误,请求排查解决

WPA PTK计算错误:PMK正确但PTK结果不符的修复方案

我尝试编写Python程序,基于PMK、四次握手的MAC地址和Nonce计算WPA的PTK,但结果始终不正确。参考过开源实现但仍有问题,当前代码生成的PMK与参考数据一致,但PTK开头应为fb18,实际输出以39e2开头。

核心错误点

  1. 十六进制字符串未转二进制:当前代码中的aNonce、sNonce、apMac、cliMac都是十六进制格式的字节字符串,直接用min()/max()比较的是ASCII字符顺序,而非实际的二进制字节值顺序,这会导致B字段构造错误。
  2. PRF函数的计数字节错误:PRF中迭代计数i应该以单字节二进制整数形式追加(比如i=0对应b'\x00'),而不是将数字转为ASCII字符串编码。
  3. 循环条件冗余:原循环条件的计算方式可以简化,直接按需要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:14:54