- 商用密碼算法原理與C語言實現(xiàn)
- 李子臣
- 2268字
- 2020-07-28 13:37:09
2.1 算法描述
ZUC算法是一個面向32比特字設計的序列密碼算法。其需要一個128比特的初始密鑰和一個128比特的初始變量作為輸入,輸出一串32比特字的密鑰流。生成的密鑰流可以用來進行加密/解密和完整性認證。
ZUC算法整體邏輯結構如圖2-1所示,可分為上、中、下三層,上層是16級的線性反饋移位寄存器(LFSR),中間層是比特重組(BR),下層是非線性函數(shù)F。
2.1.1 參數(shù)描述
ZUC算法中的慣例如下所示。
比特:二進制字符0和1稱為比特。
字節(jié):由8比特組成的比特串稱為字節(jié)。
字:由2字節(jié)以上(包含2字節(jié))組成的比特串稱為字。
整數(shù)表示:本章整數(shù)默認采用十進制數(shù)表示。當采用其他進制數(shù)表示時,將在表示之前或之后添加指示符。
例如,使用前綴“0x”表示十六進制數(shù),下標“2”表示二進制數(shù)。整數(shù)a 可以寫成不同的表示方式:

圖2-1 ZUC算法整體邏輯結構

高、低位順序:字的最高位總是位于字表示中的最左邊,最低位總是位于字表示中的最右邊。
例如,假設a=10010011001011000000010110100102 ,那么它的最高位是1,最低位是0。
ZUC算法中常用符號及解釋如表2-1所示。
表2-1 ZUC算法中常用符號及解釋

續(xù)表

下面對一些符號進行詳細解釋。
1)字符串連接符
對于任意兩個字符串a和b連接后生成的字符串c的描述同樣遵循相關規(guī)則。也就是說,最高位在左邊,最低位在右邊。例如:
a=0x1234
b=0x5678
于是有
c=a||b=0x12345678
2)取字的最高16比特和最低16比特的劃分
假設
a=10010011001011000000010110100102
于是有
a H =10010011001011002
a L =00000010110100102
這里值得注意的是,aH和aL都為16比特。
3)比特字移位
假設
a=110010011001011000000010110100102
于是有
a>>1=11001001100101100000001011010012
4)映射關系對應賦值
假設a0,a1,…,a15和b0,b1,…,b15都是整型變量,那么(a0,a1,…,a15) (b0,b1,…,b15)的結果是bi=ai,0≤i≤15。
2.1.2 參數(shù)產生
ZUC算法在初始執(zhí)行過程中,需用到的參數(shù)為一個128比特的初始密鑰k和一個128比特的初始變量iv。
1)密鑰裝入
初始密鑰和初始變量按照如下方法加載到LFSR的寄存器單元變量s0 ,s1 ,…,s15中,每個單元變量si(0≤i≤15)僅在有限域GF(232-1)中取值。密鑰裝入過程將128比特的初始密鑰k和128比特的初始變量iv擴展為16個31比特,并加載到每個單元變量si中。
將k和iv表示成16字節(jié)串級聯(lián)的形式,即k=k0||k1||…||k15 ,iv=iv0||iv1||…||iv15。在LFSR中,si=ki||di||ivi(0≤i≤15),其中ki和ivi的長度均為8比特,di的長度為15比特。
16個已知字符串di級聯(lián)成一個240比特的長字符串D,D=d0||d1||…||d15。每個di均具有固定參數(shù),具體如下:
d 0 =1000100110101112
d 1=0100110101111002
d 2 =1100010011010112
d 3=0010011010111102
d 4 =1010111100010012
d 5=0110101111000102
d 6 =1110001001101012
d 7 =0001001101011112
d 8=1001101011110002
d 9 =0101111000100112
d 10 =1101011110001002
d 11=0011010111100012
d 12 =1011110001001102
d 13=0111100010011012
d 14 =1111000100110102
d 15=1000111101011002
在ZUC算法中還需用到S盒和線性變換L這兩種運算工具。
2)S盒
32比特S盒的S由4個小的8×8的S盒并置而成,即S=(S0,S1,S2,S3),其中S0 =S2 ,S1=S3。S0和S1的定義分別見表2-2和表2-3。設S0(或S1)的8比特輸入為x,將x視為兩個十六進制數(shù)的連接,即x=h||l,則表2-2(或表2-3)中第h行l列交叉的元素即為S0(或S1)的輸出S0(x)(或S1(x))。
設S的32比特輸入X和32比特輸出Y分別為:
X=x0||x1||x2||x3
Y=y0||y1||y2||y3
其中,xi和yi的長度均為8比特,則yi=S(xi),i=0,1,2,3。
表2-2 S盒S0的定義

表2-3 S盒S1的定義

續(xù)表

注:表2-2、表2-3條目中的數(shù)據(jù)均為十六進制整數(shù)。
3)線性變換L1和L2
L 1和L2都是由32比特到32比特的線性變換,其定義如下:
L 1 (X)=X ⊕(X<<<32 2)⊕(X<<<32 10)⊕(X<<<32 18)⊕(X<<<32 24)
L 2 (X)=X ⊕(X<<<32 8)⊕(X<<<32 14)⊕(X<<<32 22)⊕(X<<<32 30)
2.1.3 算法運行
算法運行分為兩個階段:初始化階段和工作階段。在初始化階段,將初始密鑰和初始變量進行初始化,密碼算法運行,但不產生輸出;在工作階段,每個時鐘脈沖均會產生32比特字的輸出。
1.初始化階段
按照密鑰裝入方法將128比特密鑰k和初始變量iv加載到LFSR的寄存器單元變量s0 ,s1 ,…s15中,作為LFSR的初始狀態(tài),并置32比特記憶單元變量R1和R2為全0,然后執(zhí)行下述操作。
重復執(zhí)行下述過程32次:
① Bitreorganization()
② W=F(X0, X1, X2)
③ LFSRWithInitialisationMode(W>>1)
算法中各模塊解釋如下。
1)Bitreorganization比特重組模塊
Bitreorganization在圖2-1中表示為BR層,該層從LFSR的寄存器單元中抽取128比特組成4個32比特字X0,X1,X2,X3。這里的前3個字會在底層的非線性函數(shù)F中使用。最后一個字將產生密鑰流,以供非線性函數(shù)F 和密鑰輸出使用。假設s0 ,s2 ,s5 ,s7 ,s9 ,s11 ,s14 ,s15是LFSR中特定的8個單元,比特重組模塊按照如下方式形成4個32比特字X0,X1,X2,X3:

2)非線性函數(shù)F
F包括2個32比特的記憶單元R1和R2。F的輸入為3個32比特字X0,X1,X2,F輸出為一個32比特字W。F的具體過程如下:

其中,是模232加法運算,S是一個32×32比特的S盒,L1和L2是定義的線性變換。S盒和線性變換的具體結構見2.1.1節(jié)。
3)LFSRWithInitialisationMode初始化
在初始化階段,LFSR接收一個31比特字u,u是通過去掉非線性函數(shù)F輸出的32比特字W的最右邊的位獲得的,即u=W >>1。在初始化階段,LFSR計算過程如下:

2.工作階段
在初始化階段后,算法進入工作階段。在工作階段,算法執(zhí)行一次下面的操作,并丟棄函數(shù)F的輸出W。
① Bitreorganization()
② F(X0, X1, X2)
③ LFSRWithWorkMode()
然后進入密鑰輸出階段。在密鑰輸出階段,每運行一拍,執(zhí)行下面過程一次,并輸出一個32比特字的密鑰Z。
① Bitreorganization()
② Z=F(X0, X1, X2)⊕X3
③ LFSRWithWorkMode()
其中,LFSRWithWorkMode()不再接收任何輸入,其計算過程如下:

2.1.4 安全性分析
針對ZUC算法,這里采用猜測確定攻擊(Guess and Determine)的密碼分析方法對其安全性進行簡要分析。
安全性分析主要分為兩個階段:第1個階段推導和
,這是因為若直接猜測
和
,則需要猜測64比特,而
和
為已知的全0初值,若用其推導
和
,則只需猜測16比特;第2個階段從t=2時刻(密鑰流的輸出時刻)利用已推導的
和
開始分析,并找到t=5時刻的全部內部單元。
在推導的過程中,由于
和
為已知的全0初值,因此可以首先通過猜
和
的高8位推導出
和
,然后通過猜t=1時刻
和
的高8位推導出
和
。
t=2時刻的已知變量為和
。在此時刻我們預猜測一部分內部單元,然后由此推導出一部分結果。在此需要注意的是,
和
已不是
移位得到的,因此其31位均為未知。
以此類推,在t=3、t=4、t=5時刻時均用此分析方法。在t=5時刻,由可知該時刻的已知量為
,此外還有
和
。因此,t=5時刻的全部內部單元均已找到。之后即可用所求內部單元生成密鑰來檢測與原密鑰是否相同。
在猜測過程中,猜測的位置是t=0時刻的的高8位,共16比特;t=1時刻的
的高8位,共16比特;t=2時刻的
的高8位和
的低15位,共55比特;t=3時刻共31比特;t=4時刻共8比特。因此,總共猜測16+16+55+31+8=126比特。此時搜索復雜度為O(2126 ),而其窮盡搜索復雜度為O(2128 ),提高了效率。
顯然,猜測確定攻擊對ZUC算法的安全性影響不大。