在万物互联时代,低功耗蓝牙(BLE)设备的安全性至关重要。本文基于 Bluetooth 6.0 规范,通过完整的加密示例数据,深度解析 BLE 加密的技术细节,涵盖从密钥协商到数据传输的全流程。主要掌握以下信息:
✅ 加密参数的数学推导(LTK/SKD/SK/IV)
✅ HCI 与 LL 层的交互协议
✅ 消息完整性校验(MIC)的实现原理
✅ 加密数据的分组格式与传输逻辑
✅ 实战中的安全增强策略
一、示例参数与流程总览(MSO → LSO 顺序)
1.1 基础密钥参数
参数名称 | 十六进制值(16 进制) | 长度 | 说明 |
LTK(长期密钥) | 4C683841 39F574D8 36BCF34E 9DFB01BF | 16B | 设备配对的根密钥 |
EDIV(加密多样化器) | 2474 | 2B | 防止密钥重用 |
RAND(随机数) | ABCDEF12 34567890 | 8B | 一次性随机挑战值 |
SKD_C(中央密钥数据) | ACBDCEDE F10213(LSO: 1302F1E0 DFCEBDAC) | 8B | 中央设备会话密钥种子 |
SKD_P(外围密钥数据) | 02132435 46576879(LSO: 79685746 35241302) | 8B | 外围设备会话密钥种子 |
IV_C(中央 IV) | BADCAB24(LSO: 24ABDCBA) | 4B | 中央设备初始化向量 |
IV_P(外围 IV) | DEAFBABE(LSO: BEBAAFDE) | 4B | 外围设备初始化向量 |
1.2 复合参数生成
IV = IV_P || IV_C = BEBAAFDE 24ABDCBA → [8B]
SKD = SKD_P || SKD_C = 7968574635241302 1302F1E0DFCEBDAC → [16B]
SK = AES-ECB(LTK, SKD) → 99AD1B5226A37E3E058E3B8E27C2C666 [16B]
1.3 流程时序图
二、加密启动流程:HCI 与 LL 的协同作战
2.1 HCI 层命令交互(MSO → LSO 字节序)
中央设备:加密启用命令(HCI_LE_Enable_Encryption)
HCI_LE_Enable_Encryption (0x1C)
参数:
Handle: 0x0800 (连接句柄)
Random: 0xABCDEF1234567890 (8字节随机数)
EDIV: 0x2474 (2字节加密多样化器)
LTK: 0x4C68384139F574D836BCF34E9DFB01BF (16字节长期密钥)
外围设备:密钥请求响应(HCI_LE_Long_Term_Key_Request_Reply)
HCI_LE_Long_Term_Key_Request_Reply (0x12)
参数:
Handle: 0x0801
Key: 0x4C68384139F574D836BCF34E9DFB01BF (回传LTK)
2.2 LL 消息交互
中央设备发起加密请求(LL_ENC_REQ)
LL_ENC_REQ (0x17):
▶ 控制类型: 0x03(加密请求)
▶ RAND: 9078563412EFCDAB(8字节随机数)
▶ EDIV: 7424(2B)
▶ SKD_C: 1302F1E0DFCEBDAC(8B)
▶ IV_C: 24ABDCBA(4B)
外围设备响应加密(LL_ENC_RSP)
LL_ENC_RSP (0x0D):
◀ 控制类型: 0x04(加密响应)
◀ SKD_P: 7968574635241302 (8字节)
◀ IV_P: BEBAAFDE(4字节)
2.3 会话密钥生成
SKD = SKD_P || SKD_C (LSO → MSO顺序)
SKD = 0x1302F1E0DFCEBDAC7968574635241302
SK = AES-ECB(LTK, SKD) = 0x99AD1B5226A37E3E058E3B8E27C2C666
2.4 流程时序图(UML 序列图)
三、密钥派生与加密算法:AES-ECB 的工程应用
3.1 会话密钥生成(SK = AES-ECB (LTK, SKD))
输入:
LTK = [4C 68 38 41 39 F5 74 D8 36 BC F3 4E 9D FB 01 BF]
SKD = [79 68 57 46 35 24 13 02 13 02 F1 E0 DF CE BD AC]
AES-ECB 计算过程:
1. 填充 SKD 到 16B(已满足)
2. AES 加密 LTK 对 SKD 进行处理
输出:
SK = [99 AD 1B 52 26 A3 7E 3E 05 8E 3B 8E 27 C2 C6 66]
3.2 初始化向量(IV)构建
IV 结构 (8B):
┌───────────┬───────────┐
│ IV_P (4B) │ IV_C (4B) │
├───────────┼───────────┤
│ BE BA AF DE │ 24 AB DC BA │
└───────────┴───────────┘
→ IV = DEAFBABEBADCAB24(MSO 顺序)
3.3 加密模型公式
\text{Ciphertext} = \text{AES-ECB}(SK, B_i) \oplus \text{Plaintext}_i \\
\text{MIC} = \text{AES-ECB}(SK, B_n)[0:3] \quad (\text{取前4字节})
四、控制消息加密:LL_START_ENC_RSP1 解析
4.1 参数准备(B 向量生成)
B0 = 49000000 008024AB DCBABEBF DE0001(控制包特征值)
B1 = 00010300 00000000 00000000 00000000(固定头)
B2 = 06000000 00000000 00000000 00000000(控制类型)
4.2 加密计算过程
X1 = AES-ECB(SK, B0) → 712EAAAA E6060352 1D245E50 786EEFE4
X2 = AES-ECB(SK, X1 ⊕ B1) → DEBC4378 2A022675 FCA0AA6F 0854F1AB
X3 = AES-ECB(SK, X2 ⊕ B2) → 6399913F EDE5FA11 1BDB993B BFB9BE06
MIC = X3[0:3] → 6399913F(MSO: CDA7F448)
加密负载 = X3[4:7] → 9F(控制类型加密值)
4.3 数据包结构
LL_START_ENC_RSP1 (0x05):
┌──────┬────────┬───────────┐
│ 长度 │ 加密控制 │ MIC(4B) │
├──────┼────────┼───────────┤
│ 05 │ 9F │ CDA7F448 │
└──────┴────────┴───────────
3.3 数据消息加密(LL_DATA1)
明文数据:
Clear Data: 0x1700636465666768696A6B6C6D6E6F707131323334353637383930 (27字节)
加密计算:
B0 = 0x49010000008024ABDCBABEBAAFDE001B (数据包特征值)
S0 = AES-ECB(SK, B0) ⊕ 明文 = 0x7A70D66415226DF26B17839A06040559
加密负载 = S0 || S1 || S2 (27字节)
MIC = X4[0..3] = 0xF75A6D33 (取前4字节)
数据包结构:
LL_DATA1 (0x1F)
┌────────┬───────────────────────────────┬──────────┐
│ Length │ Encrypted Data (27字节) │ MIC (4字节)│
├────────┼───────────────────────────────┼──────────┤
│ 0x1F │ 0x7A70D664...E6FF32 │ 0xF75A6D33 │
└────────┴───────────────────────────────┴──────────┘
五、数据传输:LL_DATA1 加密全解析
5.1 明文数据(27 字节)
Clear Data (LSO顺序):
17 00 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 31 32 33 34 35 36 37 38 39 30
→ "17 00 c d e f g h i j k l m n o p q 1 2 3 4 5 6 7 8 9 0"
5.2 B 向量生成(数据包特征值)
B0 = 49010000 008024AB DCBABEBF DE001B(数据包序号+长度)
B1 = 00010200 00000000 00000000 00000000(数据包头)
B2 = 17006364 65666768 696A6B6C 6D6E6F70(数据内容前缀)
B3 = 71313233 34353637 38393000 00000000(数据内容后缀)
5.3 加密与 MIC 计算
X1 = AES-ECB(SK, B0) → 7C688612 996DE101 F3EACB68 B443969C
X2 = AES-ECB(SK, X1 ⊕ B1) → E3F1EF5C 30161C0A 9EC07274 A0757FC8
X3 = AES-ECB(SK, X2 ⊕ B2) → E7E346F5 B7C8A607 2890A60D CF4EC20A
X4 = AES-ECB(SK, X3 ⊕ B3) → 3DB11332 0B182F9F ED635DB1 4CAC2DF0
加密负载:
S0 = X1 ⊕ B0[数据部分] → 7A70D664 15226DF2 6B17839A 06040559
S1 = X2 ⊕ B1[数据部分] → 6BD6564F 796B5B9C E6FF32
MIC = X4[0:3] → 3DB11332(MSO: F75A6D33)
5.4 数据包结构(LL_DATA1)
LL_DATA1 (0x1F = 31B):
┌──────┬───────────────────────┬───────────┐
│ 长度 │ 加密数据(27B) │ MIC(4B) │
├──────┼───────────────────────┼───────────┤
│ 1F │ 7A70D664...E6FF32 │ F75A6D33 │
└──────┴───────────────────────┴───────────┘
六、MIC 生成原理:消息完整性的数学保障
6.1 MIC 算法步骤
构建 B 向量:包含数据包类型、序号、长度、内容哈希
AES 迭代加密:通过 AES-ECB 对 B 向量进行三轮加密
截断取前 4 字节:X3 [0:3] 作为 MIC 值
6.2 控制消息 vs 数据消息
消息类型 | B 向量特征值差异 | MIC 长度 | 校验范围 |
控制消息 | B0 [3:4] = 0080(控制标识) | 4B | 控制头 |
数据消息 | B0 [3:4] = 0180(数据标识) | 4B | 数据内容 + 头 |
6.3 抗篡改验证
接收方验证逻辑:
1. 提取加密负载与 MIC
2. 重新计算 B 向量(基于数据包元数据)
3. 执行 AES-ECB 得到 X3
4. 比较计算 MIC 与接收 MIC
▶ 匹配 → 数据完整
▶ 不匹配 → 数据篡改(终止连接)
七、包结构全览(对比分析)
7.1 控制消息 vs 数据消息
字段 | 控制消息(LL_START_ENC_RSP) | 数据消息(LL_DATA) |
长度 | 0x05(5B) | 0x1F(31B) |
控制类型 | 加密值(0x9F/0xA3) | 固定 0x17(数据标识) |
明文部分 | 无 | 数据头(17 00 + 长度) |
加密部分 | 控制类型(1B) | 有效载荷(N-4B) |
MIC 位置 | 末尾(4B) | 末尾(4B) |
7.2 加密前后对比(LL_DATA1)
部分 | 明文(LSO 顺序) | 密文(LSO 顺序) |
数据头 | 17 00 | 17 00(不加密) |
有效载荷 | 63 64 65 66...39 30(25B) | 7A 70 D6 64...E6 FF 32(25B) |
MIC | 无 | F7 5A 6D 33(4B) |
八、常见问题与调试技巧
8.1 加密失败排查流程
密钥校验:检查 LTK/EDIV 是否匹配(通过
btif_storage_get_ble_bonding_key
)IV 同步:确认双方 IV_P/IV_C 的组合正确性
MIC 计算:使用 Wireshark 抓包验证 B 向量生成
硬件一致性:检查 AES 加速模块的字节序设置
8.2 协议栈调试命令
# 查看已配对设备(BlueZ 示例)
hciconfig hci0 piscan
bt-device -l
# 导出密钥存储
cat /var/lib/bluetooth/*/info
# 抓包分析(使用 Ubertooth)
btmon -P -u
8.3 密钥同步失败
现象: HCI返回
Command Disallowed
错误原因: 从机未正确响应
Long_Term_Key_Request
解决方案: 检查LTK分发流程,确保密钥交换顺序
8.4 MIC校验失败
现象: 数据包被丢弃并触发重传
原因: IV重复使用或密钥错误
解决方案: 实现IV序列号管理,增加密钥刷新机制
8.5 性能优化点
密钥缓存:使用 LRU 缓存最近使用的 SK/SKD
AES 硬件加速:启用 Cortex-M 系列的 CryptoCell 硬件模块
批量加密:合并多个小数据包为一个加密传输单元
九、实战建议与扩展
9.1 注意事项
密钥存储:使用安全存储(如 Android Keystore)保存 LTK
IV 管理:每个连接唯一,按数据包递增
MIC 校验:接收方必须验证 MIC 有效性
版本兼容:处理不同蓝牙协议版本(如 LE Secure Connections)
9.2 协议栈调试技巧
使用 Wireshark 抓包分析 LL 层加密负载
打印关键参数(SKD, SK, IV)进行一致性校验
实现
btif_storage_get_ble_bonding_key
调试接口验证
remove_devices_with_sample_ltk
机制(防止测试密钥泄露)
9.3 扩展学习
Bluetooth Core Spec v5.3: Volume 3, Part H (加密规范)
AES-ECB 模式在 BLE 中的应用限制
LE Secure Connections 与传统加密的差异
前向保密(FS)机制实现
十、附录:关键术语对照表
术语 | 全称 | 本文简写 | 说明 |
LTK | Long Term Key | LTK | 长期密钥(16 字节) |
EDIV | Encryption Diversifier | EDIV | 加密多样化器(2 字节) |
SKD | Session Key Data | SKD | 会话密钥种子(16 字节) |
SK | Session Key | SK | 会话密钥(16 字节) |
IV | Initialization Vector | IV | 初始化向量(8 字节) |
MIC | Message Integrity Code | MIC | 消息完整性码(4 字节) |
AES-ECB | 电子密码本模式 | - | 无状态加密模式 |
MSO/LSO | 最高 / 最低有效位顺序 | - | 字节序标识 |
十一、 参考资料
Bluetooth Core Specification v6.0
《蓝牙低功耗核心技术与应用开发》(第 2 版)
NXP 蓝牙加密白皮书:《Secure BLE Communication in IoT Devices》
Android 蓝牙开发文档:https://developer.android.com/guide/topics/connectivity/bluetooth