商用密码算法原理与C语言实现
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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,对于每个ii=0,1,…,LENGTH-1,如果M [i]=1,那么T=Tki,计算T=TkLENGTH ,最后计算MAC=Tk32×(L-1)

最后计算是为了使生成的密钥流比特串k[0],k[1],…,k[32×L-1]全部参与消息认证码的运算。