btstack移植之安全配对(二)

3.13.3 Legacy配对

首先,我们回复的paring response中,可以看到我们不支持secure connection,所以我们走的是legacy配对模式。

图3-74 secure连接不支持

然后,master在pairing confirm包中回复了confirm value。

图3-75 master发送confirm value

这个数值是master端生成一个随机数后,将这个随机数作为输入,通过c1算法算出来的,叫做Mconfirm,接下来我们本地也需要生成一个随机数,通过c1算一下,算出来一个Sconfirm发给对方。

图3-76 配对phase2基本完成

到这一步我们的Sconfirm已经发过去了,流程进行到了这里

图3-77 just works配对流程

接下来我们卡死在check for confirm value match这里。

图3-78 confirm value fail

需要研究下C1算法了。

BLE的C1算法是蓝牙传统配对(Legacy Pairing)中用于生成确认值(Mconfirm/Sconfirm)的核心函数,以计算Mconfirm为例:

Mconfirm = c1(TK, Mrand, Pairing Request command, Pairing Response command, initiating device address type, initiating device address, responding device address type, responding device address)

其输入参数如下:

‌C1算法输入参数‌

‌临时密钥(TK)‌

128位临时密钥,由配对双方通过Passkey Entry等方式协商生成(如用户输入的6位数字扩展为128位)‌。

‌随机数(Rand)‌

主设备生成的128位随机数 ‌Mrand‌ 或从设备生成的 ‌Srand‌‌13。

‌设备地址(BD_ADDR)‌

双方设备的MAC地址(Initiator Address)和从设备的MAC地址(Responder Address)‌23。‌

双方设备的地址类型

Public还是Random的

双方的配对命令

Pairing Request Command和Pairing Response Command

上面这些参数中,蓝牙地址、地址类型、随机数都是空中包明文传输的,只有临时秘钥Tk是不可知的,但是在Just Works的场景下,Tk是固定值0,这也是为什么Just Works是不放置中间人攻击的,适合于安全需求较低的场景。

我们现在出现的情况显然是,C1计算的值和对端不一致,需要对比一下C1算法的输入哪里出了问题。

图3-79 C1算法过程

这里展开说两句,C1算法需要调用两次AES-128算法,对于这个算法,一般蓝牙controller是支持硬件加速的,所以我们可以采用图中的方式,将明文通过HCI LE Encrypt Command发送给controller,由controller进行AES-128计算后,通过HCI event返回host, 来减轻HOST的负担。支持这个命令的前提是,蓝牙初始化的时候,当Host询问controller支持哪些命令的时候,controller得把对应的位置上。

图3-80 Read Local Supported Commands

在代码里,我们是使能的:

图3-81 支持LE ENCRYPT COMMAND

当然,btstack也支持在host来直接进行AES计算,只要打开USE_BTSTACK_AES128这个宏就可以了。

仔细检查上述变量的值,我们发现了问题所在:

图3-82 发现参数错误

再往前翻一下,很快找到了根源

图3-83 初始化返回给host的蓝牙地址就是反的

原因找到了,我们的蓝牙地址是01:23:45:67:89:ab,对方在计算C1的时候也是采用的这个蓝牙地址作为参数来进行计算,但是当我们本地进行计算的时候,选用的蓝牙地址的来源不是实际的蓝牙地址,而是这个从HCI Send Read BD ADDR Command所得到的蓝牙地址,导致错误。

看了一下CEVA的controller协议栈,果然针对这个命令回复是有bug的:

图3-84 ceva返回读蓝牙地址命令的问题

修改一下,按照网络字节序交换一下:

图3-85 修改read bd addr命令回复代码

这样之后,后续的配对过程就很顺畅了,最终的数据都是加密的:

图3-86 数据加密了

C1算法就像情侣默契测试:

输入:双方生日(设备地址)、恋爱宣言(配对指令)、测试题(随机数)

陷阱:地址字节序反了就像把生日8月5日记成5月8日

验证:硬件加密加速相当于找算命先生合八字

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89427.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FRP配置( CentOS 7 上安装 FRP教程 )

** 如果你们公司没有公网IP,但是又想实现内网穿透,远程调用接口,在家也能调用公司服务器,但是nkg ssl有问题,花生壳坑壁,那么FRP是你最佳的选择!!!** 不过有个前提&#…

第三次mysql作业

建立库建立mydb11_syu库2.创建s表,创建sc表二.插入数据向s表插入数据2.向sc表插入数据三.查询1.分别查询student表和score表的所有记录2.查询student表的第2条到5条记录3.从student表中查询计算机系和英语系的学生的信息4.从student表中查询年…

不同场景下git指令的搭配

添加账号 git config --global user.name "YourName" git config --global user.email "your_emailexample.com"设置 Git 默认分支名称为 main: git config --global init.defaultBranch main初始化仓库: git init配置SSH 密钥 如果…

NLP——迁移学习

一、迁移学习的概念 1.预训练模型(Pretrained model) 定义: 简单来说别人训练好的模型。一般预训练模型具备复杂的网络模型结构;一般是在大量的语料下训练完成的。 2.微调(Fine-tuning) 定义:一般是对预训练语言模型,进行垂直领域数据的微调,…

Ubuntu 安装

文章目录硬件准备下载 Ubuntu 镜像创建可启动 USB从 USB 驱动器启动安装 Ubuntu不要忘记更新!用了十多年的笔记本,手边正好有个500G的固态,准备换上。考虑到机器的硬件配置,现在使用windows10实在是有点卡,ubuntu却刚好…

【46】MFC入门到精通——MFC显示实时时间,获取系统当前时间GetCurrentTime()、获取本地时间GetLocalTime()

文章目录1 MFC获取时间方法方法一:获取系统当前时间GetCurrentTime()方法二:获取本地时间GetLocalTime()使用GetTickCount()获取程序运行时间2 MFC显示实时时间 使用方法2.1 获取时间2.2 类向导 添加定时器函数 OnTimer2.3 初始化 设置定时器2.4 定时器函…

Linux717 SWAP扩容;逻辑卷条带化

root192.168.235.20s password:┌────────────────────────────────────────────────────────────────────┐│ • MobaXterm 20.0 • ││ …

人类社会发展过程中的熵增定律

引子研究美国罗斯福新政期间的法案为什么会对美国经济恢复起作用?与千金买马骨和移木赏金之间的区别与联系?以下为豆包 AI回答一、罗斯福新政法案对美国经济起作用的原因罗斯福新政(1933-1939年)通过一系列政策应对大萧条&#x…

Spring-AI系列-入门篇-核心概念、组件和生产要素

原文-Spring AI知识库,欢迎大家评论互动 师父领进门,修行靠自己。 Spring AI is an application framework for AI engineering. Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design an…

从浏览器到服务器:TCP 段的网络传输之旅

本文以简化的网络架构为例,详细介绍了当你在浏览器中输入网址(例如www.google.com)并按下回车键后,TCP段的完整传输过程。我们将探讨DNS解析、ARP、TCP/IP封装、PAT和路由如何协同工作,将数据从个人电脑通过局域网和广…

HCIE - 云计算拿下后的职业选择如何规划?

Hello!大家好,小编是一名专注 IT 领域的资深探索家。我们聊聊HCIE - 云计算,这个认证作为华为认证体系中云计算领域的专家级认证,标志着持有者具备企业级云架构设计、复杂云平台运维及跨场景技术落地能力。但认证本身只是职业进阶…

1-创建Vue3项目

创建Vue3项目前提 已安装 18.3 或更高版本的 Node.js vue 官网 https://vuejs.org/ 创建一个 Vue 应用 ① 新建项目目录,使用 VSCode 打开 VSCode 可安装 Vue-Official 插件协助开发 ② 执行 create vue 指令创建 vue 应用 npm create vuelatest这一指令将…

Codex,Copilot 是什么

Codex是什么 Codex 是 OpenAI 研发的一款专注于代码生成的大型语言模型,它可以根据自然语言描述自动编写程序代码,在软件开发、自动化测试等领域展现出了强大的应用潜力。下面为你详细介绍: 1. 核心功能 代码生成:Codex 能够依据自然语言指令生成代码,像函数、类或者完整…

Typecho插件开发:自定义表单验证规则addRule实战指南

文章目录 Typecho表单验证进阶:为插件和主题添加自定义addRule验证规则 引言 一、Typecho表单验证基础 1.1 Typecho表单系统概述 1.2 addRule方法解析 二、自定义验证规则实现 2.1 创建自定义验证类 2.2 注册自定义验证规则 2.3 使用自定义验证规则 三、高级验证场景实现 3.1 …

数据分布是如何影响目标检测精度的

文章目录一、研究背景与目标模型效果提升数据集优化二、研究问题明细各方向的关联性与核心逻辑1. 高质量数据集的高效筛选与主动学习应用2. 基于推理结果的数据补充与增强方向优化3. 多类别场景下目标尺度与模型精度的关联性4. 损失函数与数据增强对精度的量化影响5. 目标类型专…

Python 网络爬虫 —— 代理服务器

一、会话(Session)(一)核心逻辑HTTP 本身无记忆,每次请求独立。会话(Session) 就是为解决这问题,让客户端(浏览器)和服务器 “记住” 交互状态(比…

Vue在线预览Excel和Docx格式文件

前提:本次示例基于Vue2.x,所用插件为Vue-Office。 一、Vue-Office 插件简介 Vue-Office 是一个一站式解决方案,支持多种 Office 文件格式的在线预览,包括: Word(.docx)Excel(.xlsx、…

提升(Boosting)及 Python 示例

咱们结合这张图,把 “提升” 想象成 “做错题本 请老师补课” 的过程:第一波数据(最上面的圆圈):“第一次作业”假设你第一次做 100 道数学题(图中圆圈里的绿点白点代表不同的题),做…

【生产实践】Linux中NAS挂载丢失后提示“过旧的文件句柄”错误解决

太长不看版: 问题:nas挂载在系统里掉了,使用df或ls访问目录提示过旧的文件句柄解决过程: 和机房联系,发现NAS服务器重启了重新执行mount发现挂不上先umount掉当前挂载,再重新执行mount命令问题解决 umount …

JUnit4

JUnit4 介绍JUnit 是 Java 编程语言的单元测试框架,用于编写和运行可重复的自动化测试。JUnit 特点:JUnit 是一个开放的资源框架,用于编写和运行测试。提供注解来识别测试方法。提供断言来测试预期结果。JUnit 测试允许你编写代码更快&#x…