詳解SM4|我國SM4密碼算法被納入國際標準
SM4算法被納入國際標準

2021年6月25日,我國SM4分組密碼算法作為國際標準ISO/IEC 18033-3:2010/AMD1:2021《信息技術 安全技術 加密算法 第3部分:分組密碼 補篇1:SM4》,由國際標準化組織ISO/IEC正式發布。
SM4作為ISO/IEC標準發布標志著我國商用密碼算法國際標準體系進一步完善,展現了我國先進的密碼科技水平和國際標準化能力,對提升我國商用密碼產業發展、推動商用密碼更好服務“一帶一路”建設具有重要意義。
我國密碼算法國際標準化進程
《密碼法》第二十三條第一款規定:國家推動參與商用密碼國際標準化活動,參與制定商用密碼國際標準,推進商用密碼中國標準與國外標準之間的轉化運用。
我國高度重視商用密碼國際標準化工作,大力推進以我國自主設計研制的SM系列密碼算法為代表的中國商用密碼標準納入國際標準,積極參與國際標準化活動,加強國際交流合作。
01
2011年9月,我國設計的祖沖之(ZUC)算法納入國際第三代合作伙伴計劃組織(3GPP)的4G移動通信標準,用于移動通信系統空中傳輸信道的信息加密和完整性保護,這是我國密碼算法首次成為國際標準。
2017年,SM2和SM9數字簽名算法正式成為ISO/IEC國際標準。
2018年,SM3算法正式成為ISO/IEC國際標準。
2020年4月,ZUC序列密碼算法正式成為ISO/IEC國際標準。
2021年2月,SM9標識加密算法正式成為ISO/IEC國際標準。
2021年6月,SM4分組密碼算法正式成為ISO/IEC國際標準。
02
我國商用密碼國際標準體系已初步成型,為密碼在全球范圍的發展與應用提供了中國方案,貢獻了中國智慧。
SM4加密算法詳解
1、SM4分組密碼算法概述
(1)SM4密碼算法是我國自主設計的分組對稱密碼算法,用于實現數據的加密/解密運算,以保證數據和信息的機密性。
(2)該算法的分組長度為128比特,密鑰長度為128比特。
(3)加密算法與密鑰擴展算法都采用32輪非線性迭代結構。
(4)SM4通過加密密鑰生成輪密鑰,通過輪密鑰進行加解密運算。
(5)數據解密和數據加密的算法結構相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。
2、SM4分組密碼算法優點
SM4 算法具有安全高效的特點,在設計和實現方面具有以下優勢:
① 在設計上實現了資源重用,密鑰擴展過程和加密過程類似。
② 加密過程與解密過程相同,只是輪密鑰使用順序正好相反,它不僅適用于軟件編程實現,更適合硬件芯片實現。
③ 輪變換使用的模塊包括異或運算、8比特輸入8比特輸出的S盒,還有一個32比特輸入的線性置換,非常適合 32 位處理器的實現。
通過對 SM4 密碼算法的安全性分析結果表明:SM4 算法的 S 盒設計具有較高的安全特性,線性置換的分支數達到了最優,可以抵抗差分分析、線性分析、代數攻擊等密碼分析方法。
在安全性上,SM4 算法的密鑰長度是 128 比特,其安全性與 AES-128 是相當的(AES還支持更高的安全強度)。在實現效率方面,由于SM4 密鑰擴展和加密算法基本相同,且解密時可以使用同樣的程序,只需將密鑰的順序倒置即可,因此 SM4 算法實現起來較為簡單;而AES算法的加密算法與解密算法不一致,實現起來更復雜一些。
3、SM4預備知識
3.1 SM4術語解釋
1:字與字節:字節是內存的基本單位,一個字節由8個比特組成,一個字等于4個字節,由32個比特組成。
2:⊕:32比特異或運算
3:<<<i:循環左移i比特運算
4:s盒:固定的8比特輸入8比特輸出置換,記為Sbox(.)。

輸入“EF”,則經S盒后的值為表中第E行和第F列的值,Sbox(EF)=84
3.2輪函數F
采用非線性迭代結構,以字為單位進行加密運算,稱一次迭代運算為一輪變換。輪函數F為:

3.3合成置換T
T:從一個字轉換為另一個字,是一個可逆變換,由非線性變換τ和線性變換L復合而成,即T(.)=L(τ(.))。
(1)非線性變換τ:τ由4個并行的S盒構成。設輸入為A=(a0,a1,a2,a3),其中a0,a1,a2,a3均為字節類型,輸出為B=(b0,b1,b2,b3),其中b0,b1,b2,b3均為字節類型,則:

非線性就是離散的,無規律的,沒有公式可以描述的。
(2)線性變換L:非線性變換τ的輸出是線性變換L的輸入。設輸入為B,B是一個字,輸出為C,C是一個字,則:

4、加解密算法
定義反序變換R為:R(A0,A1,A2,A3)=(A3,A2,A1,A0)。所有A均為字,即:unsigned int。
設明文輸入為(X0,X1,X2,X3),所有Xi均屬于字,整體為一個具有4個元素的字數組,密文輸出為(Y0,Y1,Y2,Y3),所有Yi均屬于字,整體為一個具有4個元素的字數組,輪密鑰為rk0,rk1,rk2...rk31,所有rki均屬于字,整體為一個具有32個元素的字數組。
則本算法的加密變換為:

i的取值0,1,2...31

算法的解密變換與加密變換結構相同,不同的僅是輪密鑰的使用順序。
加密時輪密鑰的使用順序為:(rk0,rk1,..., rk31);
解密時輪密鑰的使用順序為:(rk31,rk30,..., rk0)
5、密鑰擴展算法
本算法中加密算法的輪密鑰由加密密鑰通過密鑰擴展算法生成。
加密密鑰MK=(MK0,MK1,MK2,MK3),MKi均屬于32比特的字,i=0,1,2,3;
令Ki屬于32比特的字,i=0,1,…, 35,輪密鑰為rki屬于32比特的字,i=0,1,2...31。則輪密鑰生成方法為:
首先,

然后對i=0,1,2,...,31:

(1)T’變換與加密算法輪函數中的T基本相同,只將其中的線性變換L修改為以下L’:

(2)系統參數FK的取值,采用16進制表示為:FK0=(A3B1BAC6), FK1=(56AA3350), FK2=(677D9197), FK3=(B27022DC)
(3)固定參數CK的取值方法為:設ck(i,j)為CKi的第j字節(i=0,1,...,31; j=0,1,2,3),即Cki=(ck(i,0), ck(i,1), ck(i,2), ck(i,3)),四個元素均為字節。則ck(i,j)=(4i+j)x7 (mod 256)。32個固定參數CKi詳見GB/T 32907-2016《信息安全技術 SM4分組密碼算法》。