BLE 加密流程研究:从示例数据看低功耗蓝牙安全通信

发布于:2025-04-05 ⋅ 阅读:(12) ⋅ 点赞:(0)

在万物互联时代,低功耗蓝牙(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 算法步骤

  1. 构建 B 向量:包含数据包类型、序号、长度、内容哈希

  2. AES 迭代加密:通过 AES-ECB 对 B 向量进行三轮加密

  3. 截断取前 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 加密失败排查流程

  1. 密钥校验:检查 LTK/EDIV 是否匹配(通过 btif_storage_get_ble_bonding_key

  2. IV 同步:确认双方 IV_P/IV_C 的组合正确性

  3. MIC 计算:使用 Wireshark 抓包验证 B 向量生成

  4. 硬件一致性:检查 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 性能优化点

  1. 密钥缓存:使用 LRU 缓存最近使用的 SK/SKD

  2. AES 硬件加速:启用 Cortex-M 系列的 CryptoCell 硬件模块

  3. 批量加密:合并多个小数据包为一个加密传输单元

九、实战建议与扩展

9.1 注意事项

  • 密钥存储:使用安全存储(如 Android Keystore)保存 LTK

  • IV 管理:每个连接唯一,按数据包递增

  • MIC 校验:接收方必须验证 MIC 有效性

  • 版本兼容:处理不同蓝牙协议版本(如 LE Secure Connections)

9.2 协议栈调试技巧

  1. 使用 Wireshark 抓包分析 LL 层加密负载

  2. 打印关键参数(SKD, SK, IV)进行一致性校验

  3. 实现 btif_storage_get_ble_bonding_key 调试接口

  4. 验证 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 最高 / 最低有效位顺序 - 字节序标识

十一、 参考资料

  1. Bluetooth Core Specification v6.0

  2. 《蓝牙低功耗核心技术与应用开发》(第 2 版)

  3. NXP 蓝牙加密白皮书:《Secure BLE Communication in IoT Devices》

  4. Android 蓝牙开发文档:https://developer.android.com/guide/topics/connectivity/bluetooth