蓝牙加密的加密算法为E0,但实际用于加密的是二进制流密码Kcipher。Kcipher由E0产生。在E0算法中,加密密钥Kc被修改为实际加密密钥Kc′。Kc′可在1~16字节间变化,但其最大有效长度由厂商预置。增加Kc′的长度有利于增强安全性,当前64位加密密钥已足以满足大多数用户的安全要求。

蓝牙加密/解密过程
蓝牙加密过程及加密算法
蓝牙加密E0算法的主要作用是生成二进制密码流Kcipher。蓝牙密码流生成系统使用了4个线性移位寄存器(LFSR),每个LFSR的输出为一个16状态的简单有限状态机(求和合成器)的组合,该状态机的输出为字节流序列,或是初始化阶段的随机初始值。四个寄存器的长度分别为:L1=25,L2=31,L3=33,L4=39,总长度为128位。

密码流的生成过程
蓝牙加密过程及加密算法
设xti为LSFRi的第t个符号,那么
yt=xt1+xt2+xt3+xt4

求和发生器的输出由下列式子给出:
zt=xt1⊕xt2⊕xt3⊕xt4⊕ct0∈{0,1}
st+1=(st+11,st+10)=(yt+ct)/2∈{0,1,2,3}
ct+1=(ct+11,ct+10)=st+1⊕T1[ct] ⊕T2[ct-1]

式中,T1[.]和T2[.]是在GF(4)上的两个不同的线性双射。
密码流的产生需要4个线性反馈移位寄存器的初始值(共128位)和4位用于指定c0和c-1的值。这132位初始值由密码流产生器自己产生,输入参数为:Kc、RAND、BD_ADDR和CLK26-1。

下面我们记二进制序列X的第i字节为X[i],X的第0位为最低位。那么X[i]的最低位对应X的第8i位,X[i]的最高位对应X的第8i+7位。例如蓝牙地址的第24位为ADR[3]的最低位。LFSR的初始化过程如下:
1、从Kc推导出Kc′
Kc′(x)=g2(L)(x)(Kc(x)mod g1(L)(x))
式中,deg(g1(L)(x))=8L,为多项式g1(L)(x)最高项的次数;deg(g2(L)(x))≤128-8L,为多项式g2(L)(x)最高项的次数,1≤L≤16,为实际加密密钥。

2、把Kc′、BD_ADDR、26位蓝牙时钟以及常数111001共208位移入线性反馈移位寄存器。

各输入端的信号分配如下:
蓝牙加密过程及加密算法
①过程描述如下:打开所有开关。设置所有移位寄存器内容为0,令t=0。
②开始往LFSRi中移位。每行最右边的一位最先移入相应的LFSR。
③当第i行的第一位到达LFSRi的最右边时,关闭相应LFSR的开关。
④在t=39时(此时LFSR4的开关已关闭),令c39=c39-1=0,现在c39和c39-1的内容已不重要,在此之前,c39和c39-1用来计算输出序列。
⑤从t=40起求和合成器开始计数,同时产生输出符号(密钥流)。剩余的输入位不断地移入相应的移位寄存器。当最后一位移入时,移位寄存器记录输入为0。

3、混合初始数据,继续计数直到产生200位密钥流,同时所有开关关闭(此时t=239)。

4、保存ct和ct-1。在t=240时,把最近产生的128位密钥流作为初始值输入到四个LFSR。

从此时起,在每一时钟到来时发生器产生加/解密序列,与发送(接收)的有效载荷数据进行XOR。