LE Audio作为蓝牙音频的新一代标准,把多设备协同能力做到了极致,小到双耳真无线耳机的同步发声,大到多扬声器的空间音频组网,甚至医疗场景的助听器集群、传感器节点组网,都离不开Coordinated Set Identification Service(CSIS)------协调集识别服务。而CSIS的所有安全能力,都扎根于其核心的安全工具箱,这套由多个加密函数、密钥操作、标识生成解析流程组成的体系,决定了协调集设备身份识别的唯一性、安全性和抗追踪性。
目录
[2.1 加密函数e:标准化的AES-128加密实现](#2.1 加密函数e:标准化的AES-128加密实现)
[2.2 CMAC函数:基于RFC4493的消息认证与密钥派生基础](#2.2 CMAC函数:基于RFC4493的消息认证与密钥派生基础)
[3.1 s1盐生成函数:为密钥派生增加随机性因子](#3.1 s1盐生成函数:为密钥派生增加随机性因子)
[3.2 k1密钥派生函数:生成SIRK加解密的专属密钥](#3.2 k1密钥派生函数:生成SIRK加解密的专属密钥)
四、核心密钥加解密层:sef与sdf,守护协调集的核心门禁密钥SIRK
[4.1 SIRK加解密的核心前提:传输层密钥适配](#4.1 SIRK加解密的核心前提:传输层密钥适配)
[4.2 sef加密函数:服务器端的SIRK加密包装](#4.2 sef加密函数:服务器端的SIRK加密包装)
[4.3 sdf解密函数:客户端的SIRK拆包还原](#4.3 sdf解密函数:客户端的SIRK拆包还原)
五、身份标识层:sih哈希+RSI生成与解析,制作协调集的动态身份牌
[5.1 sih哈希函数:RSI的哈希生成器](#5.1 sih哈希函数:RSI的哈希生成器)
[5.2 RSI生成操作:协调集设备的身份牌制作](#5.2 RSI生成操作:协调集设备的身份牌制作)
[5.3 RSI解析操作:客户端身份牌验证"](#5.3 RSI解析操作:客户端身份牌验证”)
[6.1 阶段1:SIRK的安全传输(服务器→客户端)](#6.1 阶段1:SIRK的安全传输(服务器→客户端))
[6.2 阶段2:RSI的生成与解析(设备广播→客户端验证)](#6.2 阶段2:RSI的生成与解析(设备广播→客户端验证))
[7.1 设计亮点](#7.1 设计亮点)
[7.2 工程实现坑点](#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转换为0x43534953);
ZERO:128位的全0密钥,是CMAC函数的固定密钥。
简单来说,s1函数就是用全0密钥的AES-CMAC对输入M进行计算,输出128位的盐值。协议中对M的取值做了明确的业务化定义,在SIRK的加解密中,M固定为字符串SIRKenc,这一设计让盐值与CSIS的SIRK操作强绑定,避免跨场景的盐值复用。
s1函数的设计逻辑非常简洁,采用全0密钥的目的是标准化盐值的生成方式,确保不同设备对相同的M能生成完全一致的盐值,这是多设备互通的关键。
3.2 k1密钥派生函数:生成SIRK加解密的专属密钥
k1函数是CSIS中最核心的密钥派生函数,协议中定义为两步计算:
先计算中间密钥:
;
再计算最终派生密钥:
。
函数的三个输入参数各有其作用,且都为可配置项,能适配不同的业务场景:
SALT:128位盐值,由s1函数生成,是派生密钥的随机性基础;
N:任意长度字节,一般传入设备相关的非ce(Nonce),让派生密钥与设备绑定;
P:任意长度字节,一般传入协议标识,让派生密钥与具体业务绑定。
在SIRK的加解密场景中,N为空,SALT为s1(SIRKenc)的输出,P为字符串csis,这一参数组合让k1函数生成的派生密钥仅用于CSIS的SIRK加解密操作,实现了密钥的场景隔离------即使该派生密钥泄露,也不会影响蓝牙传输层的核心密钥(LTK/Link Key),大大降低了密钥泄露的风险。
k1函数的两步派生设计也进一步提升了密钥的安全性,通过中间密钥T的二次计算,让派生密钥与输入参数的关联更复杂,增加了暴力破解的难度。
四、核心密钥加解密层:sef与sdf,守护协调集的核心门禁密钥SIRK
SIRK(Set Identity Resolving Key)是协调集的唯一标识密钥 ,为128位的随机数,所有属于同一协调集的设备都共享同一个SIRK,是客户端识别协调集设备的核心依据。SIRK的安全直接决定了CSIS的安全性,因此协议设计了sef加密函数 和sdf解密函数,专门保护SIRK的传输安全------SIRK在设备间传输时必须以加密形式存在,禁止明文传输。
4.1 SIRK加解密的核心前提:传输层密钥适配
sef和sdf函数的加密密钥K并非固定值,而是根据蓝牙的传输层类型动态适配,协议明确规定:
若采用**LE(低功耗)**传输,K为客户端与服务器共享的LTK(Long 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进行按位异或,得到加密后的SIRK(EncSIRK)。
协议选择按位异或 作为加解密的核心操作,核心原因是计算效率极高 ------异或操作是硬件级别的基础运算,对蓝牙低功耗设备来说,几乎没有计算压力,同时异或操作具备对称性,相同的密钥异或两次即可还原原始数据,这也是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 Only(0x83),拒绝读取。
这些约束从实现层面避免了SIRK的泄露风险,进一步保障了协调集的安全。
五、身份标识层:sih哈希+RSI生成与解析,制作协调集的动态身份牌
如果说SIRK是协调集的核心门禁密钥,那么RSI(Resolvable 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位SIRK,r为24位随机数prand,函数的计算流程分为四步:
将24位的prand拼接104位的全0填充位 ,生成128位的r'------拼接规则为LSO的prand成为LSO的r',MSO的全0成为MSO的r'(如prand为0x3A98B5,r'为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(即01);
prand的随机部分(剩余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 阶段1:SIRK的安全传输(服务器→客户端)
-
协调集设备(服务器)与客户端建立LE/BR/EDR安全连接,双方共享传输层密钥LTK/Link Key;
-
服务器调用s1函数对字符串SIRKenc计算,生成128位盐值;
-
服务器调用k1函数,以传输层密钥为基础,结合上述盐值和字符串csis,派生128位专属加解密密钥;
-
服务器调用sef函数,将派生密钥与SIRK按位异或,得到加密后的EncSIRK;
-
服务器将EncSIRK发送给客户端,客户端调用sdf函数,通过相同的步骤派生密钥,与EncSIRK异或还原出SIRK;
-
客户端存储该SIRK,作为后续解析该协调集RSI的核心密钥。
6.2 阶段2:RSI的生成与解析(设备广播→客户端验证)
-
协调集设备生成符合协议约束的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传输时的密钥选择有何不同?
答案:
- sef和sdf函数基于按位异或 和k1密钥派生实现,核心公式为:
原始数据利用异或的对称性实现加解密的统一逻辑,适配蓝牙低功耗设备的计算效率要求;
- 密钥选择的差异: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位的r'(LSO的prand为LSO的r');②以SIRK为密钥,调用e函数对r'进行AES-128加密,得到128位密文;③对密文执行
,取最低24位作为输出;
-
附录样本数据的核心过程:样本SIRK和prand均为0x0000000000000000000000000069f563,r'为该值拼接全0,e函数加密后得到0x3fb0534994e48cd8022b55909b1948da,取最低24位0x1948da即为sih函数的输出。