BLE动态密钥抓包专题1

我帮你把抓包和配对流程对应起来,先给结论,再拆解细节:
✅ 结论:这张抓包,实现了 BLE 配对流程的 第一阶段:配对信息交换
也就是整个配对流程的第一步:交换双方的安全能力和参数。
一、配对流程的三阶段对照
根据你提供的文档,BLE 配对分为三个阶段:
- 第一阶段:配对信息交换(Pairing Request/Response)
- 第二阶段:链路认证(根据 IO 能力生成 TK/STK)
- 第三阶段:密钥分配(LTK/IRK/CSRK 等)
你这张抓包,就是完整的第一阶段流程,包含了主机发的请求和设备发的响应。
二、抓包的详细拆解(对应第一阶段)
1. 主机(Central)发送的 Pairing Request(Frame 767)
这是配对流程的发起方,包含了主机的所有安全配置信息:
Opcode: Pairing Request (0x01):标准配对请求包AuthReq: 0x05:对应文档里的AuthReq字段,解析为:Bonding: 0x01(绑定标志位,请求绑定设备)MITM: 0x01(需要中间人保护)
IO Capability: Keyboard, Display:主机支持键盘和显示屏,可输入密码、显示PIN码Initiator/Responder Key Distribution:主机和从机都支持分发 LTK 和 IRK 密钥
这一步的作用,就是文档里说的:客户端告诉服务端“我支持这些安全能力”。
2. 设备(Peripheral)发送的 Pairing Response(Frame 770)
这是设备对主机请求的回应:
Opcode: Pairing Response (0x02):标准配对响应包AuthReq: No Bonding, MITM:设备回应的安全配置,这里设置了 不绑定(No Bonding),但支持 MITM 保护Key Distribution: None:设备暂时不分配任何密钥(LTK/IRK 都为 None)
这一步的作用,就是文档里说的:服务端告诉客户端“我支持这些安全能力”。
三、为什么这是「第一阶段」?
- 这两个包交换完成后,只是协商了双方的安全参数和配对方式,还没有进行任何密钥计算和加密。
- 后续的链路认证(如 Just Works/输入密码)、密钥分配(LTK/STK 计算)都还没有开始。
- 你的设备在响应里设置了
No Bonding和Key Distribution: None,说明设备拒绝了主机的绑定请求,配对流程到这里就会终止,不会进入后续的加密阶段。
一句话总结
这张抓包,就是 BLE 配对流程的第一步:配对信息交换,完成了主机和设备之间的安全能力协商,但因为设备拒绝了绑定请求,流程到此结束,没有进入后续的链路认证和密钥分配阶段。

这张抓包完整呈现了 BLE配对第一阶段(配对信息交换)的一次协商失败,我给你拆解清楚:
一、抓包的完整流程
-
Frame 767:主机(手机)发送
Pairing Request(配对请求)AuthReq: 0x05:主机请求开启Bonding(绑定)+MITM(中间人保护)IO Capability: Keyboard, Display:主机支持输入/显示(可输入PIN码)Key Distribution:主机请求双方交换LTK(长期密钥)和IRK(身份解析密钥)
→ 主机的目标:和设备建立带绑定、可加密、可重连的安全连接
-
Frame 768:设备回复
Empty PDU(空包)
这是一个链路层空包,仅捎带对前一个包的ACK,没有任何SMP层的内容。 -
Frame 770:设备回复
Pairing Response(配对响应)AuthReq: 0x04:设备同意MITM保护,但明确拒绝了Bonding(绑定)IO Capability: Display Only:设备仅支持显示,不支持输入,这意味着设备只能用Just Works或显示PIN码的方式配对Key Distribution: <none>:设备明确表示,本次配对不交换任何密钥(LTK/IRK/CSRK都不发)
二、核心矛盾:主机和设备的安全需求不匹配
- 主机:想要 带绑定的长期安全连接(交换LTK,重连不用再配对)
- 设备:只接受 无绑定的临时加密连接(不存密钥,断开即失效)
这种需求不匹配,导致了配对流程的提前终止:
- 设备回复
No Bonding+No Key Distribution,直接拒绝了主机的绑定请求 - 主机收到这个响应后,无法继续后续的密钥分配阶段,配对流程就此结束
- 最终结果:连接可以建立,也能使用,但没有绑定,不会生成和存储LTK,下次重连会重新走一次配对流程
三、这个抓包说明了什么?
- 配对流程只走完了第一阶段:仅完成了安全参数协商,没有进入第二、第三阶段(链路认证、密钥分配)。
- 设备的安全配置是“非绑定模式”:这是Nordic工程的默认配置,设备不想存储任何密钥,只接受一次性的临时连接。
- 主机的绑定请求被拒绝:如果你的应用需要绑定功能(比如门锁、心率带重连免配对),就需要修改设备的安全配置,开启绑定(Bonding)和密钥分发。
四、怎么修改配置,让设备支持绑定?
在你的Nordic工程里,需要修改 ble_gap_sec_params_t 结构体:
ble_gap_sec_params_t sec_params = {
.bond = 1, // 开启绑定
.mitm = 1, // 开启MITM保护
.lesc = 0,
.keypress = 0,
.io_caps = BLE_GAP_IO_CAPS_DISPLAY_ONLY, // 或改为支持键盘的模式
.oob = 0,
.min_key_size = 7,
.max_key_size = 16,
.kdist_own.enc = 1, // 设备分发LTK
.kdist_own.id = 1, // 设备分发IRK
.kdist_peer.enc = 1,
.kdist_peer.id = 1,
};
这样修改后,设备的配对响应里就会包含密钥分发标志,主机就能和设备完成完整的绑定流程了。

这张抓包展示了 BLE 配对流程的完整第二阶段(链路认证)和第三阶段(加密启动),但最终以「MIC校验失败」告终。我给你逐帧拆解,说明每一步发生了什么。
一、核心结论
这是一次完整的链路认证和加密协商流程,但在最后一步加密启动时失败了,失败原因是:
Encrypted packet decrypted incorrectly (bad MIC)
即:设备和手机生成的加密密钥不一致,导致完整性校验失败。
二、抓包流程逐帧解析
1. Pairing Confirm(配对确认)
- 包:
Sent Pairing Confirm/Rcvd Pairing Confirm - 作用:双方根据之前协商的配对方式(如 Just Works / Passkey),生成并交换
Confirm Value,验证对方是否持有相同的临时密钥(TK)。 - 你截图里的
Confirm Value: 4b752b6c862e5c2d7eab1ef3dd54e693,就是主机发送的确认值。 - 这一步是链路认证的核心,用来验证双方的临时密钥是否一致。
2. Pairing Random(随机数交换)
- 包:
Sent Pairing Random/Rcvd Pairing Random - 作用:双方交换各自生成的随机数(
Rand),用来计算最终的短期密钥(STK)。 - 这两个随机数和之前的
Confirm Value一起,用来验证对方的密钥是否正确。
3. LL_ENC_REQ / LL_ENC_RSP(加密请求/响应)
- 包:
LL_ENC_REQ(主机发)/LL_ENC_RSP(设备回) - 作用:双方协商加密参数,请求使用STK对连接进行加密。
- 主机发送加密请求,设备回复加密响应,准备进入加密状态。
4. LL_START_ENC_REQ(启动加密请求)
- 包:
LL_START_ENC_REQ - 作用:主机正式请求开启加密连接,使用协商好的STK进行加密。
5. Encrypted packet decrypted incorrectly (bad MIC)(加密包解密错误)
- 错误标记:
Encrypted packet decrypted incorrectly (bad MIC) - 原因:Wireshark/nRF Sniffer 无法用当前的密钥解密这个包,说明:
- 要么是双方生成的STK不一致,导致设备加密的包手机无法解密,反之亦然;
- 要么是抓包器没有配置正确的LTK/STK,无法解析加密后的数据包。
三、流程整体解读
这是一次完整的配对链路认证流程:
- 双方通过
Pairing Confirm和Pairing Random验证了临时密钥(TK)的一致性。 - 基于TK计算出了短期密钥(STK),并协商加密参数。
- 主机请求启动加密,设备同意。
- 当第一个加密包发出时,MIC校验失败,加密流程失败,连接无法进入加密状态。
四、为什么会失败?
最常见的原因有两个:
- 配对方式不匹配:主机和设备的IO能力不匹配,导致配对算法(如Just Works)生成的TK不一致,最终STK也不一致。
- 抓包器无法解密:nRF Sniffer 没有获取到STK/LTK,无法解密加密包,Wireshark直接标记为
bad MIC。
五、怎么验证?
- 看你的 Nordic 工程日志,是否输出了
STK generated和Encryption enabled的日志。 - 如果日志显示加密成功,说明是抓包器没有配置密钥,无法解密;如果日志也显示加密失败,说明是设备端的配对配置有问题。

这张抓包是 BLE 配对流程「第二阶段(链路认证)」的核心环节之一,我给你拆解清楚:
🔍 这是什么包?
这是设备(Peripheral,你的 Nordic 板子)发给主机(Central,手机)的 Pairing Confirm(配对确认)包,Opcode 为 0x03,是链路认证的关键步骤。
📌 它在配对流程中的作用
在 BLE 配对的链路认证阶段,双方会按以下步骤交互:
- 主机发送
Pairing Confirm(你上一张截图里的包) - 设备回复
Pairing Confirm(就是这张截图里的包) - 双方再交换
Pairing Random随机数
这一步的核心目的,是验证双方是否持有相同的临时密钥(TK):
- 设备根据协商好的配对算法(如 Just Works)和随机数,生成了
Confirm Value: 6e5def29dbcc875e89f76cb9a07220 - 主机收到这个值后,会用自己生成的 TK 计算一个预期的 Confirm Value
- 如果两个值匹配,说明双方的临时密钥一致,链路认证通过;如果不匹配,配对就会失败
💡 结合你之前的抓包来看
- 主机发了
Pairing Confirm,设备回复了这张Pairing Confirm,说明双方已经完成了 TK 的生成和交换 - 下一步就是交换
Pairing Random随机数,用来生成最终的短期密钥(STK) - 再之后就是
LL_ENC_REQ/LL_ENC_RSP加密协商和LL_START_ENC_REQ启动加密
一句话总结
这张抓包是设备对主机的 Pairing Confirm 响应,是链路认证阶段验证临时密钥(TK)一致性的关键一步。

这张抓包是 BLE 配对第二阶段(链路认证)的关键步骤:主机发送 Pairing Random(配对随机数)包,我给你拆解清楚它的作用和上下文。
🔍 这是什么包?
这是主机(Central,手机)发给设备(Peripheral,你的 Nordic 板子)的 Pairing Random 包:
- Opcode:
0x04 - 核心数据:
Random Value: 0217c851d848f52723f6ecd8b151a471(16字节随机数)
📌 它在配对流程中的位置
在链路认证阶段,双方的交互顺序是:
- 主机发送
Pairing Confirm - 设备回复
Pairing Confirm - 主机发送
Pairing Random(就是你这张截图的包) - 设备回复
Pairing Random
这个包的作用是提供生成短期密钥(STK)所需的随机数。
💡 它的核心作用
-
STK 生成的输入参数
STK(短期密钥)的计算公式为:
STK = E_TK(Rand_M | Rand_S)Rand_M:主机发送的随机数(就是这张截图里的Random Value)Rand_S:设备回复的随机数TK:链路认证阶段生成的临时密钥
这一步就是主机把Rand_M发给设备,供双方计算STK使用。
-
防止重放攻击
每次配对都会生成不同的随机数,确保每次生成的STK都是唯一的,无法被攻击者重复利用旧的密钥和数据。
🔗 结合你之前的抓包看流程
你现在已经走完了链路认证的完整交互:
- 主机和设备交换了
Pairing Confirm,验证了TK的一致性 - 主机发送
Pairing Random,设备也回复了自己的随机数 - 双方现在可以基于这两个随机数和TK,计算出最终的STK,进入后续的加密协商阶段
✅ 总结
这张抓包是BLE配对第二阶段链路认证的收尾步骤,主机向设备提供了生成STK所需的随机数,为后续的加密连接(LL_ENC_REQ/LL_START_ENC_REQ)提供了必要的输入。

这张抓包是 BLE 配对流程中「加密启动阶段」的核心请求包,我给你拆解清楚它的作用和上下文:
🔍 这是什么包?
这是主机(手机)发给设备(你的 Nordic 板子)的 LL_ENC_REQ(链路层加密请求)包,Opcode 为 0x03。
📌 它在配对流程中的位置
这是配对流程的倒数第二步,发生在:
- 第一阶段:配对信息交换(Pairing Request/Response)
- 第二阶段:链路认证(Pairing Confirm/Random,生成STK)
- 第三阶段:加密启动(LL_ENC_REQ/LL_ENC_RSP) ← 你这张截图的位置
- 最后一步:
LL_START_ENC_REQ(正式启动加密)
💡 包内关键信息解析
-
Central Session Key Diversifier和Central Session Initialization Vector
这两个字段是主机提供的会话密钥参数,和之前生成的 STK(短期密钥)一起,用来计算本次连接的加密密钥。 -
Response in Frame: 1491 / 1495
抓包工具标记了这两个帧是它的响应包,也就是设备会回复LL_ENC_RSP来同意加密请求,然后主机再发LL_START_ENC_REQ正式开启加密。 -
Random Number: 0/Encrypted Diversifier: 0
这两个值为0,说明这是首次加密,不是重连恢复加密(重连会用EDIV和Rand来恢复LTK)。
🔗 结合你之前的抓包看完整流程
- 你已经完成了
Pairing Confirm和Pairing Random,生成了STK - 主机现在发
LL_ENC_REQ,请求用STK对连接进行加密 - 设备回复
LL_ENC_RSP同意后,主机发LL_START_ENC_REQ,连接就进入加密状态了
✅ 一句话总结
这张抓包是主机向设备发起的加密请求,标志着BLE配对流程已经进入了最后的加密启动阶段,只要设备同意并回复响应,连接就会进入加密状态。

这张抓包是设备(你的 Nordic 板子)对主机加密请求的正式响应,标志着BLE配对流程的「加密启动阶段」已达成共识。
🔍 包的核心信息
这是设备发给主机的 LL_ENC_RSP(链路层加密响应)包,Opcode 为 0x04,是对前序 LL_ENC_REQ 的回应。
关键字段解读
Peripheral Session Key Diversifier:设备生成的会话密钥区分符Peripheral Session Initialization Vector:设备生成的会话初始化向量- 这两个参数,会和主机提供的参数、之前链路认证生成的STK一起,计算出本次连接的会话加密密钥。
📌 它在配对流程中的作用
- 确认加密请求:设备明确同意主机发起的加密请求,双方就加密参数达成一致。
- 提供加密参数:设备提供自己的会话密钥参数,和主机的参数一起,用来计算会话密钥。
- 为下一步做准备:主机收到这个响应后,就可以发送
LL_START_ENC_REQ,正式启动加密连接。
🔗 结合你之前的抓包看完整流程
到这一步,配对流程已经走完了:
- 第一阶段:配对信息交换(Pairing Request/Response)
- 第二阶段:链路认证(Pairing Confirm/Random,生成STK)
- 第三阶段:加密协商(LL_ENC_REQ/LL_ENC_RSP,参数交换)
接下来,只要主机发送 LL_START_ENC_REQ,连接就会正式进入加密状态,后续的所有数据包都会被加密传输。
✅ 一句话总结
这张抓包是设备对主机加密请求的同意回应,双方已经完成了加密参数协商,即将进入正式的加密连接状态。

这张抓包是BLE配对流程的最后一步:正式启动加密连接,我给你拆解清楚它的意义和上下文。
🔍 包的核心信息
这是设备发给主机的 LL_START_ENC_REQ(启动加密请求)包,Opcode 为 0x05。
它是对前面 LL_ENC_REQ/LL_ENC_RSP 协商的收尾,标志着双方准备好切换到加密模式。
📌 它在配对流程中的位置
这是整个配对流程的最后一步,前面的步骤都已完成:
- 第一阶段:配对信息交换(
Pairing Request/Response) - 第二阶段:链路认证(
Pairing Confirm/Random,生成STK) - 第三阶段:加密协商(
LL_ENC_REQ/LL_ENC_RSP,交换会话参数) - 第四阶段:启动加密(
LL_START_ENC_REQ) ← 这张截图的位置
💡 它的核心作用
- 双方通过之前的步骤,已经生成了一致的短期密钥(STK),并交换了会话参数。
- 这一步是设备向主机发送信号,表示:“我已准备好使用协商好的STK对连接进行加密,请在下次连接事件中切换到加密模式”。
- 主机收到这个请求后,会在下一个连接事件里,对后续的所有数据包启用加密和MIC校验。
🔗 结合你之前的抓包看结果
到这一步,配对流程已经全部完成:
- 链路认证通过,双方持有相同的STK
- 加密参数协商完成
- 双方都同意启动加密
理论上,后续的所有LL层和ATT层数据包,都应该被加密传输,且包含有效的MIC校验。
你之前抓包中出现的 Encrypted packet decrypted incorrectly (bad MIC),大概率是抓包器没有配置正确的STK,无法解密导致的,而非设备端配对失败。
✅ 一句话总结
这张抓包是BLE配对流程的终点,标志着双方协商一致,准备正式进入加密连接状态。

这张抓包,是你整个配对流程的最终结果:加密连接启动失败,抓包器无法解析后续的加密包。我给你拆解清楚问题根源和含义:
🔍 核心现象
这是一个被标记为 Encrypted packet decrypted incorrectly (bad MIC) 的包:
Encrypted: Yes:连接已经尝试进入加密状态MIC: Error:消息完整性校验失败,Wireshark/nRF Sniffer 无法解密这个包Control Opcode: Unknown (0xb8):因为解密失败,无法解析出实际的控制指令
📌 为什么会出现 bad MIC?
结合你前面的配对流程,有两种完全不同的可能:
可能性1:设备端配对成功,但抓包器配置错误(最常见)
你的设备和手机已经完成了配对、生成了一致的STK,并成功进入了加密状态。但抓包器因为没有配置正确的密钥,无法解密加密后的包,导致误报 bad MIC:
- 你选的
Legacy Passkey不对,应该选Legacy LTK/Legacy Passkey并填入正确的STK/LTK - 密钥填错了、位数不对,或者配对模式和密钥类型不匹配(用了LTK去解首次配对的STK)
- 抓包器的时序或信道同步有问题,丢了前面的加密协商参数
这种情况下,设备端的配对和加密是正常的,只是抓包工具看不到明文数据。
可能性2:设备端配对失败,STK不一致
设备和手机在链路认证阶段生成的STK不一致,导致加密包的MIC校验失败,手机和设备之间也无法正常通信:
- 你的设备配置了
Display OnlyIO能力,和手机的键盘+显示屏能力不匹配,导致Just Works配对算法生成的TK不一致 - 配对流程中某个环节丢包(比如
Pairing Confirm或Random包丢失),导致STK计算失败 - 设备的安全配置(如
Bonding、MITM标志)和手机的需求不匹配,导致配对提前终止,没有生成有效的STK
这种情况下,设备和手机的连接虽然能维持,但加密是无效的,后续的通信会持续出错或断开。
💡 怎么区分这两种情况?
看你的 Nordic 设备串口日志:
- 如果日志输出了
Encryption enabled或Security update success,说明设备端配对加密成功,问题在抓包器配置 - 如果日志输出了
Pairing failed或Encryption rejected,说明设备端配对失败,STK不一致,需要修改安全配置
✅ 一句话总结
这张抓包是配对流程的收尾:要么是抓包器没有配置正确的密钥,无法解密加密包;要么是设备和手机的STK不一致,加密校验失败。
浙公网安备 33010602011771号