上週相親去了,結果被拒,她說你不行,所以我又回來了~

零、我不行

鑒於大家的建議和點贊情況,本文基於以下原則:

1.我不行

2.多個一個公式少一半讀者(文章反摩爾定律)

3.標題一寸長,內容一寸強

自行選擇閱讀,感謝(被拒後很不開心,最近一週請不要私信罵我,謝謝~嗚嗚嗚)

本文及爛且毫無營養,代碼官方公開,找不到可私信我,有人看的話再寫吧。文檔在此:鏈接:pan.baidu.com/s/1kEda2n 密碼:p8vg

一、引言

ZUC演算法,即祖沖之演算法,屬於序列密碼,是我國第一個成為國際密碼標準的密碼演算法,並且還是移動通信 3GPP 機密性演算法 EEA3 和完整性演算法 EIA3的核心。(ZUC演算法是產生流密鑰演算法,非加密演算法,屬於國產密碼)

二、符號與運算符

本節可跳過,待後文遇見不解的符號或運算符再返回查找即可。

1、運算符

  • + 算術加法運算
  • ab 整數a和b的乘積
  • = 賦值操作符
  • mod 整數模運算
  • 按比特位逐位異或運算
  • 模2加法運算
  • 字元串或位元組串連接符
  • 下標H 取字的最高16比特
  • 下標L 取字的最低16比特
  • <<<k 32比特字循環左移k位
  • >>k 32比特字右移K位
  • a->b 向量a賦值給向量b,即按分量逐分量賦值

2、符號

  • S1,S2,S3,……S15 線性反饋移位寄存器的16個31比特寄存器單元變數
  • X1,X2,X3,X4 比特重組輸出的4個32比特字
  • R1,R2 非線性函數F的2個32比特記憶單元變數
  • W 非線性函數F輸出的32比特字
  • W1 R1與X1進行模2^32加法運算輸出的32比特字
  • W2 R2與X2按比特位逐位異或運算輸出的32比特字
  • Z 演算法每個節拍輸出的32比特密鑰字
  • K 初始種子密鑰
  • IV 初始向量
  • D1,D2,D3……D15 15比特的字元串常量
  • F 非線性函數
  • L 輸出密鑰字長度

3、縮略語

按縮寫就顯得很專業的原則,我們的裝X原則如下:

  • ZUC 祖沖之序列密碼演算法
  • LFSR 線性反饋移位寄存器
  • BR 比特重組演算法描述

三、演算法構架

1、為何說構架,因為ZUC演算法分為上中下三層,如下圖:

上層是16級線性反饋移位寄存器(LFSR);中層是比特重組(BR);下層是非線性函數F。

2、第一層:線性反饋移位寄存器(LFSR)

LFSR包括16個31比特寄存器單元變數S1,S2,S3,……S15。且有兩種運行模式:初始化模式和工作模式。

初始化模式

在初始化模式下,LFSR接收一個31比特字U。U是由非線性函數F的32位比特輸出W通過捨棄最低位比特得到的,即U=W>>1。在初始化模式下,LFSR模式計算過程如下:

LFSRWithInitialisationMode(U){ V=2^15S15+2^11S13+2^21S10+2^20S4+(1+2^8)S0 mod(2^31-1); S16=(V+U)mod (2^31-1); 如果S16=0,則設S16=2^31-1; (S1,S2,S3……,S16)->(S0,S1,S2……,S15);}

工作模式

在工作模式下,LFSR不接受任何輸入,流程如下:

LFSRWithWorkMode()

{

V=2^15 S15+2^11 S13+2^21 S10+2^20 S4+(1+2^8)S0 mod(2^31-1); 如果S16=0,則設S16=2^31-1; (S1,S2,S3……,S16)->(S0,S1,S2……,S15);}

3、第二層:比特重組(BR)

輸入為LFSR寄存器單位變數S0,S2,S5,S7,S9,S11,S14,S15,輸出為4個32比特字X0、X1、X2、X3。

BitReconstruction(){ X0=S15H || S14L; X1=S11L || S9H;

X2=S7L || S5H;

X3=S2L || S0H;}

4、第三層:非線性函數F

非線性函數F有2個32位的存儲單元,即R1和R2。令到F的輸入為X0,X1和X2,即為比特重組的前三個輸入,然後函數F輸出一個32位字W。F的詳細過程如下:

F(X0,X1,X2){ W=(X0⊕R1)田R2 W1=R1田X1 W2=R2⊕x2; R1=S(L1(W1L || W2H));

R2=S(L2(W2L || W1H));

}

其中S為32bit的S盒替換,S盒定義稍後介紹;L1和L2為32比特線性變換,定義如下:

線性變換函數

L1(X)=X⊕(X<<<2)⊕(X<<<10)⊕(X<<<18)⊕(X<<<24),

L2(X)=X⊕(X<<<8)⊕(X<<<14)⊕(X<<<22)⊕(X<<<30)。

S盒

32比特S盒S由4個小的8*8的S盒並置而成,即S=(S0,S1,S2,S3),其中S0=S2,S1=S3。S0和S1的定義分別見表A.1和表A.2。設S0(或S1)的8比特輸入為x。將x視作兩個16進位數的連接,即x=H || L,則表1(或表2)中第H行和第L行的交叉的元素即為S0(或S1)的輸出S0(x)(或S1(x))。

設S盒S的32比特輸入X和32比特輸出Y分別為:X=x0 || x1 || x2 || x3,Y=y0 || y1 || y2 || y3,其中xi和yi均為8比特位元組,i=0,1,2,3。則有yi=Si(xi),i=0,1,2,3。

四、演算法基本運算

1、密鑰載入

密鑰載入的過程將把初始密鑰和初始向量擴展為16個31比特的LFSR初始狀態。設K為128比特的初始密鑰,iv為128比特的初始向量,則有:

k=k0 || k1 ||……||k15iv=iv0 || iv1 ||……||iv15D為240比特的常量,可按如下方式分成16個15比特的字串:D= d0 || d1 ||……||d15其中(二進位):d0=100010011010111,

d1=010011010111100,

d2=110001001101011,d3=001001101011110,d4=101011110001001,d5=011010111100010,d6=111000100110101,d7=000100110101111,d8=100110101111000,d9=010111100010011,d10=110101111000101,

d11=001101011110001,

d12=101111000100110,d13=011110001001101,d14=111100010011010,d15=100011110101100.對0<=i<=15,有Si=Ki || di || IVi。

2、演算法運行

初始化階段

首先把128比特的初始密鑰K和初始向量iv按照密鑰裝入方法裝到LFSR的寄存器單元變數S0,S1,……S15中,作為LFSR 的初態,並置32比特記憶單元變數R1和R2為全0。然後執行下述操作:

重複下述過程32次:1) BitReconstryction();2) W=F(X0,X1,X2);

3) 輸出32比特字W;

4) LFSRWithInitialisationMode(W>>1);

工作階段

首先執行下列過程一次,並將F的輸出W捨棄:

1) BitReconstryction();2) F(X0,X1,X2);3) LFSRWithWorkMode()。然後進入密鑰輸出階段。在密鑰輸出階段,每運行一個節拍,執行下列過程一次,並輸出一個32比特的密鑰字Z:1) BitReconstryction();2) Z=F(X0,X1,X2)⊕X3;3) 輸出32比特密鑰字Z;4) LFSRWithWorkMode()。

3、附實例

五、小結

1、能讀到這兒,小弟佩服,再無他言,抱拳。

2、歡迎討論與指正。


推薦閱讀:
相關文章