浅析国家商用密码标准算法
中国商用密码概况
概况
国产商密算法是我国自主研发、具有自主知识产权的一系列密码算法,具有较高安全性,由国家密码局公开并大力推广。我国公开的国产商用密码算法包括SM1、SM2、SM3、SM4、SM7、SM9及祖冲之算法,其中SM2、SM3、SM4最为常用,用于对应替代RSA、DES、3DES、SHA等国际通用密码算法体系。
历史
我国在密码理论与分析上一直具有优势,但是长期依赖不公开密码算法,只提供密码芯片。密码芯片由少数专家设计,难于标准化,应用成本高,不利于推广应用。因此近年来陆续公布了商用密码算法,2006年公布了分组密码算法SM4,2011年公布了椭圆曲线密码算法SM2和杂凑算法SM3。商用密码的管理更加科学化,也和国际接轨。
原则
我国在商用密码的设计上,遵循了坚持密码的公开设计原则,也就是说,密码的安全应仅依赖于密钥的保密,不依赖与算法的保密。对于商用密码,美国DES开创了公开算法的先例。
SM4分组加密算法
概况
- 分组密码,数据分组(包括明文、密文)和密钥长度都为128位;
- 对合运算,加解密算法相同;
- 滑动窗口结构,明文与密钥在滑动窗口控制下,通过基本轮函数运算,然后进行迭代,生成密文。
运算方式与部件
-
基本运算方式
- 模2加,用符号⊕表示,意为32比特异或运算;
- 循环移位,符号<<<i,表示32位字循环左移i位;
-
基本密码部件
- 非线性字节变换部件S盒,进行8位的非线性置换,输入前半字节为行号,后半字节为列号,输出值参考S盒变换表行与列交叉点的值;
- 非线性字变换τ,进行32位字的非线性变换,方式是4个S盒并行置换;
- 线性L变换部件,32位输入,32位输出,设输入为B,输出为C,表示为C=L(B),运算规则为 C = L ( B ) = B ⊕ ( B < < < 2 ) ⊕ ( B < < < 10 ) ⊕ ( B < < < 18 ) ⊕ ( B < < < 24 ) C=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18)⊕(B<<<24) C=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18)⊕(B<<<24);
- 字合成变换T,由非线性字变换τ和线性L变换符合而成,T(X)=L(τ(X)),先进行S盒变换,后进行L变换;
轮函数F
-
输入128位数据 ( X 0 , X 1 , X 2 , X 3 ) (X_0,X_1,X_2,X_3) (X0,X1,X2,X3),4个32位字;
-
输入32位字轮密钥rk,输出32位字,轮密钥由加密密钥通过密钥扩展算法生成;
-
轮函数 F ( X 0 , X 1 , X 2 , X 3 , r k ) = X 0 ⊕ T ( X 1 ⊕ X 2 ⊕ X 3 ⊕ r k ) F(X_0,X_1,X_2,X_3,rk)=X_0⊕T(X_1⊕X_2⊕X_3⊕rk) F(X0,X1,X2,X3,rk)=X0⊕T(X1⊕X2⊕X3⊕rk),如图所示
密钥扩展算法
-
使用常数FK, F K 0 = A 3 B 1 B A C 6 , F K 1 = 56 A A 3350 , F K 2 = 677 D 9197 , F K 3 = B 27022 D C FK_0=A3B1BAC6, FK_1=56AA3350, FK_2=677D9197, FK_3=B27022DC FK0=A3B1BAC6,FK1=56AA3350,FK2=677D9197,FK3=B27022DC;
-
32个固定参数CK, C K i j = ( 4 i + j ) ∗ 7 ( m o d 256 ) , i = 0 , 1 , 2 , 3 , . . . 31 , j = 0 , 1 , 2 , 3 CK_{ij}=(4i+j)*7(mod 256),i=0,1,2,3,...31,j=0,1,2,3 CKij=(4i+j)∗7(mod256),i=0,1,2,3,...31,j=0,1,2,3;
-
输入加密秘钥MK, M K = ( M K 0 , M K 1 , M K 2 , M K 3 ) MK=(MK_0,MK_1,MK_2,MK_3) MK=(MK0,MK1,MK2,MK3);
-
中间数据Ki,i=0,1,…,34,35, ( K 0 , K 1 , K 2 , K 3 ) = ( M K 0 ⊕ F K 0 , M K 1 ⊕ F K 1 , M K 2 ⊕ F K 2 , M K 3 ⊕ F K 3 ) (K_0,K_1,K_2,K_3)=(MK_0⊕FK_0, MK_1⊕FK_1, MK_2⊕FK_2, MK_3⊕FK_3) (K0,K1,K2,K3)=(MK0⊕FK0,MK1⊕FK1,MK2⊕FK2,MK3⊕FK3);
-
For i=0,1,2…,31 Do
r k i = K i + 4 = K i ⊕ T ′ ( K i + 1 ⊕ K i + 2