BLE SMP 配对 / 加密 / 密钥分发过程(附BT Snoop日志)

1. 第一张:SMP Security Request

你看到:

SMP Security Request

Auth Req: 0x08

Bonding Disabled

MITM Disabled

SC Enabled

这是 外设发给主机的安全请求

意思是模块在告诉手机:

我希望当前连接提升安全等级

我支持 Secure Connections

但这个 Security Request 里没有要求 Bonding

也没有要求 MITM

注意这里是模块发起的 Security Request,它只是一个"请求主机开始配对/加密"的触发信号。

这一包的原始 SMP payload 是:

0B 08

其中:

0B = Security Request 命令码

08 = AuthReq

2. 第二张:SMP Pairing Request

手机随后发送:

SMP Pairing Request Command

IO Capability: 0x04 - Keyboard Display

OOB Data: 0x00

Auth Req: 0x2D

Bonding Enabled

MITM Enabled

SC Enabled

Keypress Disabled

CT2 Enabled

Max Enc Key Size: 16

Initiator Key Distribution: 0x0B

Responder Key Distribution: 0x0B

这是 主机,也就是手机,发出的配对请求

重点看这几个字段。

IO Capability: Keyboard Display

手机告诉模块:

我具备键盘 + 显示能力

也就是手机既能显示数字,也能输入数字。

Auth Req: 0x2D

这个很关键:

Bonding Enabled

MITM Enabled

SC Enabled

CT2 Enabled

说明手机希望:

建立绑定关系

需要 MITM 保护

使用 LE Secure Connections

支持 CT2

也就是说,虽然模块一开始的 Security Request 里显示 Bonding Disabled、MITM Disabled,但手机发起 Pairing Request 时提出了更高的安全要求。

Key Distribution: 0x0B

Initiator Key Distribution: LTK IRK LinkKey Requested

Responder Key Distribution: LTK IRK LinkKey Requested

意思是双方后面会分发密钥,主要包括:

LTK:用于后续加密

IRK:用于身份地址解析

LinkKey:和跨传输密钥有关

3. 第三张:SMP Pairing Response

模块回复:

SMP Pairing Response Command

IO Capability: 0x03 - No Input No Output

OOB Data: 0x00

Auth Req: 0x0D

Bonding Enabled

MITM Enabled

SC Enabled

Keypress Disabled

CT2 Disabled

Max Enc Key Size: 16

Initiator Key Distribution: 0x03

Responder Key Distribution: 0x03

这是模块对手机的回应。

重点:

IO Capability: No Input No Output

模块告诉手机:

我没有输入能力

我也没有显示能力

这符合很多蓝牙模块的实际情况。

Auth Req: 0x0D

模块支持:

Bonding Enabled

MITM Enabled

SC Enabled

但是:

CT2 Disabled

所以最终安全能力要按双方共同支持的能力来协商。

Key Distribution: 0x03

模块这里请求/支持分发:

LTK

IRK

这说明后面会看到身份信息和身份地址信息的交换。

4. 第二、三张之间的一个重点:最终配对方式可能不是你表面想象的"输入密码"

虽然手机的 IO Capability 是:

Keyboard Display

但是模块是:

No Input No Output

这种组合通常不能做真正的 Passkey Entry 或 Numeric Comparison。

所以即使 AuthReq 里看到 MITM Enabled,实际可达的配对方式还要看双方 IO 能力组合。

你这个模块没有输入输出能力,所以实际体验上可能更接近:

系统弹配对确认

用户点允许

底层完成 LE Secure Connections

而不是让模块显示数字、手机输入数字。

5. 第四、五张:Pairing Public Key 交换

看到手机发送:

SMP Pairing Public Key Command

Public Key X: ...

Public Key Y: ...

然后模块也发送:

SMP Pairing Public Key Command

Public Key X: ...

Public Key Y: ...

这说明双方正在走 LE Secure Connections

LE Secure Connections 使用 ECDH,也就是椭圆曲线 Diffie-Hellman 密钥交换。

简单理解:

手机生成一对公私钥

模块生成一对公私钥

双方交换公钥

双方各自用自己的私钥 + 对方公钥

计算出相同的共享密钥

这个共享密钥后面会参与生成加密相关的 key。

所以看到 Pairing Public Key Command,可以明确判断:

这次配对不是传统 Legacy Pairing

而是 LE Secure Connections 配对

6. 第六张:Pairing Confirm

模块发:

SMP Pairing Confirm Command

Confirm Value: ...

这是配对确认值。

它的作用是:

双方先各自算出一个确认值

先交换确认值

后面再交换随机数

对方用随机数重新计算确认值

确认双方计算一致

它不是明文密码,也不是最终密钥,而是配对过程中的校验数据。

7. 第七、八张:Pairing Random

手机发送:

SMP Pairing Random Command

Random Value: ...

模块也发送:

SMP Pairing Random Command

Random Value: ...

这一步是为了配合前面的 Confirm Value 做验证。

流程大概是:

先交换 Confirm

再交换 Random

用 Random 重新计算 Confirm

验证是否匹配

如果验证失败,配对会失败。

如果验证成功,继续后续加密流程。

8. 第九、十张:DHKey Check

手机发送:

SMP Pairing DHKey Check Command

DHKey Check: ...

模块也发送:

SMP Pairing DHKey Check Command

DHKey Check: ...

这也是 LE Secure Connections 的关键步骤。

它用于确认双方基于 ECDH 算出来的共享密钥一致,并且配对参数没有被篡改。

看到这个,进一步确认:

当前配对流程是 LE Secure Connections

而不是 Legacy Pairing

9. 第十一张:LE Start Encryption

看到:

HCI Command

LE Start Encryption

Connection Handle: 0x0040

Random Number: 0000000000000000

Encrypted Diversifier: 0000

Long Term Key: ...

这是主机控制器开始加密链路。

意思是手机让蓝牙控制器对当前 BLE 连接启用加密。

这里出现:

Long Term Key

说明经过前面的配对过程后,双方已经得到了可用于链路加密的 LTK。

10. 第十二张:Encryption Change Complete

看到:

HCI Event

Encryption Change Complete - Encryption Enabled

Status: 0x00 - Success

Encryption Enable: 0x01

这是非常关键的结果。

它说明:

加密启用成功

当前 BLE 链路已经进入加密状态

所以到这里为止,可以认为:

SMP 配对关键流程完成

链路已经加密

后续可以访问要求加密的 GATT 特征/描述符

如果某些 Characteristic 或 Descriptor 要求加密读写,一般要等到这个阶段之后才更稳。

11. 第十三、十四张:模块发送 Identity Information 和 Identity Address Information

模块发:

SMP Identity Information Command

IRK: ...

接着发:

SMP Identity Address Information Command

Address Type: 0x00

Address: ...

这是模块在分发身份信息。

IRK 是什么?

IRK = Identity Resolving Key。

它用于解析设备身份,尤其是设备使用随机地址、隐私地址时,主机可以用 IRK 判断:

这个随机地址背后是不是之前绑定过的同一个设备

Identity Address 是什么?

模块还把自己的身份地址发给手机。

这里你截图中能看到地址。这个地址有识别度,后续不要公开。

这一步的意义是:

手机保存模块的身份信息

以后模块重连时,手机可以识别它是同一个已绑定设备

这就和"模块重新上电后系统自动重连"有关。

12. 第十五、十六张:手机发送自己的 Identity Information 和 Identity Address Information

手机也发送:

SMP Identity Information Command

IRK: ...

以及:

SMP Identity Address Information Command

Address Type: 0x00

Address: ...

这说明手机也把自己的身份信息分发给模块。

所以双方都保存对方身份信息。

这就是 Bonding 的一部分。

后续重连时,不需要完整重新配对,可以通过保存的密钥和身份信息恢复安全连接。

13. 整体时序总结

  1. 模块 → 手机:Security Request

模块请求提升安全等级,支持 Secure Connections。

  1. 手机 → 模块:Pairing Request

手机发起配对,请求 Bonding、MITM、SC,最大密钥长度 16。

  1. 模块 → 手机:Pairing Response

模块接受配对,声明自己 No Input No Output,支持 Bonding、MITM、SC。

  1. 手机 ↔ 模块:Pairing Public Key

双方交换 ECDH 公钥,说明使用 LE Secure Connections。

  1. 模块 → 手机:Pairing Confirm

发送确认值。

  1. 手机 ↔ 模块:Pairing Random

双方交换随机数,用于验证 Confirm。

  1. 手机 ↔ 模块:DHKey Check

双方验证 ECDH 计算结果和配对参数。

  1. 手机 → 控制器:LE Start Encryption

手机启动 BLE 链路加密。

  1. 控制器 → 手机:Encryption Change Complete

加密启用成功。

  1. 模块 → 手机:Identity Information

模块分发 IRK。

  1. 模块 → 手机:Identity Address Information

模块分发身份地址。

  1. 手机 → 模块:Identity Information

手机分发 IRK。

  1. 手机 → 模块:Identity Address Information

手机分发身份地址。

14. 这组日志说明了什么?

它说明了几个重要结论。

第一,这不是简单的普通 BLE 明文连接。

当前连接触发了 SMP 配对流程。

第二,这次配对使用了 LE Secure Connections。

证据是:

Pairing Public Key

DHKey Check

SC Enabled

第三,最终链路加密成功。

证据是:

Encryption Change Complete - Encryption Enabled

Status: Success

第四,双方完成了身份信息分发。

证据是:

Identity Information

Identity Address Information

IRK

Address

第五,这次连接具备 Bonding 行为。

证据是:

Pairing Request: Bonding Enabled

Pairing Response: Bonding Enabled

后续发生 IRK / Identity Address 分发

第六,后续自动重连和系统记住设备是有基础的。

因为双方已经交换并保存了密钥和身份信息。