3GPP機密性和完整性算法規範128-EEA3和128-EIA3(一)----密鑰生成原理
3GPP機密性和完整性算法規範128-EEA3和128-EIA3(二)----祖沖之算法的C語言實現
3GPP機密性和完整性算法規範128-EEA3和128-EIA3(三)----機密性算法(EEA3)和完整性算法(EIA3)
3GPP機密性和完整性算法規範128-EEA3和128-EIA3(四)----測試用例
3GPP機密性和完整性算法規範128-EEA3和128-EIA3(五)----文檔代碼資源
最近公司要研發一款用於鏈路通信加密的設備,使用祖沖之算法對OSI七層中的數據鏈路層數據進行流式加密,對祖沖之算法的密鑰生成,機密性和完整性算法都進行了學習。
- 引言
ZUC是一個面向字的流密碼。它需要一個128位的初始密鑰和一個128位的初始矢量(IV)作爲輸入,輸出一串32位字的密鑰流(因此,這裏每一個32位的字稱爲密鑰字)。密鑰流可以用來加密/解密。
ZUC的執行分爲兩個階段:初始化階段和工作階段。在第一階段,將密鑰和初始向量IV初始化,也就是,時鐘控制着密碼運行但不產生輸出(見章節3.6.1)。第二階段是工作階段,在這個階段,隨着每一個時鐘脈衝,它都會產生一個32位字的輸出(見章節3.6.2)。
- 符號和慣例
2.1 基
在這份文檔中,除非另有原因,一般整數被表示成十進制數字。我們使用前綴“0 x”表示十六進制數字,下標“2”是以二進制方式表示一個數。
例1整數a 可以寫成不同的表示方式:
a = 1234567890 十進制表示法
= 0x499602D2 十六進制表示法
= 10010011001011000000010110100102 二進制表示法
2.2 位排序
在這份文檔中,所有的數據變量在左手邊提供最高有效位(字節),在右手邊提供最低有效位(字節)。
例2 假設a=10010011001011000000010110100102 。那麼它的最高有效位是1(最左邊的那個位),最低有效位是0(最右邊的那個位)。
2.3 註釋
+ 兩個整數的加法
ab 整數a和b的乘法
= 賦值運算符
mod 整數的模運算
⊕ 整數的位異或運算
⊞ 模 232 的加法
a || b 字符串a和b的級聯
aH 整數a的最左邊16位
aL 整數a的最右邊16位
a <<<n k n位寄存器a 向左的k 位循環移位
a >> 1 整數a 右移一位
(a1, a2,…, an)→(b1, b2,…, bn) 把ai 對應賦值給 bi
例3 對於任意兩個字符串a和b,由a和b級聯生成的字符串c的描述同樣遵循在章節2.2中定義的規則。也就是說,最高有效位在左手邊,最低有效位在右手邊。例如,
a=0x1234,
b=0x5678,
於是我們有
c = a||b =0x12345678.
例 4 假設
a=10010011001011000000010110100102
於是我們有
aH=10010011001011002,
aL=00000010110100102.
例 5 假設
a=110010011001011000000010110100102.
於是我們有
a >> 1=11001001100101100000001011010012.
例 6 假設 a0, a1, …, a15, b0, b1, …, b15 都是整型變量,那麼
(a0, a1, …, a15)→(b0, b1, …, b15)
結果是 bi=ai, 0≤i≤15。
- 算法描述
3.1 算法的總體結構
如圖1,ZUC有三個邏輯層。頂層是一個16段的線性反饋移位寄存器(LFSR)。中間層是比特重組(BR),底層是一個非線性函數F。
圖1 ZUC算法的總體結構
3.2 線性反饋移位寄存器(LFSR)
線性反饋移位寄存器(LFSR)有16個31位的單元(s0, s1,…, s15),每個單元 si (0≤i≤15)僅限在下列集合中取值
{1,2,3, …,231–1}。
LFSR包含兩個操作模式:初始化模式和工作模式。
初始化模式時,LFSR接收一個31位的輸入字u,u是通過去掉非線性函數F輸出的32位字W的最右邊的位獲得的。也就是,u=W>>1。更具體地說,初始化模式工作如下:
LFSRWithInitialisationMode(u)
{
1. v=215s15+217s13+221s10+220s4+(1+28)s0 mod (231-1);
2. s16=(v+u) mod (231-1);
3. If s16=0, then set s16=231-1;
4. (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).
}
注意事項:由於在有限域GF(231-1)上的一個31位字符s和2i的乘積可以用s向左循環移位i位來實現,因此在上面函數的步驟1中,加法模231-1是需要的。更確切地說,函數LFSRWithInitialisationMode中的步驟1可以實現如下:v=(s15<<<3115)+(s13<<<3117)+(s10<<<3121)+(s4<<<3120)+(s0 <<<318)+s0 mod (231-1),
並且,在函數LFSRWithWorkMode裏的步驟1中也需要同樣的實現方式。
注意事項:對於有限域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.3 比特重組
該算法的中間層是比特重組。該層從LFSR單元抽取128位,形成4個32位的字。這裏的前3個字會在底層的非線性函數F中使用。最後一個字將涉及產生密鑰流。
和章節3.2中一樣,假設s0, s2, s5, s7, s9, s11, s14, s15 是LFSR裏的8個單元。比特重組從上面的8個單元裏按如下方式形成4個32位的字X0, X1, X2, X3:
Bitreorganization()
{
1. X0=s15H || s14L;
2. X1=s11L || s9H;
3. X2=s7L || s5H;
4. X3=s2L ||s0H.
}
註解: si是31位的整數,因此siH是指si的從第30到15位,而不是第31到16位,對於0≤i≤15。
3.4 非線性函數F
非線性函數F包括2個32位的記憶單元R1 和 R2。假設F的輸入爲X0 ,X1 和 X2.,其中 X0, X1 和 X2來自比特重組的輸出(見章節3.3),然後F輸出一個32位的字W,函數F的具體過程如下:
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)).
}
見章節3.4.1,在這裏,S是一個32×32位的S盒,L1 和L2 是在章節3.4.2裏定義的線性變換。
3.4.1 S盒 S
32×32的S盒S是由4個並列的8×8 的S盒組成,也就是說,S=(S0,S1,S2,S3),這裏S0=S2, S1=S3。S0 和 S1的定義分別在表3.1和表3.2中。
假設x是S0 (或S1)的一個8位輸入。把x像這樣x=h||l寫成兩個十六進制數,那麼表3.1(或表3.2)裏第h行和l列相交的條目是S0 (或 S1)的輸出。
例7 S0(0x12)=0xF9 和S1(0x34)=0xC0
假設S盒S的32位輸入X和32位輸出Y如下:
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.
例8 假設X=0x12345678是S盒的32位輸入,Y是S盒的32位輸出。於是我們有
Y=S(X)=S0(0x12)||S1(0x34)||S2(0x56)||S3(0x78)=0xF9C05A4E.
表 3.1. S盒 S0
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
0 |
3E |
72 |
5B |
47 |
CA |
E0 |
00 |
33 |
04 |
D1 |
54 |
98 |
09 |
B9 |
6D |
CB |
1 |
7B |
1B |
F9 |
32 |
AF |
9D |
6A |
A5 |
B8 |
2D |
FC |
1D |
08 |
53 |
03 |
90 |
2 |
4D |
4E |
84 |
99 |
E4 |
CE |
D9 |
91 |
DD |
B6 |
85 |
48 |
8B |
29 |
6E |
AC |
3 |
CD |
C1 |
F8 |
1E |
73 |
43 |
69 |
C6 |
B5 |
BD |
FD |
39 |
63 |
20 |
D4 |
38 |
4 |
76 |
7D |
B2 |
A7 |
CF |
ED |
57 |
C5 |
F3 |
2C |
BB |
14 |
21 |
06 |
55 |
9B |
5 |
E3 |
EF |
5E |
31 |
4F |
7F |
5A |
A4 |
0D |
82 |
51 |
49 |
5F |
BA |
58 |
1C |
6 |
4A |
16 |
D5 |
17 |
A8 |
92 |
24 |
1F |
8C |
FF |
D8 |
AE |
2E |
01 |
D3 |
AD |
7 |
3B |
4B |
DA |
46 |
EB |
C9 |
DE |
9A |
8F |
87 |
D7 |
3A |
80 |
6F |
2F |
C8 |
8 |
B1 |
B4 |
37 |
F7 |
0A |
22 |
13 |
28 |
7C |
CC |
3C |
89 |
C7 |
C3 |
96 |
56 |
9 |
07 |
BF |
7E |
F0 |
0B |
2B |
97 |
52 |
35 |
41 |
79 |
61 |
A6 |
4C |
10 |
FE |
A |
BC |
26 |
95 |
88 |
8A |
B0 |
A3 |
FB |
C0 |
18 |
94 |
F2 |
E1 |
E5 |
E9 |
5D |
B |
D0 |
DC |
11 |
66 |
64 |
5C |
EC |
59 |
42 |
75 |
12 |
F5 |
74 |
9C |
AA |
23 |
C |
0E |
86 |
AB |
BE |
2A |
02 |
E7 |
67 |
E6 |
44 |
A2 |
6C |
C2 |
93 |
9F |
F1 |
D |
F6 |
FA |
36 |
D2 |
50 |
68 |
9E |
62 |
71 |
15 |
3D |
D6 |
40 |
C4 |
E2 |
0F |
E |
8E |
83 |
77 |
6B |
25 |
05 |
3F |
0C |
30 |
EA |
70 |
B7 |
A1 |
E8 |
A9 |
65 |
F |
8D |
27 |
1A |
DB |
81 |
B3 |
A0 |
F4 |
45 |
7A |
19 |
DF |
EE |
78 |
34 |
60 |
表 3.2. S盒 S1
|
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 |
注:上面S盒S0 和S1 裏的條目都是以十六進制表示的
3.4.2 線性變換L1 和L2
L1 和L2 都是32位到32位的線性變換,其定義如下:
L1(X)=X⊕(X<<<322)⊕(X<<<3210)⊕(X<<<3218)⊕(X<<<3224),
L2(X)=X⊕(X<<<328)⊕(X<<<3214)⊕(X<<<3222)⊕(X<<<3230)。
3.5 密鑰加載
隨着LFSR的初始化,密鑰加載過程將會把初始的密鑰和初始矢量擴展到16個31位的整數。假設128位的初始密鑰k和128位的初始向量iv如下:
k=k0||k1||k2||…||k15
和
iv= iv0|| iv1|| iv2||…|| iv15
這裏ki 和 ivi分別都是字節,0≤i≤15 。接着k和iv被加載到LFSR的s0, s1, …, s15 ,如下:
- 假設D是一個由16個15位子字符串組成的240位的長常字符串:
D= d0||d1 ||…||d15,
這裏
d0 = 1000100110101112,
d1 = 0100110101111002,
d2 = 1100010011010112,
d3 = 0010011010111102,
d4 = 1010111100010012,
d5 = 0110101111000102,
d6 = 1110001001101012,
d7 = 0001001101011112,
d8= 1001101011110002,
d9 = 0101111000100112,
d10 = 1101011110001002,
d11 = 0011010111100012,
d12 = 1011110001001102,
d13 = 0111100010011012,
d14 = 1111000100110102,
d15 = 1000111101011002.
2、對0≤i≤15,使si=ki||di||ivi。
3.6 ZUC算法的執行
執行ZUC算法分兩個階段:初始化階段和工作階段。
3.6.1初始化階段
在初始化階段,算法調用密鑰加載過程把128位的密鑰k和128位的初始向量iv加載到LFSR裏,(見章節3.5),並且把32位記憶單元 R1 和 R2全部清零,然後密碼按如下方式操作32次:
1. Bitreorganization(); // 見章節 3.3
2. w=F(X0, X1, X2); // 見章節3.4
3. LFSRWithInitialisationMode(w>>1). // 見章節 3.2
3.6.2工作階段
在初始化階段之後,算法進入到工作階段。在工作階段,算法執行一次下面的操作,並丟棄函數F的輸出W。
1. Bitreorganization(); // 見章節3.3
2. F(X0, X1, X2); //丟棄輸出,見章節 3.4
3. LFSRWithWorkMode(). // 見章節3.2
接着算法進入產生密鑰流階段,也就是說,對於每一次迭代,執行一次下列操作,並輸出一個32位的字Z:
1. Bitreorganization(); // 見章節 3.3
2. Z= F(X0, X1, X2)⊕X3; // X3的定義,見章節 3.3
3. LFSRWithWorkMode() . //見章節 3.2