BLE SMP 抓包实战
发布时间:2026/10/12 3:52:47 锦皓数字建站

BLE SMP 基础BLE SMP 抓包实战 —— LESC Passkey Entry 逐包判读一、配对触发与特性交换Phase 11.1 Security Request0x0b1.2 Pairing Request0x011.3 Pairing Response0x02二、LESC 认证与密钥生成Phase 22.1 Pairing Public Key0x0c2.2 Pairing Confirm / Random0x03 / 0x04× 20 轮2.3 Pairing DHKey Check0x0d三、加密建立与密钥分发Phase 33.1 加密建立3.2 密钥分发一、配对触发与特性交换Phase 1Phase 1 确定由哪一方发起配对、交换双方的能力与安全需求、决定配对方式。后续的密钥生成方式与密钥分发范围均在此阶段确定。1.1 Security Request0x0b报文含义“我希望建立一条 Level 4LESC 认证 加密的链路请发起配对。”字段值判读L2CAP Length21 字节opcode 1 字节AuthReqOpcode0x0bSecurity RequestAuthReq0x0d外设的安全要求绑定 认证MITM LESCSecurity Request只能由从设备Peripheral发出它的作用只是提示真正发起配对的第一步Pairing Request只能由中央Central发出。AuthReq 0x0d的含义0x0d 0000 1101 │ ││ └─ bit0 Bonding 1 要求绑定 │ │└─── bit2 MITM 1 要求认证 │ └──── bit3 SC 1 支持 LESC └────── bit5 CT2 0 不涉及 BR/EDR板子在连接建立后立刻请求 Level 4于是任何达不到 Level 4 的配对都会被协议栈自动拒绝。1.2 Pairing Request0x01报文结构┌──────┬───────────────┬──────────┬─────────┬──────────┬─────────┬─────────┐ │ Code │ IO Capability │ OOB flag │ AuthReq │ MaxKeySz │ InitKey │ RespKey │ │ 0x01 │ 0x04 │ 0x00 │ 0x2d │ 0x10 │ 0x0f │ 0x0f │ └──────┴───────────────┴──────────┴─────────┴──────────┴─────────┴─────────┘字段值判读IO Capability0x04Keyboard, Display手机既能显示也能输入有屏幕有键盘OOB Data Flag0x00没有带外数据 → 走不了 OOB 配对AuthReq0x2dBonding MITM SC CT2典型 Android 手机Max Enc Key Size16可接受最长 128 bit 密钥Initiator Key Dist0x0f手机愿意分发全部 4 种密钥Responder Key Dist0x0f希望外设也分发全部 4 种这里只是声明意愿实际分发范围取双方声明与本机策略的交集最终由 Pairing Response 定稿。1.3 Pairing Response0x02与 Pairing Request 逐字段对比字段Request手机Response板子差异说明IO Capability0x04KeyboardDisplay0x00Display Only板子只有屏幕没有键盘AuthReq0x2d0x0d差0x20 CT2 位板子是纯 BLEMax Key Size1616一致Initiator Key Dist0x0f全要0x02只要 IRK板子把 “手机要分发的内容” 收敛到只剩 IRKResponder Key Dist0x0f全要0x00不分发任何密钥板子不向手机分发任何密钥板子的Responder Key Distribution 0x00意味着 Phase 3 里外设不会发任何密钥报文 —— 所以后面只能看到手机的Identity Information (0x08)和Identity Address Information (0x09)。而Initiator Key Distribution 0x02只要 IRK意味着 手机只需给出 IRK 身份地址用于让板子解析手机未来使用的随机地址RPA。二、LESC 认证与密钥生成Phase 2Phase 2 双方交换公钥以计算共享的 DHKey再通过 Passkey 完成认证最后以 DHKey Check 相互校验 —— 本阶段结束时双方已各自持有相同的密钥材料。2.1 Pairing Public Key0x0c手机的公钥发起方板子的公钥响应方报文结构┌──────┬────────────────────────────┬────────────────────────────┐ │ Code │ Public Key X │ Public Key Y │ │ 1B │ 32 B │ 32 B │ └──────┴────────────────────────────┴────────────────────────────┘Public Key X/Y各 32 字节P-256 椭圆曲线的临时公钥X、Y 两个坐标合起来才是一个点也就是一把公钥单看 X 或单看 Y 都没有意义双方各发一把。这两个报文的作用手机私钥 a → 公钥 A a·G ──── A ────► 板子 板子私钥 b → 公钥 B b·G ──── B ────► 手机 ↓ 双方各自计算 DHKey a·B b·A ab·G2.2 Pairing Confirm / Random0x03 / 0x04× 20 轮这两个报文是一对「承诺—揭示」报文用途是 在不把 Passkey 发到空口的前提下让双方确认对方知道同一个 Passkey。报文作用内容Pairing Confirm0x03承诺先把本轮的随机数 “锁住”但不公开16 字节校验值Pairing Random0x04揭示再把该随机数公开供对方验算16 字节随机数本轮 nonce一轮完整的往返双方各自生成一个 16 字节随机数本轮 nonce本机私有、不发送。把「本轮 nonce」当作密钥把「双方公钥的 X 坐标 Passkey 的本轮 1 位」当作消息算出一个 16 字节校验值 —— 作为Confirm发出对方即使收到这个校验值也无法反推出 nonce。双方把本轮 nonce 明文发出 —— 即Random报文双方用「收到的 nonce 自己的 Passkey 位」重算一次与对方先前发来的Confirm比对相等 → 对方确实持有同一个 Passkey 位不等 → 立即Pairing Failed。顺序不可颠倒 —— 先承诺、后揭示只有先发Confirm后发RandomConfirm才能在 nonce 未知时成为不可伪造的承诺若先揭示 nonce攻击者就能枚举仅 1 位的 Passkey 并伪造Confirm验证即失效。为什么是 20 轮?6 位十进制数字的信息量是 20 bit999999 0xF423F协议按每轮验证 1 位来处理因此走 20 轮。抓包实例第 1 轮Confirm / Random手机 → 板子Confirm板子 → 手机Confirm手机 → 板子Random板子 → 手机Random2.3 Pairing DHKey Check0x0d作用双方各自算出 DHKey 后用它计算校验值互发一次确认两边算出的 DHKey 一致。手机 → 板子板子 → 手机DHKey Check 本身不传输 DHKey传的是基于 DHKey 的校验值。三、加密建立与密钥分发Phase 3密钥分发必须在已加密的链路上进行因此时间顺序上先出现链路加密建立随后才是密钥报文 —— 本阶段结束时绑定所需的信息已由双方保存。3.1 加密建立配对谈好密钥之后真正打开加密的是链路层Link LayerLL_ENC_REQ0x03—— 中央侧参数字段长度本抓包的值含义Rand8 字节0LESC 的判读标志EDIV2 字节0同上SKD_C8 字节0x4ab874228632f5f9中央侧随机数参与派生会话密钥IV_C4 字节0xaeb50886中央侧随机数参与构成 AES-CCM 的初始向量LL_ENC_RSP0x04—— 外设侧参数字段长度本抓包的值含义SKD_P8 字节0x0df3ae7d1d0bcc2b外设侧随机数参与派生会话密钥IV_P4 字节0xfecc0a09外设侧随机数参与构成初始向量LL_START_ENC_REQ0x05—— 开始加密这个 PDU 没有任何参数长度 1 就是 opcode 本身。它由外设发出含义是 “会话密钥已算好从此开始用加密收发” 。中央收到后回LL_START_ENC_RSP0x06—— 该包已是加密发送收到它就说明加密链路正式生效。EDIV 0、Rand 0 说明了什么?—— LTK 由 DHKey 派生、双方各自持有无须用 EDIV/Rand 去索引密钥。会话密钥是怎么来的双方各出一半随机数在空口交换SKD SKD_P ‖ SKD_C, IV IV_P ‖ IV_C拼接顺序为外设那一半在前、中央那一半在后会话密钥 以 LTK 为密钥、SKD 为明文做一次 AES 加密SK e(LTK, SKD)真正用于加解密的是会话密钥 SK 与初始向量 IV而不是直接使用 LTK这样设计的作用是每次连接都会换一套 SKD / IV因此会话密钥每次不同 而 LTK 只存在于双方本地空口上只出现随机数 SKD / IV。3.2 密钥分发以下两个报文成对出现前者给出密钥IRK后者给出身份地址合起来让板子记住手机是谁。Identity Information0x08—— IRK手机发出Identity Address Information0x09—— 身份地址手机发出为什么只有手机在发因为在Pairing Response里板子声明了Responder Key Distribution 0x00—— 不分发任何密钥所以 Phase 3 里只有手机单向发出 IRK 与身份地址。IRK 的作用手机以后重连时会使用随机地址RPA → 外设用手机给的 IRK 做地址解析 → 解析出真实身份地址22:22:99:1c:6e:b2身份地址的作用若只有 IRK 而没有身份地址解析成功也只能知道这是认识的设备无法知道是哪一条记录。作为密钥库的索引重连时手机用新的 RPA 发起连接 → 外设用 IRK 解析出身份地址 → 查出对应的 LTK → 直接开始加密跳过配对。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。