1. v=【215s15+217s13+221s10+220s4+(1+28)s0 】mod (231-1); 2. If v=0, then set v=231-1; 3. s16=v⊕u;
4. If s16=0, then set s16=231-1; 5. (s1,s2, …,s15,s16)→(s0,s1, …,s14,s15). }
在工作模式LFSR不接收输入,逐位执行右移操作。 LFSRWithWorkMode() {
1. s16=215s15+217s13+221s10+220s4+(1+28)s0 mod (231-1); 2. If s16=0, then set s16=231-1; 3. (s1,s2, …,s15,s16)→(s0,s1, …,s14,s15). }
注1:2i与31比特数相乘可表示为向左循环移位i位,只是在上述功能的第1步中,增加模(231-1)的操作。因此LFSRWithInitialisationMode(u)函数中的第1步也可如下实现:
v=(s15<<<3115)+(s13<<<3117)+(s10<<<3121)+(s4<<<3120) +s0 mod(231-1). 同样,LFSRWithWorkMode()中的step1也可依此实现。
注2:对于GF(231-1)的两参数a、b,v=a+b mod (231-1)可通过几步实现:(1)计算v=a+b,(2)如果进位是1,令v=v+1。也可以:(1)计算w=a+b,w是32比特的值,(2)令v= (w的低31比特)+(w的最高有效位)。 3.1.6.3 比特重组BR
该层将LFSR产生的128位重组为4个32位的字做为F的输入。
设 s0, s2, s5, s7, s9, s11, s14, s15 是 LFSR 的8个寄存器,重组后的4个32位字X0,X1,X2,X3 产生方法如下: Bitreorganization() {
1. X0=s15H || s14L; 2. X1=s11L || s9H; 3. X2=s7L || s5H; 4. X3=s2L ||s0H. }
3.1.6.4 非线性函数F
3.1.6.4.1 工作过程
31
F 有2个32位的存储单元 R1 和R2. 输入为 X0, X1 和X2, F输出一个32位字 W. 过程如下: F (X0, X1, X2) {
1. W=( X0⊕R1) ? R2; 2. W1= R1?X1; 3. W2= R2⊕X2;
4. R1=S(L1(W1L||W2H)); 5. R2=S(L2(W2L||W1H)). }
上面S 是32×32 的S盒, L1 和 L2 是线性转换.
3.1.6.4.2 S盒
一个32×32 S盒由4个并列的8×8 S盒组成,即 S=(S0,S1,S2,S3), 并且 S0=S2, S1=S3. S0 、 S1 定义分别参见表3.1.6.4-1和表3.1.6.4-2.
表3.1.6.4-1 S0(S2)盒定义
0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F
3E 72 5B 47 CA E0 00 33 04 D1 54 98 09 B9 6D CB 7B 1B F9 32 AF 9D 6A A 5 B8 2D FC 1D 08 53 03 90 4D 4E 84 99 E4 CE D9 91 DD B6 85 48 8B 29 6E AC CD C1 F8 1E 73 43 69 C6 B5 BD F D 39 63 20 D4 38 76 7D B2 A7 CF ED 57 C5 F3 2C BB 14 21 06 55 9B E3 EF 5E 31 4F 7F 5A A 4 0D 82 51 49 5F BA 58 1C 4A 16 D5 17 A8 92 24 1F 8C FF D8 AE 2 E 01 D3 AD 3B 4B DA 46 EB C9 DE 9 A 8F 87 D7 3A 80 6F 2F C8 B1 B4 37 F7 0A 22 13 28 7C CC 3C 89 C7 C3 96 56 07 BF 7E F0 0B 2B 97 52 35 41 79 61 A6 4C 10 FE BC 26 95 88 8A B0 A3 F B C0 18 94 F2 E1 E5 E9 5D D0 DC 11 66 64 5C EC 59 42 75 12 F5 74 9C AA 23 0E 86 AB BE 2A 02 E7 67 E6 44 A2 6C C2 93 9F F1 F6 FA 36 D2 50 68 9E 62 71 15 3D D6 40 C4 E2 0F 8E 83 77 6B 25 05 3F 0C 30 EA 70 B7 A1 E8 A9 65 8D 27 1A DB 81 B3 A0 F4 45 7A 19 DF E E 78 34 60
表3.1.6.4-2 S1(S3)盒定义
32
0 1 2 3 4 5 6 7 8 9 A B C D E F 0 55 C2 63 71 3B C8 47 86 9F 3C DA 5B 29 AA FD 77
1 8C C5 94 0C A6 1A 13 00 E3 A8 16 72 40 F9 F8 42 2 44 26 68 96 81 D9 45 3E 10 76 C6 A7 8B 39 43 E1
3 3A B5 56 2A C0 6D B3 05 22 66 BF DC 0B FA 62 48 4 DD 20 11 06 36 C9 C1 CF F6 27 52 BB 69 F5 D4 87 5 7F 84 4C D2 9C 57 A4 BC 4F 9A DF FE D6 8D 7A EB 6 2B 53 D8 5C A1 14 17 FB 23 D5 7D 30 67 73 08 09 7 EE B7 70 3F 61 B2 19 8E 4E E5 4B 93 8F 5D DB A9 8 AD F1 AE 2E CB 0D FC F4 2D 46 6E 1D 97 E8 D1 E9 9 4D 37 A5 75 5E 83 9E AB 82 9D B9 1C E0 CD 49 89 A 01 B6 BD 58 24 A2 5F 38 78 99 15 90 50 B8 95 E4 B D0 91 C7 CE ED 0F B4 6F A0 CC F0 02 4A 79 C3 DE C A3 EF EA 51 E6 6B 18 EC 1B 2C 80 F7 74 E7 FF 21 D 5A 6A 54 1E 41 31 92 35 C4 33 07 0A BA 7E 0E 34 E 88 B1 98 7C F3 3D 60 6C 7B CA D3 1F 32 65 04 28 F 64 BE 85 9B 2F 59 8A D7 B0 25 AC AF 12 03 E2 F2
如果 x 是 8位输入到 S0 (或 S1),并且x=h||l.则S0(或S1)表第h行第l列的数据就是输出。 【例子】
S0(0x12)=0xF9 and S1(0x34)=0xC0.
如果X是 32位的输入,输出Y也是32位:
X = x0 || x1 || x2 || x3, Y = y0 || y1 || y2 || y3,
这里 xi 和yi 是所有的字节, i=0,1,2,3. 则
yi=Si(xi), i=0,1,2,3.
【例子】
设 输入X=0x12345678 , 输出Y为:
Y=S(X)=S0(0x12)||S1(0x34)||S2(0x56)||S3(0x78)=0xF9C05A4E.
3.1.6.4.3 线性转换
L1 和L2 定义为:
33
L1(X)=X⊕(X<<<2)⊕(X<<<10)⊕(X<<<18)⊕(X<<<24), L2(X)=X⊕(X<<<8)⊕(X<<<14)⊕(X<<<22)⊕(X<<<30).
3.1.6.5 ZUC两个阶段
3.1.6.5.1 初始化阶段
初始化阶段将128位初始密钥k 和128位初始矢量 iv 输入LFSR 进入初始状态设置 R1 和 R2 为0. 然后执行如下过程
1. Bitreorganization();
2. u=F(X0, X1, X2)⊕X3; 3. LFSRWithInitialisationMode(u>>1).
3.1.6.5.2 密钥流产生阶段
首先执行下面操作一次,丢弃F的输出W:
1. Bitreorganization();
2. F(X0, X1, X2); 3. LFSRWithWorkMode()
然后产生密钥流,即每执行一次,产生一个32位的Z:
1. Bitreorganization();
2. Z= F(X0, X1, X2)⊕X3; 3. LFSRWithWorkMode() 3.1.6.6 EIA3算法实现
3.1.6.6.1 输入输出
void EIA3(u8* IK,u32 COUNT,u32 DIRECTION,u32 BEARER,u32 LENGTH,u32* M,u32* MAC)
输入参数:
参数 长度(bits) 说明 COUNT 32 计数COUNT [0]…COUNT [31] BEARER 5 承载标识 34
DIRECTION IK LENGTH M 输出参数:
1 128 32 LENGTH 方向DIRECTION [0] 完整性保护密钥IK [0]…IK [127] 数据流长度 输入数据流 参数 MAC 3.1.6.6.2 初始化
长度(bits) 32 说明 产生的验证码 下面介绍ZUC参数如何定义:初始密钥KEY和初始向量IV是根据完整性保护密钥IK和初始变量产生的。
IK是128比特完整性密钥,其中IK[i] (0≤i≤15)是一个字节。
IK= IK [0] ║IK [1] ║IK [2] ║?║IK [15]
用于ZUC算法的128比特初始密钥KEY如下,其中KEY
KEY[i]=IK[i], i=0,1,2,?,15.
COUNT是32位计数,其中COUNT[i] ( 0≤i≤3)是一个字节。 COUNT=COUNT[0]║COUNT[1]║COUNT[2]║COUNT[3] 128比特初始向量IV为:
IV = IV[0]║IV[1] ║IV[2] ║?║IV[15], 其中,IV[i] ( 0≤i≤15) 是字节。且: 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].
3.1.6.6.3 密钥流产生
35
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库LTE - Security(加密保护算法)(7)在线全文阅读。
相关推荐: