蓝牙加密的加密算法是E0,但实际用于加密的是二进制流密码Kcipher。Kcipher是由E0生产的。在E0算法中,加密密钥KC被修改为实际加密密钥KC。Kc‘可以在1-16字节之间改变,但其最大有效长度由制造商预设。增加KC‘长度有利于提高安全性,目前64个加密密钥足以满足大多数用户的安全要求。
加密/解密过程中的蓝牙。
蓝牙加密E0算法的主要功能是生成二次进制密码流量Kcipher。蓝牙密码流量生成系统采用四个线性位移寄存器(LFSR),每个LFSR输出为一个简单的16状态有限状态机器(请求和合成器)组合,该状态机器输出为字节流序列,或初始化阶段的随机初始值。四个寄存器的长度分别为:L1=25、L2=31、L3=3、L4=39,总长度为128位。
生成密码流的过程。
为LSFRi设置xti的第一个符号,然后。
xt=xt1+xt2+xt3+xt4。
由下列公式给出求和发生器的输出:
xt=xt1xt2xt3xt4xt4ct0jo,1}
st+1=(st+11,st+10)=(yt+ct)/2me0,1,2,3)
ct+1=(ct+11,ct+10)=st+1vot1[ct]-t2[ct-1]
在GF(4)上,T1[.]和T2[.]是两种不同的线性双射。
产生密码流需要四个线性反馈移位寄存器的初始值(共128位)和4位用于指定C0和C-1的值。这132位初始值由密码流生成器本身生成,输入参数为:Kc.RAND.BD_ADDR和CLK26-1。
接下来,让我们记住,X序列中X的第一个字节是X[I],X序列中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)modg1(L)(X)
在公式中,deg(g1(L)(X))=8L是多项式g1(L)(X)最高项的次数;deg(g2(L)(X)≤128-8L是多项式g2(L)(X)最高项的次数,1≤≤16是实际加密密钥。
2.将26位蓝牙时钟和常数11001208位移入Kc'.BD_ADDR.26位蓝牙时钟。
每个输入端的信号分配如下:
①过程描述如下:打开所有开关。将所有内容为0的移位存储器设置为t=0。
②开始向LFSRi中移动。每一行中最右边的一个最先移动到相应的LFSR中。
③关闭相应的LFSR开关,当第一行到达LFSRi的最右边时。
现在C39和C39-1的内容已经不开关已关闭),使得c39=c39-1=0,现在c39和c39-1的内容不再重要,在此之前,c39和c39-1用于计算输出序列。
⑤从t=40开始计算和合成器,并产生输出符号(密钥流)。剩余的输入位置不断地移动到相应的位移存储器中。当最后一个位移进入时,位移存储器记录输入为0。
3.在所有开关关闭(此时t=239)之前,混合初始数据,继续计数,直到产生200密钥流。
4.保存ct和ct-1。在t=240中,输入四个LFSR作为最近产生的128密钥流的初始值。
从这个时候开始,当每个时钟到达时,发生器产生一个加密/解密序列,XOR与有效载荷数据发送(接收)。