WLAN 4-Way Handshake如何生成GTK?
关于Wi-Fi的加密认证过程,可以参考如下链接,今天我们来理解如何生成GTK。
WLAN数据加密机制_tls加密wifi-CSDN博客
1 GTK
GTK(Group Temporal Key)是由AP通过GMK生成,长度为128位,并在四次握手的第三步中通过加密的方式发送给STA。具体步骤如下:
- GTK生成:AP生成一个新的GTK。这个GTK是AP自己生成的随机密钥,用于加密多播和广播通信。
- Note:所以连接到同一个AP的STA都拥有相同GTK。
- GTK分发:在四次握手的第三步,AP将GTK加密后发送给STA。加密使用的是PTK中的KEK(Key Encryption Key)部分。
- Note:关于KEK请参考链接:WLAN 4-Way Handshake如何生成PTK?-CSDN博客
1.1 GTK生成的具体步骤
Wi-Fi使用伪随机函数(PRF)生成GTK。常用的PRF实现基于HMAC-SHA1或HMAC-SHA256,如下图所示:
- 在WPA和WPA2中,通常使用HMAC-SHA1。
- 在WPA3中,使用更强的HMAC-SHA256。
Note:
- 当前GMK由随机数代替;
- 为了防止GTK泄露,AP应定期生成新的GTK并分发给所有STA。
如上图所示,GTK密钥生成的层级,我们这里重点讲解下生成算法,我们可以看到生成的算法是PRF-Length,其中Length的计算方法如下所示:
- Length =TK_bits.
- 其中TK_bits的值参考下图:
1.2 GTK的传递过程
四次握手的具体步骤包括以下内容:
- 消息1:AP生成ANonce,并发送给STA。
- 消息2:STA生成SNonce,并发送给AP。STA和AP都计算出PTK。
- 消息3:
- AP生成GTK。
- AP使用PTK中的KEK加密GTK。
- AP将加密的GTK和一个MIC(Message Integrity Code)发送给STA,以保证消息的完整性和保密性。
- 消息4:STA接收到加密的GTK后,使用PTK中的KEK解密,得到GTK,并发送确认消息给AP。
1.3 GTK更新和重新分发
AP定期生成新的GTK,并通过以下过程重新分发:
- 生成新的GTK:使用上述算法和步骤生成新的GTK。
- 通知STA:通过新的EAPOL-Key消息通知所有连接的STA。
- 加密传输:使用PTK中的KEK加密新的GTK,并发送给STA。
- 确认:STA接收到新的GTK后,解密并确认接收。
1.4 hostapd code
static void wpa_group_ensure_init(struct wpa_authenticator *wpa_auth,struct wpa_group *group)
{if (group->first_sta_seen)return;/** System has run bit further than at the time hostapd was started* potentially very early during boot up. This provides better chances* of collecting more randomness on embedded systems. Re-initialize the* GMK and Counter here to improve their strength if there was not* enough entropy available immediately after system startup.*/wpa_printf(MSG_DEBUG,"WPA: Re-initialize GMK/Counter on first station");if (random_pool_ready() != 1) {wpa_printf(MSG_INFO,"WPA: Not enough entropy in random pool to proceed - reject first 4-way handshake");group->reject_4way_hs_for_entropy = true;} else {group->first_sta_seen = true;group->reject_4way_hs_for_entropy = false;}if (wpa_group_init_gmk_and_counter(wpa_auth, group) < 0 ||wpa_gtk_update(wpa_auth, group) < 0 ||wpa_group_config_group_keys(wpa_auth, group) < 0) {wpa_printf(MSG_INFO, "WPA: GMK/GTK setup failed");group->first_sta_seen = false;group->reject_4way_hs_for_entropy = true;}
}static int wpa_gtk_update(struct wpa_authenticator *wpa_auth,struct wpa_group *group)
{struct wpa_auth_config *conf = &wpa_auth->conf;int ret = 0;size_t len;os_memcpy(group->GNonce, group->Counter, WPA_NONCE_LEN);inc_byte_array(group->Counter, WPA_NONCE_LEN);if (wpa_gmk_to_gtk(group->GMK, "Group key expansion",wpa_auth->addr, group->GNonce,group->GTK[group->GN - 1], group->GTK_len) < 0)ret = -1;wpa_hexdump_key(MSG_DEBUG, "GTK",group->GTK[group->GN - 1], group->GTK_len);if (conf->ieee80211w != NO_MGMT_FRAME_PROTECTION) {len = wpa_cipher_key_len(conf->group_mgmt_cipher);os_memcpy(group->GNonce, group->Counter, WPA_NONCE_LEN);inc_byte_array(group->Counter, WPA_NONCE_LEN);if (wpa_gmk_to_gtk(group->GMK, "IGTK key expansion",wpa_auth->addr, group->GNonce,group->IGTK[group->GN_igtk - 4], len) < 0)ret = -1;wpa_hexdump_key(MSG_DEBUG, "IGTK",group->IGTK[group->GN_igtk - 4], len);}if (!wpa_auth->non_tx_beacon_prot &&conf->ieee80211w == NO_MGMT_FRAME_PROTECTION)return ret;if (!conf->beacon_prot)return ret;if (wpa_auth->conf.tx_bss_auth) {group = wpa_auth->conf.tx_bss_auth->group;if (group->bigtk_set)return ret;wpa_printf(MSG_DEBUG, "Set up BIGTK for TX BSS");}len = wpa_cipher_key_len(conf->group_mgmt_cipher);os_memcpy(group->GNonce, group->Counter, WPA_NONCE_LEN);inc_byte_array(group->Counter, WPA_NONCE_LEN);if (wpa_gmk_to_gtk(group->GMK, "BIGTK key expansion",wpa_auth->addr, group->GNonce,group->BIGTK[group->GN_bigtk - 6], len) < 0)return -1;group->bigtk_set = true;wpa_hexdump_key(MSG_DEBUG, "BIGTK",group->BIGTK[group->GN_bigtk - 6], len);return ret;
}
相关文章:

WLAN 4-Way Handshake如何生成GTK?
关于Wi-Fi的加密认证过程,可以参考如下链接,今天我们来理解如何生成GTK。 WLAN数据加密机制_tls加密wifi-CSDN博客 1 GTK GTK(Group Temporal Key)是由AP通过GMK生成,长度为128位,并在四次握手的第三步中…...
Qt/C++模拟鼠标键盘输入
1、控制鼠标移动 (1)Qt方案 QScreen* sc QGuiApplication::primaryScreen(); QCursor* c new QCursor(); int deltaX 10; int deltaY 10; c->setPos(sc, c->pos().x() deltaX, c->pos().y() deltaY);(2)Windows原…...

OpenGL3.3_C++_Windows(22)
材质: 决定物体在渲染过程中最终视觉呈现的关键因素之一,它通过一系列光学(投光物)和物理参数(反光度,反照率、金属度,折射率……)准确模拟现实世界中的材料特性,从而增…...

electron-builder 打包过慢解决
报错内容如下 > 6-241.0.0 build > electron-builder • electron-builder version24.13.3 os10.0.22631 • loaded configuration filepackage.json ("build" field) • writing effective config filedist\builder-effective-config.yaml • pack…...
leetcode226反转二叉树
本文主要讲解反转二叉树的要点与细节,按照步骤思考更方便理解 c和java代码如下,末尾 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 具体要点: 1. 首先我们要理解题意, 反转二叉树具体…...

【自然语言处理系列】探索NLP:使用Spacy进行分词、分句、词性标注和命名实体识别,并以《傲慢与偏见》与全球恐怖活动两个实例文本进行分析
本文深入探讨了scaPy库在文本分析和数据可视化方面的应用。首先,我们通过简单的文本处理任务,如分词和分句,来展示scaPy的基本功能。接着,我们利用scaPy的命名实体识别和词性标注功能,分析了Jane Austen的经典小说《傲…...
【Rust】function和methed的区别
文章目录 functionmethedAssociated Functions 参考资料 一句话总结: function和methed很多都是相同的。 不同点在于: methed定义在结构体里面,并且它的第一个参数肯定是self,代表结构体实例。方法需要用实例名.方法名调用当然结…...

python基础语法 003-4 数据类型集合
1 集合 1.1 什么是集合 什么是集合?ANS:集合set是一个无序的不重复元素序列集合怎么表示?ANS: {} , 用逗号隔开打印元组类型,type()一个元素的集合怎么表示?:ANS:存储多种类型{"a", 1} """…...
Vue如何引用组件
在 Vue.js 中,你可以通过几种方式引用组件: 全局注册 在 main.js 或你的主入口文件中,你可以使用 Vue.component() 方法来全局注册一个组件。这意味着这个组件可以在你的 Vue 应用的任何地方使用。 import MyComponent from ./components/…...
vue3中省市区联动在同一个el-form-item中咋么设置rules验证都不为空的效果
在开发中出现如下情况,在同一个el-form-item设置了省市区三级联动的效果 <el-form-item label"地区" prop"extraProperties.Province"><el-row :gutter"20"><el-col :span"12"><el-select v-model&qu…...

如何集成CppCheck到visual studio中
1.CPPCheck安装 在Cppcheck官方网站下载最新版本1.70,官网链接:http://cppcheck.sourceforge.net/ 安装Cppcheck 2.集成步骤 打开VS,菜单栏工具->外部工具->添加,按照下图设置,记得勾选“使用输出窗口” 2.…...

GWO-CNN-SVM,基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)
GWO-CNN-SVM,基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类) 1. GWO灰狼优化算法 灰狼优化算法(Grey Wolf Optimizer, GWO)是一种启发式优化算法,模拟了灰狼群体的社会行为,包…...

Go-知识测试-工作机制
Go-知识测试-工作机制 生成test的maintest的main如何启动case单元测试 runTeststRunnertesting.T.Run 示例测试 runExamplesrunExampleprocessRunResult 性能测试 runBenchmarksrunNtesting.B.Run 在 Go 语言的源码中,go test 命令的实现主要在 src/cmd/go/internal…...

【小程序静态页面】猜拳游戏大转盘积分游戏小程序前端模板源码
猜拳游戏大转盘积分游戏小程序前端模板源码, 一共五个静态页面,首页、任务列表、大转盘和猜拳等五个页面。 主要是通过做任务来获取积分,积分可以兑换商品,也可用来玩游戏;通过玩游戏既可能获取奖品或积分也可能会消…...
JupyterServer配置
1. 安装jupyter pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout1000 2. 生成配置 jupyter notebook --generate-config 3. 修改配置,设置密码 获取密码的方式:命令行输入python后,用以下方式获…...
信息检索(57):MINIMIZING FLOPS TO LEARN EFFICIENT SPARSE REPRESENTATIONS
MINIMIZING FLOPS TO LEARN EFFICIENT SPARSE REPRESENTATIONS 摘要1 引言2 相关工作3 预期 FLOPS 次数4 我们的方法5 实验6 结论 发布时间(2020) 最小化 Flop 来学习高效的稀疏表示 摘要 1)学习高维稀疏表示 2)FLOP 集成到损失…...

Python 面试【中级】
欢迎莅临我的博客 💝💝💝,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

[Open-source tool]Uptime-kuma的簡介和安裝於Ubuntu 22.04系統
[Uptime Kuma]How to Monitor Mqtt Broker and Send Status to Line Notify Uptime-kuma 是一個基於Node.js的開軟軟體,同時也是一套應用於網路監控的開源軟體,其利用瀏覽器呈現直觀的使用者介面,如圖一所示,其讓使用者可監控各種…...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 灰度图像恢复(100分) - 三语言AC题解(Python/Java/Cpp)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 …...

leetcode494. 目标和
1.思想方法 2.代码 class Solution { public int findTargetSumWays(int[] nums, int target) {int sum 0;for(int num : nums)sum num;if(sum < Math.abs(target) || (targetsum)%2 ! 0)return 0;int x (targetsum) / 2,n nums.length;//基于滚动数组的方法int[] dp…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...

Tauri2学习笔记
教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...