WPA/RSN四次握手和PTK

本文深入解析WPA/RSN协议中的四次握手过程,详细阐述如何从PMK生成PTK,包括PTK的组成、生成方式以及四次握手的交互流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WPA/RSN四次握手和PTK

WPA/RSN使用四次握手(4-Way Handshake)的方式生成所需的密钥。

作用

四次握手通过一系列的交互,从PMK(Pairwise Master Key)生成PTK(Pairwise Transient Key)。PMK来自MSK(Master Session Key),是MSK的前256位,32字节。

本文的主要目的是讲PTK,所以暂时忽略PMK和MSK。

PTK的内容

PTK包含3个部分,KCK(Key Confirmation Key),KEK(Key Encryption Key),TK(Temporal Key)。

PTK的总长度根据加密方式不同而不同。

当加密方式是TKIP时,PTK长512位,按顺序分别为KCK占128位,KEK占128位,TK占256位。

当加密方式是CCMP时,PTK长384位,按顺序分别为KCK占128位,KEK占128位,TK占128位。

KEK和KCK是给EAPOL-Key,也就是四次握手时,加密和完整性验证用的。TK用于后续的数据加密。

四次握手的报文都是基于EAPOL-Key的。EAPOL-Key的结构如下:


PTK的生成

生成PTK,需要5个必要元素,PMK,ANonce(Nonce 1),SNonce(Nonce 2),Authenticate MAC(MAC 1),Supplicant MAC(MAC 2)。如下图:


2个Nonce分别是Authenticator和Supplicant生成的随机数。

这张图里的输出包含4个部分,其实Data Encr和Data MIC合起来就是前面提到的TK。而EAPOL Encr/MIC分别对应前面的KEK和KCK。

四次握手的交互过程

下面的交互仅仅是一个流程,对内部的一些数据的处理就不细说了。

1/4:Authenticator -> Supplicant

Authenticator把ANonce送给Supplicant。Supplicant收到1/4后,就有了生成PTK的所有元素。因为1/4里同时也包含了Authenticator的MAC地址。

2/4:Supplicant -> Authenticator

Supplicant计算出PTK,把SNonce和自己的MAC地址送给Authenticator。同时,从2/4报文开始,后面的每个报文都会有MIC。1/4没有。

3/4:Authenticator -> Supplicant

Authenticator向Supplicant证明自己有有效的,同样有MIC加入其中

4/4:Supplicant -> Authenticator

仅是对3/4的一个ACK。说明PTK已经装好,后面的数据可以加密了。

### 关于 Hostapd 四次握手过程中的状态机源码解析 Hostapd 是一种用于管理 IEEE 802.11 接入点的软件工具,其核心功能之一是处理 WPA/WPA2 的四次握手认证流程。以下是针对 hostapd 中四次握手的状态机及其源码的关键部分进行分析。 #### 状态机的核心逻辑 WPA/WPA2 协议定义了一个基于 EAPOL (Extensible Authentication Protocol over LAN) 的四次握手机制来验证客户端的身份并建立加密密钥。hostapd 实现了这一协议的具体细节,在 `src/ap/wpa_auth.c` `src/ap/pmksa_cache.c` 文件中可以找到相关代码[^4]。 ##### 主要数据结构 - **wpa_state_machine**: 这是一个复杂的数据结构,包含了当前连接会话的所有必要信息,例如临时密钥、MIC 值以及各种计数器。 ```c struct wpa_state_machine { struct sta_info *sta; /* Pointer to the station entry */ int pairwise; /* Pairwise cipher suite selector */ u8 ptk[PMK_LEN]; /* Pre-shared key or PMK derived from RSN handshake */ }; ``` 上述代码片段展示了 state machine 数据结构的一部分,它存储了与特定 STA(Station)关联的信息。 ##### 握手消息处理函数 每次收到一个新的 EAPOL-Key 消息时,都会调用相应的处理函数: - **eapol_sm_step()**: 负责推进状态机到下一个阶段。 - **wpa_send_eapol()**: 构造并发送下一条 EAPOL-Key 报文给客户端设备。 具体来说,以下四个主要步骤对应着四次握手中的每一步操作: 1. AP 向 Station 发送第一个 Message 1/4; 2. Station 收到后回复第二个 Message 2/4; 3. AP 验证后再发第三个 Message 3/4; 4. 最终完成整个过程通过第四个 Message 4/4。 这些交互都严格遵循预设的时间顺序,并且只有当所有条件都被满足之后才会进入下一环节。 #### 错误检测与恢复策略 如果某个阶段失败,则可能触发重试机制或者完全终止该 session 并清除任何已分配资源。这种行为通常记录在日志文件里以便后续排查问题所在位置。 ```python def handle_failure(state, error_code): """Handle failure during four-way handshake.""" log_error(f"Error {error_code} occurred while processing state {state}") if retries_exceeded(): terminate_session() else: schedule_retry() handle_failure('Message 2', 'Invalid MIC') ``` 以上伪代码演示了如何应对潜在错误情况下的基本框架设计思路。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值