謝宗曉 董坤祥 甄杰



1 對稱密碼算法
對稱密碼(symmetric cryptography)也稱為共享密鑰密碼,是指用相同的密鑰進行加密解密,其中的“對稱”指的是加密密鑰和解密密鑰是相同的,或者用簡單的運算就可以推導兩個密鑰。對稱密碼算法在邏輯上非常容易理解,因此出現的比較早,有時候也叫傳統密碼算法,以區別于公鑰密碼算法。
對稱密碼算法有兩種主要形式:序列密碼(stream cipher)和分組密碼(block cipher)。已經發布國產商用密碼算法中屬于對稱密碼算法的有ZUC(祖沖之密碼算法)和SM4。其中,ZUC屬于序列密碼,與之類似的國外密碼算法如RC41)。SM4屬于分組密碼,與之類似的國外密碼算法如DES(Data Encryption Standard,數據加密標準)、TDEA/3DES(Triple Data Encryption Algorithm/3DES、三重數據加密標準)以及AES(Advanced Encryption Standard,高級加密標準)等。
2 對稱密碼算法標準
為了配合WAPI2)無線局域網標準的推廣應用,國家密碼管理局在2006年公布了SMS43)算法。2012年,該算法更名為SM4,成為行業標準。2016年上升為國家標準。SM4對應的國家/行業標準,如表1所示。
ZUC可以保護數據的機密性和完整性等,具體見GM/T 0001.2—2012和GM/T 0001.3—2012。值得特別指出的是,2020年4月,ZUC已經成為國際標準ISO/IEC 18033-4:2011/Amd 1:2020 Information technology—Security techniques—Encryption algorithms—Part 4: Stream ciphers—Amendment 1: ZUC《信息技術 安全技術 加密算法 第4部分:序列算法 補篇1:ZUC》。
ZUC對應的國家/行業標準,如表2所示。
3 祖沖之序列密碼算法
序列密碼,也稱為“流密碼”,序列密碼算法將明文消息逐位轉換成密文。序列密碼中由于按位異或的計算特性,可知式(1)和式(2)。
Ci = Pi⊕Ki? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(1)
Pi? = Ci⊕Ki? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)
因此,其加密解密大致過程如圖1所示。
密鑰序列的安全性對上述體系安全性的重要度不言而喻,如果密鑰是真隨機序列,那么輸出的密文也是真隨機序列,這樣解釋了為什么“一次一密”是完美安全的。圖1中是最簡單的序列密碼工作模式,在實踐中的設計一般要復雜得多。在ZUC中,密鑰產生首先要輸入一個128位的初始密鑰和一個128位的初始向量。
ZUC是運用于4G網絡中的標準密碼算法,包括祖沖之密碼算法,機密性算法和完整性算法,分別對應表2中的GB/T 33133.1—2016、GM/T 0001.2—2012和GM/T 0001.3—2012。
4 SM4分組密碼算法
4.1 分組及工作模式
分組密碼,也稱為“塊密碼”。分組指的是將明文劃分成固定長度的“塊”,然后進行加密,因為所謂的分組密碼算法實際只能加密這個固定長度的“塊”。這其中就涉及一個問題,絕大部分的明文長度都會超過這個“塊”的長度,這也是明文為什么要分組的原因。
分組之后的明文,需要鏈接,需要反復的迭代輸入。一般情況下,將分組數據塊鏈接的組合模式或其迭代的方法,稱為“分組密碼算法工作模式4)”。
在GB/T 17964—2008《信息安全技術 分組密碼算法的工作模式》中,定義了常見的工作模式:電碼本(ECB,Electronic Code Book)模式、密碼分組鏈接(CBC,Cipher Block Chaining)模式、密碼反饋(CFB,Cipher Feedback)模式、輸出反饋(OFB,Output Feedback)模式、計數器(CTR,Counter)模式、分組鏈接模式(BC,Block Chaining)和帶非線性函數的輸出反饋(OFNLF,Output Feedback with a Nonlinear Function)模式。
最簡單也最直觀的方式是ECB模式,即明文分組,然后順序加密,得到相應的密文分組。這其中存在一個很大的漏洞,密文分組之間沒有相互聯系,這導致了攻擊者可以改變密文的順序,或者刪除、復制密文分組,從而達到操縱明文的目的,所以ECB模式目前一般不會再被用于實踐。
4.2 基本工作原理
分組密碼算法一般會根據上述工作模式首先對明文消息進行分組,然后將明文分組和密鑰作為輸入(有時候會有初始向量),也就是說,分組密碼是對明文分組和密鑰分組的運算。其基本過程如圖2所示。
具體到SM4分組密碼算法,SM4的分組長度為128比特,密鑰長度也是128比特,加密算法與密鑰擴展算法均采用32輪非平衡Feistel結構。非平衡Feistel結構也被稱為Feistel網絡或Feistel密碼(cipher),以德國密碼學家Horst Feistel命名,專門用于構造分組密碼的對稱結構。由于是對稱結構,Feistel結構中加密和解密算法結構完全一致,因此在實現過程中,所需要的代碼或者電路都可以減半。由于采用Feistel結構,SM4解密與加密的算法結構相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。
注意區別兩個詞匯“擴展”和“填充”。填充(padding)指的是當明文分組小于分組長度的時候,需要一些數據填充至128比特。這種情況在SM3中也存在,在SM3中,經過填充后的消息長度是512比特。擴展(expansion)是指密鑰擴展,例如,在SM4中,密鑰擴展是通過算法實現的,128比特的密鑰表示為:
MK = (MK0, MK1, MK2, MK3) MKi (i=0,1,2,3) 為字。
在GB/T 32907—2016的定義2.6中,“字”是長度為32比特的組(串)。密鑰長度,32×4。密鑰擴展算法要迭代32輪,每輪產生一個輪密鑰,輪密鑰通過加密密鑰生成。由于輪密鑰是32輪,所以rKi (i=0,1,2,…,31)共32個。如果用(X0, X1, X2, X3)表示明文,加密過程表示為:
Xi+4 = Xi⊕T'(Xi+1⊕Xi+2⊕rKi)? i=0,1,2, …31
T'是指合成置換過程。
SM4除了32次迭代運算,最后還需要一次反序變換,用(Y0, Y1, Y2, Y3)表示密文:
(Y0, Y1, Y2, Y3) = R(X32, X33, X34, X35) = (X35, X34, X33, X32)
R為反序變換函數。
特別詳細的過程,本文中不再贅述,通過ZUC和SM4基本原理的分析可以看出,無論是序列密碼算法還是分組密碼算法,對于對稱密碼算法而言,計算不一定很復雜,但過程設計非常重要。這與公鑰密碼算法不同,公鑰密碼算法大多都建立在某類數學難題基礎之上,本質是計算復雜的問題。基于此,對稱密碼算法中由初始向量IV引入的隨機性非常重要,每次加密的初始向量都需要重新生成。
5 小結
如上文所述,ZUC和SM4最初都是應用于通信領域,其中,ZUC是4G移動通信的國際標準,SM4最早是應用于WAPI的無線局域網加密標準。ZUC能夠有效地抵抗目前已知的攻擊方法,具有較高的安全性,并且效率比較高。SM4安全性與AES-128相當,但是實現效率比AES要好,因為SM4和DES等采用的都是對稱的Feistel結構,AES加密和解密算法不一致,實現起來就更復雜一些,效率也更低一些。
(注:本文僅做學術探討,與作者所在單位觀點無關)
參考文獻
[1] Merkle R C. One Way Hash Functions and DES [C]. In: Brassard G. (eds) Advances in Cryptology — CRYPTO 89 Proceedings. CRYPTO 1989.
[2] Damgard I B. A Design Principle for Hash Functions[C]. In: Brassard G. (eds) Advances in Cryptology — CRYPTO 89 Proceedings. CRYPTO 1989.
[3] 霍煒,郭啟全,馬原.商用密碼應用與安全性評估[M]. 北京:中國工信出版社/電子工業出版社,2020.
[4] Tiwari, Harshvardhan. Merkle—Damgard Construction Method and Alternatives: A Review [J]. Journal of Information and Organizational Sciences. 2017 (41): 283-304.
[5] Bruce Schneier. 應用密碼學:協議、算法與C源程序[M]. 北京:機械工業出版社,2013.