蓝牙学习笔记之安全规范(SS)(十三)

目录

写在前面

规范简述

传统配对密钥管理

密钥类型

密钥生成

Kinit生成

单元密钥KA生成

组合密钥KAB生成

加密密钥KC生成

主密钥Kmaster生成

传统配对加密(E0)

加密概念

传统配对认证

安全简单配对

1阶段:公共密钥交换

2阶段:认证阶段1

认证阶段1:数字比较协议

​​​​​​​认证阶段1:带外协议

​​​​​​​认证阶段1:密钥输入协议

3阶段:认证阶段2

4阶段:链接密钥计算

5阶段:LMP认证和加密


​​​​​​​

写在前面

安全规范协议,主要是描述BR/EDR控制器设备配对、认证、加密等过程进行规定,同时也详细的描述了相关算法的使用。

蓝牙的安全经历了几个阶段,传统配对方式,简单安全配对以及安全连接。本文主要是针对传统配对方式和简单安全配对进行说明。

这篇协议基本上是参考蓝牙核心协v5.0议进行的翻译,并且只选取了我认为重要的部分,如果需要深入详细的了解,请自行参考核心协议。如有不当的地方欢迎指正。

规范简述

安全规范(SS,Security Specification)描述了可以在链路层使用的安全系统的规范。指定了加密,认证和密钥生成方案。还规定了随机数生成的支持过程的要求。

蓝牙无线技术提供短距离的对等通信。为了提供使用保护和信息机密性,系统在应用层和链路层都提供安全措施。这些措施旨在适用于同等设备的环境。这意味着在每个设备中,身份验证和加密例程都以相同的方式实现。

BR/EDR中使用的安全机制在核心规范的过程中分三个阶段发展:遗留,安全简单配对和安全连接。下图中显示了与每个相关的加密,认证和密钥生成算法。

蓝牙学习笔记之安全规范(SS)(十三)_第1张图片

四个不同的实体用于维护链路层的安全性:蓝牙设备地址,两个秘密密钥,以及为每个新事务重新生成的伪随机数。下表总结了这四个实体及其大小。

蓝牙学习笔记之安全规范(SS)(十三)_第2张图片

蓝牙设备地址(BD_ADDR)是48位地址。BD_ADDR可以通过用户交互获得,或者通过设备自动地通过查询例程获得。

私密密钥在初始化期间导出,并且不会公开。加密密钥在认证过程中从认证密钥导出。对于认证算法,使用的密钥大小始终为16bytes(128 bit)。对于加密算法,密钥大小可以在1-16 bytes(8–128 bit)之间变化。加密密钥的大小可配置有两个原因。第一个问题与不同国家对加密算法的许多不同要求有关,无论是出口法规还是官方对隐私的态度。第二个原因是为安全性的未来升级路径提供便利,而无需对算法和加密硬件进行昂贵的重新设计。增加有效密钥大小将会更加安全。

加密密钥与认证密钥完全不同。每次激活加密时,都应生成新的加密密钥。因此,加密密钥的寿命不一定对应于认证密钥的寿命。

预计身份验证密钥的性质将比加密密钥更加静态,一旦建立,设备上运行的特定应用程序将决定何时或是否更改它。为了强调认证密钥对特定链接的基本重要性,它通常被称为链接密钥。

RAND是伪随机数,可以从设备中的随机或伪随机过程导出。这不是静态参数,会经常更改。

传统配对密钥管理

密钥类型

为了适应不同类型的应用程序,已定义了四种类型的链接键:

  1. the combination key KAB(密钥KAB)
  2. the unit key KA(单元密钥KA)
  3. the temporary key Kmaster(临时密钥Kmaster)
  4. the initialization key Kinit(初始化密钥Kinit)

除了这些密钥之外,还有一个加密密钥,表示为Kc。此密钥源自当前链接密钥。每当LM命令激活加密时,加密密钥应自动更改。分离认证密钥和加密密钥的目的是便于使用较短的加密密钥而不削弱认证过程的强度。

组合密钥KAB和单元密钥KA在功能上是不可区分的,不同之处在于它们的生成方式。单元密钥KA在单个设备A中生成,因此依赖于单个设备A.单元密钥应在设备第一次启动的时候生,此后,很少改变。组合密钥源自设备A和B中的信息,因此总是依赖于两个设备。组合密钥是针对两个设备的每个新组合导出的。

主密钥Kmaster只能在当前会话期间使用。它只能暂时替换原来的链接密钥。例如,当主设备想要使用相同的加密密钥同时到达两个以上的设备时,可以使用此功能。

初始化密钥Kinit将在初始化过程中用作链接密钥,此时尚未定义和交换任何组合或单元密钥,或者当链接密钥丢失时。初始化密钥保护初始化参数的传输。密钥源自随机数,PIN码和BD_ADDR。该密钥只能在初始化期间使用。

密钥生成

Kinit生成

初始化密钥Kinit,是在初始化期间临时使用链接密。该密钥应由E22算法从BD_ADDR,PIN码,PIN的长度和随机数IN_RAND得出。在生成链接密钥期间,E22的128位输出应用于密钥交换。当设备执行链接密钥交换时,应丢弃初始化密钥。

当生成初始化密钥时,使用BD_ADDR扩充PIN。如果一个设备具有固定PIN,则应使用另一个设备的BD_ADDR。如果两个设备都具有可变PIN,则应使用接收IN_RAND的设备的BD_ADDR。如果两个设备都有固定的PIN,则无法配对。由于算法中使用的PIN的最大长度不能超过16个八位字节,因此可能不会使用BD_ADDR的所有八位字节。此过程确保Kinit取决于具有可变PIN的设备的身份。

单元密钥KA生成

当设备第一次运行时,应生成单元密钥KA即不是在每次初始化期间。单元密钥应由的E21算法生成。创建后,单元密钥应存储在非易失性存储器中,很少更改。如果在初始化之后更改了单元密钥,则任何先前初始化的设备将具有错误的链接密钥。在初始化时,应用程序必须确定双方中的哪一方将提供单元密钥作为链接密钥。通常,这将是具有受限内存功能的设备,因为此设备只需记住其自己的单元密钥。单元密钥应转移给另一方,然后存储为该特定方的链接密钥。

组合密钥KAB生成

要使用组合密钥,首先在初始化过程中生成密钥。组合密钥是分别在设备A和B中生成的两个数字的组合。首先,每个设备应当产生一个随机数,LK_RANDALK_RANDB。然后,利用具有随机数和它们自己的BD_ADDR通过E21算法分别生成LK_KALK_KB。然后将各自的KinitLK_RAND进行异或运算分别生成CACB在发给对方。然后逆运算出对方的LK_RAND,再利用对方的BD_ADDRLK_RAND生成对方的LK_K。具体流程如下图所示:

蓝牙学习笔记之安全规范(SS)(十三)_第3张图片

加密密钥KC生成

加密密钥KC由算法E3从当前链路密钥,96-bits的加密偏移数(COF)和128-bits的随机数导出。

COF以两种方式之一确定。如果当前链接密钥是Kmaster,则应从主BD_ADDR导出COF。否则,COF的值应设置为在验证过程中计算的ACO (Authenticated Ciphering Offset)

主密钥Kmaster生成

首先,主设备应从两个128位随机数RAND1和RAND2,利用E22算法创建一个新的链接密钥。

该密钥是128-bit随机数。使用E22的输出而不是直接选择随机数作为密钥的原因是为了避免由于设备内的随机数发生器的不良实现而导致随机性降低的可能问题。

传统配对加密(E0

可以通过加密分组有效载荷来保护用户信息; 访问代码和数据包标题永远不会被加密。有效载荷的加密应使用称为E0的流密码进行,该密码应针对每个有效载荷重新同步

流密码系统E0应由三部分组成:

  1. 第一部分执行初始化(生成有效负载密钥)。有效载荷密钥生成器应以适当的顺序组合输入比特,并将它们移动到密钥流生成器中使用的四个LFSR中。
  2. 第二部分生成密钥流比特。第二部分是密码系统的主要部分,因为它也将用于初始化。
  3. 第三部分执行加密和解密。

下图是加密过程的流程图:

蓝牙学习笔记之安全规范(SS)(十三)_第4张图片

加密概念

对于加密过程,使用流密码算法,将密钥以按位异或的方式加到要通过空中接口发送的数据流上。在附加CRC比特之后,有效载荷被加密,但是在FEC编码之前。

每个数据包有效负载应分别加密。密码算法E0使用主机蓝牙设备地址(BD_ADDR),主机实时时钟(CLK)的26位和加密密钥KC作为输入。

加密密钥KC来自当前链路密钥COF和随机数EN_RANDA,上面已经介绍过了。在进入加密模式之前,主机应发出随机数。请注意,EN_RANDA是公知的,因为它是通过无线方式以纯文本形式传输的。

E0算法中,加密密钥KC被修改为另一个关键表示K’C。该密钥的最大有效大小应为出厂预设,可设置为1到16之间的任意倍数(8-128bits)。

每个时隙的实时时钟都会递增。所述E0算法应在每个新的数据包(即,主机到从机以及用于从站到主站的传输)的开始被重新初始化。通过使用CLK,在两次传输之间改变至少一个比特。

加密算法E0生成二进制密钥流Kcipher密码,以按位异或的方式附加到要加密的数据上。密码是对称的,解密应使用与加密相同的密钥以完全相同的方式执行。

加密具体过程如下图所示:

蓝牙学习笔记之安全规范(SS)(十三)_第5张图片

传统配对认证

传统认证使用质询-响应方案,其使用对称加密的方式检查被质询人是否持有链路密钥。认证成功,意味着被验证者/验证者共享相同的链路密钥,例如K。在质询-响应方案中,验证者首先向被验证者发送一个随机数AU_RANDA,被验证者用E1生成一个加密结果SRES,并将结果SRES返回给验证者,然后由验证者对比结果,决定是否通过认证。下图是认证流程图,该图还显示E1的输入由元组AU_RANDA和被验证者的蓝牙设备地址(BD_ADDR)组成。

蓝牙学习笔记之安全规范(SS)(十三)_第6张图片

安全简单配对

本节描述了安全简单配对安全功能和过程。此外,还提供了每个程序的加密分析。

安全简单配对分为五个阶段:

  1. 阶段1:公钥交换
  2. 阶段2:认证阶段1
  3. 阶段3:认证阶段2
  4. 阶段4:链路密钥计算
  5. 阶段5:LMP身份验证和加密

对于所有协议,阶段1,3,4,5是相同的,而阶段2(认证阶段1)根据所使用的协议而不同。通过这五个阶段分配的是13个步骤。

1阶段:公共密钥交换

最初,每个设备用ECDH算法生成其自己的公钥 - 私钥对。该密钥对需要每个设备仅生成一次,并且可以在配对之前计算。设备可以在任何时候选择丢弃其公钥 - 私钥对并生成新的密钥对,尽管没有要求这样做。

通过发起设备将其公钥发送到接收设备来启动配对(步骤1a)。响应设备用它自己的公钥回复(步骤1b)这些公钥虽然可以识别设备,但不被认为是秘密的。

其流程如下图:

蓝牙学习笔记之安全规范(SS)(十三)_第7张图片

2阶段:认证阶段1

身份验证阶段1有三种不同的协议:数字比较,带外和密钥输入。具体根据两个设备的IO功能选择协议。

​​​​​​​认证阶段1:数字比较协议

认证阶段1数字比较协议的序列图如下所示:

蓝牙学习笔记之安全规范(SS)(十三)_第8张图片

在交换公钥之后,每个设备选择128位伪随机数(步骤2)。该值用于防止重放攻击,并且必须在配对协议的每个实例化时新生成。该值应直接从物理随机源生成,或者使用来自物理源的随机值的良好伪随机生成器生成。

在此之后,响应设备通过f1()对已经交换的两个公钥和它自己的随机数值来生成一个确认值(步骤3c)。然后被发送到启动设备(步骤4)。

然后,发起和响应设备交换它们各自的随机数值(步骤5和6),并且发起设备确认该确认值(步骤6a)。此时的失败表示存在攻击者或其他传输错误,并导致协议中止。可以在生成或不生成新的公钥 - 私钥对的情况下重复该协议,但是如果重复该协议则必须生成新的随机数。

假设承诺检查成功,两个设备各自计算在其各自的设备上向用户显示的6位确认值(步骤7a,7b和8)。期望用户检查这些6位数值是否匹配并确认是否匹配。如果没有匹配,则协议中止,并且如前所述,如果要重复协议,则必须生成新的随机数。

​​​​​​​认证阶段1:带外协议

当至少一个设备接收到认证信息并在LMP IO能力交换序列中的OOB认证数据存在参数中指示认证信息时,使用带外协议。不支持首先在带内完成对等设备的发现,然后通过OOB接口传输认证参数的模式。从加密的角度看,带外验证阶段1的序列图如下所示:

蓝牙学习笔记之安全规范(SS)(十三)_第9张图片

操作原理:如果两个设备都可以通过带外信道发送或接收数据,则相互认证将基于认证阶段1中公钥(Ca和Cb)交换OOB的承诺。如果OOB只能在一个方向上进行通信,然后接收OOB通信的设备的认证将基于该设备知道通过OOB发送的随机数r。在这种情况下,r必须是保密的:每次都可以重新创建r,或者必须限制对发送r的设备的访问。如果设备没有发送r,则在步骤4a或4b中由接收OOB信息的设备假定为0。

A和B的角色:OOB身份验证阶段1协议关于A和B的角色是对称的。它不要求设备A始终启动配对,并且它自动解决OOB通信中的不对称,例如在其中一个设备具有NFC标签,只能传输OOB。

步骤顺序:公钥交换必须在验证步骤5之前进行。在图中,设备之间的带内公钥交换(步骤1)在OOB通信之前完成(步骤4)。但是当配对由OOB接口启动时,公共密钥交换将在OOB通信之后发生(步骤1将在步骤4和5之间)。

ra和rb的值:由于在OOB通信发生之前无法验证对等方的OOB接口的方向,因此设备应始终生成并且如果可能,通过其OOB接口向对等方传输随机数r。每个设备在本地应用以下规则来设置自己的r值和对方r的值:

1.最初,设备的r被设置为随机数,并且对方的r被设置为0(步骤2)。

2.如果设备已收到OOB,则将对方的r值设置为对方发送的值(步骤5)。

3.如果远程设备的OOB Authentication Data参数,在发送LMP IO功能交换序列中设置为No OOB Data。那么就将自己的r值设置为0(步骤5)

这些规则确保在进入身份验证阶段2时,如果发生OOB通信,则A和B都具有相同的ra和rb值。

​​​​​​​认证阶段1:密钥输入协议

当LMP IO能力交换序列指示应使用密钥输入时,使用密钥输入协议。从加密的角度来看,密码输入的身份验证阶段1的序列图下图所示:

蓝牙学习笔记之安全规范(SS)(十三)_第10张图片

用户在两个设备中输入相同的密钥。或者,密钥可以生成并显示在一个设备上,然后用户将其输入另一个设备(步骤2)。这个短的共享密钥将是设备相互认证的基础。对于k-bit密钥,步骤3到8重复k次。例如,对于6位密钥(999999 = 0xF423F),k = 20-bit。

在步骤3-8中,每一方使用长随机数(128位)提交密钥的每个位,并将随机数的散列,密钥的位和两个公钥发送给另一方。然后各方轮流透露他们的密钥,直到整个Passkey相互告知。

3阶段:认证阶段2

然后,第二阶段的验证确认两个设备都已成功完成交换。这个阶段在所有三个协议中都是相同的。

每个设备计算包括先前交换的值和新导出的共享密钥的新确认值(步骤9)。然后,发起设备发送其确认值,该确认值由响应设备检查(步骤10)。如果此检查失败,则表示启动设备尚未确认配对,并且必须中止协议。然后,响应设备发送其确认值,该确认值由发起设备检查(步骤11)。失败表示响应设备尚未确认配对,协议应中止。

蓝牙学习笔记之安全规范(SS)(十三)_第11张图片

4阶段:链接密钥计算

一旦双方都确认了配对,就从导出的共享密钥和公开交换的数据计算链接密钥(步骤12)。即使双方都使用长期ECDH值,特定随机数也能确保密钥的新鲜度。此链接键用于维护配对。

当计算链接密钥时,双方应以相同的顺序输入参数以确保两个设备计算相同的密钥。

蓝牙学习笔记之安全规范(SS)(十三)_第12张图片

5阶段:LMP认证和加密

简单配对的最后阶段包括身份验证和加密密钥的生成。这与传统配对的最后步骤相同。

 

我收集的相关资料如加密的算法、sniffer抓取的log等,我已通过网盘分享出来,需要的请到我的博客<蓝牙学习笔记(序)>最下面的网盘链接中下载!

你可能感兴趣的:(蓝牙协议栈)