
2.2 加密/解密算法和完整性算法
加密/解密算法128-EEA3是一个序列密码,利用一个保密密钥CK对数据块进行加密/解密。数据块的长度范围为1~65504比特。完整性算法128-EIA3利用一个完整性密钥,针对一个给定的输入信息计算一个32比特消息认证码(Message Authentication Code,MAC)。
2.2.1 加密/解密算法
1)算法的输入/输出参数
算法的输入/输出参数如表2-4所示。
表2-4 算法的输入/输出参数

2)算法的总体结构
算法的总体结构如图2-2所示。

图2-2 算法的总体结构
3)算法的初始化
设CK=CK[0]||CK[1]||…||CK[15],为128比特保密密钥。KEY=KEY[0]||KEY[1]||…||KEY[15],为128比特初始密钥。其中CK[i]、KEY[i] (0≤i≤15)都为8比特,则有KEY[i]=CK[i],i=0,1,…,15。
设计数器COUNT=COUNT[0]||COUNT[1]||COUNT[2]||COUNT[3],其中COUNT[i] (0≤i≤3)为8比特,那么COUNT为32比特。
同时,设ZUC算法中的128比特初始变量为IV,IV=IV[0]||IV[1]||…||IV[15],其中IV[i](0≤i≤15)为8比特,则有
IV[0]=COUNT[0],IV[1]=COUNT[1]
IV[2]=COUNT[2],IV[3]=COUNT[3]
IV[4]=BEARER||DIRECTION||002
IV[5]=IV[6]=IV[7]=000000002
IV[8]=IV[0],IV[9]=IV[1]
IV[10]=IV[2],IV[11]=IV[3]
IV[12]=IV[4],IV[13]=IV[5]
IV[14]=IV[6],IV[15]=IV[7]
4)密钥流的生成
利用算法初始化中生成的初始密钥KEY和初始变量IV,算法将产生L个32比特字的密钥流。将生成的密钥流用比特串表示为k[0],k[1],…,k[32×L-1],其中k[0]为算法生成的第1个密钥字的最高比特位,k [31]为最低比特位,其他以此类推。为了处理长度为LENGTH的输入比特流,L的取值为。
5)加密和解密过程
加密和解密都是相同的操作,设长度为LENGTH的明文输入比特流为:
IBS=IBS[0]||IBS[1]||IBS[2]||…||IBS[LENGTH-1]
对应的输出密文比特流为:
OBS=OBS[0]||OBS[1]||OBS[2]||…||OBS[LENGTH-1]
其中,IBS[i]和OBS[i]均为1比特,则有OBS[i]=IBS[i]+k[i] (i=0,1,…,LENGTH-1)。
2.2.2 完整性算法
1)算法的输入/输出参数
算法的输入/输出参数如表2-5所示。
表2-5 算法的输入/输出参数

2)算法的总体结构
算法的总体结构如图2-3所示。

图2-3 算法的总体结构
3)算法的初始化
算法的初始化主要是根据完整性密钥IK和其他输入参数(见表2-5)构造初始密钥KEY和初始变量IV。
设IK=IK[0]IK[1]…IK[15],为128比特完整性密钥,其中IK[i](0≤i≤15)为1字节。
设KEY=KEY[0]||KEY[1]||…||KEY[15],为128比特初始密钥,其中KEY[i](0≤i≤15)为1字节。
则有KEY[i]=IK[i],i=0,1,…,15。
记计数器COUNT=COUNT[0]||COUNT[1]||COUNT[2]||COUNT[3],其中COUNT[i]为8比特,i=0,1,2,3。
设算法的初始变量IV=IV[0]||IV[1]||…||IV[15],其中IV[i](0≤i≤15)为8比特。则有
IV[0]=COUNT[0],IV[1]=COUNT[1]
IV[2]=COUNT[2],IV[3]=COUNT[3]
IV[4]=BEARER||0002 ,IV[5]=000000002
IV[6]=000000002,IV[7]=000000002
IV[8]=IV[0]⊕(DIRECTION<<7),IV[9]=IV[1]
IV[10]=IV[2],IV[11]=IV[3]
IV[12]=IV[4],IV[13]=IV[5]
IV[14]=IV[6]⊕(DIRECTION<<7),IV[15]=IV[7]
4)密钥流的生成
为了计算LENGTH比特消息的MAC值,L的取值为。利用初始密钥KEY和初始变量IV,算法将产生L个32比特字的密钥流。将生成的密钥流用比特串表示为k[0],k[1],…,k[32×L-1],其中k[0]为算法生成的第1个密钥字的最高比特位,k[31]为最低比特位,其余类推。
对于i=0,1,…,32×(L-1),令ki=k[i]||k[i+1]||…||k[i+31],则ki为32比特字。
5)计算MAC
设T为32比特字变量,置T=0,对于每个i,i=0,1,…,LENGTH-1,如果M [i]=1,那么T=T⊕ki,计算T=T⊕kLENGTH ,最后计算MAC=T⊕k32×(L-1)。
最后计算是为了使生成的密钥流比特串k[0],k[1],…,k[32×L-1]全部参与消息认证码的运算。