【LE Audio】CSIS精讲[4]: 从加密原语到RSI解析全链路拆解
LE Audio作为蓝牙音频的新一代标准把多设备协同能力做到了极致小到双耳真无线耳机的同步发声大到多扬声器的空间音频组网甚至医疗场景的助听器集群、传感器节点组网都离不开CoordinatedSetIdentification ServiceCSIS——协调集识别服务。而CSIS的所有安全能力都扎根于其核心的安全工具箱这套由多个加密函数、密钥操作、标识生成解析流程组成的体系决定了协调集设备身份识别的唯一性、安全性和抗追踪性。目录一、安全工具箱的核心定位与设计逻辑二、基础加密原语安全工具箱的基础工具2.1 加密函数e标准化的AES-128加密实现2.2 CMAC函数基于RFC4493的消息认证与密钥派生基础三、密钥加工层s1盐生成与k1密钥派生打造专属加工工具3.1 s1盐生成函数为密钥派生增加随机性因子3.2 k1密钥派生函数生成SIRK加解密的专属密钥四、核心密钥加解密层sef与sdf守护协调集的核心门禁密钥SIRK4.1 SIRK加解密的核心前提传输层密钥适配4.2 sef加密函数服务器端的SIRK加密包装4.3 sdf解密函数客户端的SIRK拆包还原五、身份标识层sih哈希RSI生成与解析制作协调集的动态身份牌5.1 sih哈希函数RSI的哈希生成器5.2 RSI生成操作协调集设备的身份牌制作5.3 RSI解析操作客户端身份牌验证”六、安全工具箱的全链路工作流程6.1 阶段1SIRK的安全传输服务器→客户端6.2 阶段2RSI的生成与解析设备广播→客户端验证七、安全工具箱的设计亮点与工程实现坑点7.1 设计亮点7.2 工程实现坑点八、测试如果把蓝牙协调集比作一个专属俱乐部那么安全工具箱就是俱乐部的密钥管理室身份制作间核心加密原语是工坊的基础工具密钥派生是工具的组合加工SIRK加解密是给俱乐部核心门禁密钥做安全包装而RSI的生成与解析则是制作动态变化的临时身份牌只有持有合法核心密钥的成员才能验证临时身份牌的有效性并加入俱乐部。本文会从安全工具箱的设计逻辑出发从底层加密原语到高层身份标识操作层层拆解每个函数的定义、设计目的和实际应用结合协议样本数据做实操性解析同时梳理全链路工作流程和工程实现的注意事项让大家真正吃透CSIS的安全核心。一、安全工具箱的核心定位与设计逻辑CSIS的核心目标是让设备能被识别为协调集的一员同时为客户端提供协调集的独占访问权而安全工具箱的设计就是为了实现两个核心安全需求一是保护协调集的唯一标识密钥SIRK不被泄露二是让协调集设备的广播标识具备抗追踪性。为了满足这两个需求安全工具箱采用分层设计从底层到高层分为四个层级基础加密原语、密钥加工层、核心密钥加解密层、身份标识层每层都基于蓝牙核心规范Version 4.2及以上和通用加密标准如RFC4493的AES-CMAC实现既保证了不同厂商设备的兼容性又适配了蓝牙低功耗设备的资源受限场景——大量使用计算效率高的操作如按位异或、取低位数避免复杂运算带来的功耗损耗。整个安全工具箱的所有函数和操作都是强关联且层层递进的底层加密原语是所有操作的基础密钥加工层基于原语生成专属的加解密密钥核心密钥加解密层保护SIRK的传输安全身份标识层则基于SIRK生成动态的广播标识RSI并完成解析验证。所有操作的最终目的都是让合法客户端能安全获取SIRK并通过SIRK识别协调集设备同时防止第三方窃取SIRK或追踪设备。二、基础加密原语安全工具箱的基础工具基础加密原语包含加密函数e和CMAC函数是整个安全工具箱的底层基石所有高层的密钥派生、哈希计算、加解密操作都基于这两个函数实现。协议对这两个函数的实现做了严格的标准化要求确保不同厂商的设备能互通使用。2.1 加密函数e标准化的AES-128加密实现协议中对加密函数e的定义为该函数并非CSIS自定义而是直接采用蓝牙核心规范Volume 3, Part H, Section 2.2.1中定义的标准加密函数本质是AES-128对称加密算法。函数的输入为128位的密钥key和任意长度的明文plaintext输出为与明文等长的密文ciphertext。在CSIS中该函数主要用于后续RSI哈希函数sih的计算是所有与加密相关操作的基础。协议明确要求加密函数e的实现必须严格遵循蓝牙核心规范设备可以选择两种实现方式一是在主机端直接实现AES-128算法二是通过HCI_LE_Encrypt命令调用蓝牙控制器的AES硬件加速功能——后者更适合低功耗设备能在保证加密效率的同时降低功耗。2.2 CMAC函数基于RFC4493的消息认证与密钥派生基础CMAC函数全称为Cipher-based Message Authentication Code协议中定义为该函数基于RFC4493实现采用AES-128作为分组密码是安全工具箱中密钥派生、盐生成的核心函数。函数的输入为128位的密钥k和可变长度的待认证数据m输出为128位的消息认证码MAC。与普通的MAC算法相比AES-CMAC在蓝牙低功耗场景下的优势在于计算效率高、抗碰撞性强既能保证数据的完整性和真实性又不会给低功耗设备带来过大的计算压力。协议对CMAC函数的使用做了一个关键的字节序约束在后续的s1盐生成和k1密钥派生函数中当多字节整数作为CMAC的输入时必须采用大端序MSO在前LSO在后CMAC的输出也同样为大端序。这是厂商实现时最容易踩坑的点之一字节序错误会直接导致后续的密钥派生、加解密结果全部失效。此外CMAC函数的实现与加密函数e共用AES-128算法设备可以复用AES的实现逻辑减少代码冗余。三、密钥加工层s1盐生成与k1密钥派生打造专属加工工具密钥加工层是连接基础加密原语和高层加解密操作的桥梁包含s1盐生成函数和k1密钥派生函数。这一层的核心目的是避免直接使用蓝牙传输层的核心密钥LTK/Link Key进行加解密通过盐生成和密钥派生为SIRK的加解密生成专属密钥降低核心密钥泄露的风险。3.1 s1盐生成函数为密钥派生增加随机性因子盐的作用是在密钥派生中避免相同的输入生成相同的派生密钥增加抗碰撞性。协议中s1函数的定义为其中有两个核心输入参数M非零长度的字节数组或ASCII字符串若为字符串需转换为对应的ASCII码整数如字符串CSIS转换为0x43534953ZERO128位的全0密钥是CMAC函数的固定密钥。简单来说s1函数就是用全0密钥的AES-CMAC对输入M进行计算输出128位的盐值。协议中对M的取值做了明确的业务化定义在SIRK的加解密中M固定为字符串SIRKenc这一设计让盐值与CSIS的SIRK操作强绑定避免跨场景的盐值复用。s1函数的设计逻辑非常简洁采用全0密钥的目的是标准化盐值的生成方式确保不同设备对相同的M能生成完全一致的盐值这是多设备互通的关键。3.2 k1密钥派生函数生成SIRK加解密的专属密钥k1函数是CSIS中最核心的密钥派生函数协议中定义为两步计算先计算中间密钥再计算最终派生密钥。函数的三个输入参数各有其作用且都为可配置项能适配不同的业务场景SALT128位盐值由s1函数生成是派生密钥的随机性基础N任意长度字节一般传入设备相关的非ceNonce让派生密钥与设备绑定P任意长度字节一般传入协议标识让派生密钥与具体业务绑定。在SIRK的加解密场景中N为空SALT为s1(SIRKenc)的输出P为字符串csis这一参数组合让k1函数生成的派生密钥仅用于CSIS的SIRK加解密操作实现了密钥的场景隔离——即使该派生密钥泄露也不会影响蓝牙传输层的核心密钥LTK/Link Key大大降低了密钥泄露的风险。k1函数的两步派生设计也进一步提升了密钥的安全性通过中间密钥T的二次计算让派生密钥与输入参数的关联更复杂增加了暴力破解的难度。四、核心密钥加解密层sef与sdf守护协调集的核心门禁密钥SIRKSIRKSet Identity Resolving Key是协调集的唯一标识密钥为128位的随机数所有属于同一协调集的设备都共享同一个SIRK是客户端识别协调集设备的核心依据。SIRK的安全直接决定了CSIS的安全性因此协议设计了sef加密函数和sdf解密函数专门保护SIRK的传输安全——SIRK在设备间传输时必须以加密形式存在禁止明文传输。4.1 SIRK加解密的核心前提传输层密钥适配sef和sdf函数的加密密钥K并非固定值而是根据蓝牙的传输层类型动态适配协议明确规定若采用LE低功耗传输K为客户端与服务器共享的LTKLong Term Key若采用BR/EDR基础速率/增强速率传输K为客户端与服务器共享的Link Key。这一设计让SIRK的加解密密钥与蓝牙传输层的安全上下文保持一致确保只有建立了合法安全连接的客户端才能获取到加解密所需的密钥K从源头保证SIRK的传输安全。4.2 sef加密函数服务器端的SIRK加密包装sef函数是服务器端用于加密SIRK的函数协议定义为其中oplus为按位异或操作。函数的计算流程分为三步用s1函数对字符串SIRKenc计算生成128位盐值用k1函数以传输层密钥K为基础结合上述盐值和字符串csis派生128位的专属加解密密钥将派生密钥与SIRK进行按位异或得到加密后的SIRKEncSIRK。协议选择按位异或作为加解密的核心操作核心原因是计算效率极高——异或操作是硬件级别的基础运算对蓝牙低功耗设备来说几乎没有计算压力同时异或操作具备对称性相同的密钥异或两次即可还原原始数据这也是sdf解密函数的设计基础。结合附录A.2的样本数据实操计算协议附录A给出了sef函数的完整样本数据我们可以通过实际计算理解函数的工作过程这一计算过程验证了sef函数的实现逻辑也能让我们更直观地理解各函数之间的层级调用关系。4.3 sdf解密函数客户端的SIRK拆包还原sdf函数是客户端用于解密密文EncSIRK的函数协议定义为可以看到sdf函数与sef函数的计算逻辑完全一致这正是利用了异或操作的对称性——客户端使用与服务器相同的传输层密钥K经过相同的s1盐生成和k1密钥派生得到与服务器完全相同的派生密钥再用该密钥与EncSIRK异或即可还原出原始的SIRK。协议对SIRK的暴露方式做了严格的安全约束若服务器选择加密暴露SIRK则禁止同时明文暴露若服务器仅支持通过OOB带外方式暴露SIRK则客户端发起SIRK读取请求时服务器需返回错误码OOB SIRK Only0x83拒绝读取。这些约束从实现层面避免了SIRK的泄露风险进一步保障了协调集的安全。五、身份标识层sih哈希RSI生成与解析制作协调集的动态身份牌如果说SIRK是协调集的核心门禁密钥那么RSIResolvable Set Identifier就是协调集设备的动态广播身份牌。RSI是6字节48位的广播标识由设备动态生成并广播客户端通过SIRK解析RSI验证设备是否属于某一协调集。协议设计RSI的核心目的是防止设备被追踪——如果设备使用固定的广播标识第三方可以通过该标识持续追踪设备的位置而RSI基于随机数生成设备可以频繁更新RSI第三方无法通过动态变化的RSI追踪设备同时合法客户端持有SIRK能解析任意一个版本的RSI不影响设备发现。身份标识层包含sih哈希函数、RSI生成操作和RSI解析操作其中sih是核心RSI的生成和解析都基于sih函数实现。5.1 sih哈希函数RSI的哈希生成器sih函数是专门为RSI设计的哈希函数基于基础加密函数e实现协议定义为其中k为128位SIRKr为24位随机数prand函数的计算流程分为四步将24位的prand拼接104位的全0填充位生成128位的r——拼接规则为LSO的prand成为LSO的rMSO的全0成为MSO的r如prand为0x3A98B5r为0x000000000000000000000000003A98B5以SIRK为密钥k调用加密函数e对r进行AES-128加密得到128位密文对密文执行操作即取密文的最低24位该24位结果即为sih函数的输出作为RSI的hash部分。拼接104位全0的目的是适配AES-128的输入要求——AES-128的输入必须为128位的整数而prand为24位需要通过填充补至128位。取最低24位则是为了让hash值与prand的位数一致便于后续拼接为6字节的RSI。结合附录A.1的样本数据实操计算协议附录A给出了sih函数的样本数据实际计算过程如下5.2 RSI生成操作协调集设备的身份牌制作RSI生成操作是基于sih函数的高层操作协议规定RSI为6字节48位由24位hash值和24位prand随机数拼接而成生成流程分为两步生成符合约束的prand→拼接hash和prand得到RSI。关键约束prand的生成规则prand是24位的随机数但协议对其做了三个强制约束目的是避免生成无效的随机数保证RSI的唯一性和可解析性prand的最高两位MSBs必须固定为0和1即01prand的随机部分剩余22位至少有一个0位prand的随机部分剩余22位至少有一个1位。这三个约束看似简单却是实现RSI互通的关键——如果prand的最高两位不固定客户端在解析RSI时无法正确拆分hash和prand导致解析失败。RSI的最终格式prand生成后调用sih函数以SIRK为密钥、prand为输入生成24位hash值然后按hash || prand的顺序拼接得到6字节的RSI其格式示意图如下RSI的传输采用小端序LSO在前即RSI的最低位为hash的最低位最高位为prand的最高位。5.3 RSI解析操作客户端身份牌验证”RSI解析操作是客户端识别协调集设备的核心步骤是RSI生成操作的反向过程只有持有该协调集SIRK的客户端才能完成解析验证流程分为四步拆分RSI将客户端扫描到的6字节RSI按生成时的拼接顺序拆分为24位hash值和24位prand随机数生成本地hash调用sih函数以客户端持有的SIRK为密钥、拆分出的prand为输入生成24位的本地hash值localHash哈希对比将本地hash值与从RSI中拆分出的hash值进行对比验证结果若两者一致则RSI解析成功该设备属于该协调集若不一致则解析失败设备不属于该协调集。整个解析过程的核心是SIRK的合法性——只有持有正确SIRK的客户端才能生成与设备端相同的localHash从而完成验证。这一设计让RSI具备了安全性和隐私性第三方无法获取SIRK因此无法解析RSI既无法识别设备所属的协调集也无法通过动态变化的RSI追踪设备。六、安全工具箱的全链路工作流程将上述四个层级的函数和操作串联起来就能得到CSIS安全工具箱的完整工作流程分为两大核心阶段SIRK的安全传输阶段和RSI的生成与解析阶段这两个阶段构成了CSIS实现协调集识别的完整安全链路。6.1 阶段1SIRK的安全传输服务器→客户端协调集设备服务器与客户端建立LE/BR/EDR安全连接双方共享传输层密钥LTK/Link Key服务器调用s1函数对字符串SIRKenc计算生成128位盐值服务器调用k1函数以传输层密钥为基础结合上述盐值和字符串csis派生128位专属加解密密钥服务器调用sef函数将派生密钥与SIRK按位异或得到加密后的EncSIRK服务器将EncSIRK发送给客户端客户端调用sdf函数通过相同的步骤派生密钥与EncSIRK异或还原出SIRK客户端存储该SIRK作为后续解析该协调集RSI的核心密钥。6.2 阶段2RSI的生成与解析设备广播→客户端验证协调集设备生成符合协议约束的24位prand随机数设备调用sih函数以SIRK为密钥、prand为输入生成24位hash值设备将hash和prand按hash||prand的顺序拼接得到6字节RSI并通过蓝牙广播发送客户端扫描到该RSI后将其拆分为hash值和prand随机数客户端调用sih函数以存储的SIRK为密钥、拆分出的prand为输入生成本地hash值客户端对比本地hash值与RSI中的hash值一致则验证通过确定设备属于该协调集。整个流程中所有函数和操作都层层调用、环环相扣没有任何一步是孤立的这也是CSIS安全工具箱设计的精妙之处——通过分层设计让每个函数都专注于单一功能同时通过层级调用实现复杂的安全需求。七、安全工具箱的设计亮点与工程实现坑点从协议设计和工程实现的角度梳理CSIS安全工具箱的设计亮点和容易踩坑的点既能帮助我们更深入理解协议设计的逻辑也能为实际开发提供参考。7.1 设计亮点分层设计高内聚低耦合从基础加密原语到身份标识层每层函数专注于单一功能层级之间通过固定的接口调用便于实现和维护同时也便于协议的后续扩展低功耗优化适配蓝牙LE大量使用计算效率高的操作异或、取低位数复用AES-128算法实现支持硬件加速完美适配蓝牙低功耗设备的资源受限场景隐私保护与安全性兼顾RSI动态生成实现抗追踪SIRK加密传输避免泄露只有合法客户端能获取SIRK并解析RSI兼顾了设备的隐私保护和协调集的识别安全与蓝牙核心规范深度融合所有基础函数都基于蓝牙核心规范实现传输层密钥适配LTK/Link Key保证了与蓝牙现有安全体系的兼容性无需额外的安全适配唯一性保证SIRK为128位随机数符合蓝牙核心规范的随机数生成要求保证了每个协调集的标识唯一性避免不同协调集的设备被误识别。7.2 工程实现坑点字节序问题s1和k1函数中CMAC的输入输出为大端序而CSIS特征的传输为小端序两者需严格区分否则会导致密钥派生、加解密结果错误prand的生成约束必须严格遵循最高两位为01、随机部分有0有1的约束否则生成的RSI无法被客户端解析异或操作的位对齐SIRK和派生密钥都是128位异或时需保证位对齐避免因字节序转换导致的位偏移进而解密失败AES函数的实现一致性加密函数e和CMAC函数共用AES-128需保证实现的一致性建议使用蓝牙控制器的HCI_LE_Encrypt命令避免主机端实现的差异错误处理的完整性需处理协议定义的各类错误码如OOB SIRK Only 0x83尤其是SIRK读取和RSI解析的错误避免程序异常lock_timeout的合理设置虽然不属于安全工具箱但与RSI解析后的协调集访问相关建议设置为60秒过短会导致操作中断过长会导致协调集被独占。八、测试题目CSIS中sef和sdf函数的实现原理是什么LE和BR/EDR传输时的密钥选择有何不同答案1. sef和sdf函数基于按位异或和k1密钥派生实现核心公式为原始数据利用异或的对称性实现加解密的统一逻辑适配蓝牙低功耗设备的计算效率要求2. 密钥选择的差异LE传输时函数的加密密钥K为客户端与服务器共享的LTK低功耗链路密钥BR/EDR传输时K为双方共享的Link Key基础速率/增强速率链路密钥该设计让加解密密钥与传输层安全上下文一致保证加密安全性。题目CSIS中RSI的生成流程是什么协议对prand随机数有哪些强制约束答案RSI为6字节48位的可解析集标识符生成流程为①生成符合协议约束的24位prand随机数②以协调集SIRK为密钥、prand为输入调用sih函数生成24位hash值③将hash和prand按hash||prand的顺序拼接得到6字节RSI协议对prand的三个强制约束①prand的最高两位MSBs固定为0和1②prand的随机部分剩余22位至少包含一个0位③prand的随机部分剩余22位至少包含一个1位约束的目的是避免生成无效随机数保证RSI的可解析性和唯一性。题目CSIS中sih哈希函数的计算步骤是什么结合协议附录的样本数据说明核心过程。答案sih函数是基于加密函数e的专属哈希函数计算步骤为①将24位prand拼接104位全0生成128位的rLSO的prand为LSO的r②以SIRK为密钥调用e函数对r进行AES-128加密得到128位密文③对密文执行取最低24位作为输出附录样本数据的核心过程样本SIRK和prand均为0x0000000000000000000000000069f563r为该值拼接全0e函数加密后得到0x3fb0534994e48cd8022b55909b1948da取最低24位0x1948da即为sih函数的输出。