浅析国家商用密码标准算法

中国商用密码概况

概况

国产商密算法是我国自主研发、具有自主知识产权的一系列密码算法,具有较高安全性,由国家密码局公开并大力推广。我国公开的国产商用密码算法包括SM1、SM2、SM3、SM4、SM7、SM9及祖冲之算法,其中SM2、SM3、SM4最为常用,用于对应替代RSA、DES、3DES、SHA等国际通用密码算法体系。

历史

我国在密码理论与分析上一直具有优势,但是长期依赖不公开密码算法,只提供密码芯片。密码芯片由少数专家设计,难于标准化,应用成本高,不利于推广应用。因此近年来陆续公布了商用密码算法,2006年公布了分组密码算法SM4,2011年公布了椭圆曲线密码算法SM2和杂凑算法SM3。商用密码的管理更加科学化,也和国际接轨。

原则

我国在商用密码的设计上,遵循了坚持密码的公开设计原则,也就是说,密码的安全应仅依赖于密钥的保密,不依赖与算法的保密。对于商用密码,美国DES开创了公开算法的先例。

SM4分组加密算法

概况

  1. 分组密码,数据分组(包括明文、密文)和密钥长度都为128位;
  2. 对合运算,加解密算法相同;
  3. 滑动窗口结构,明文与密钥在滑动窗口控制下,通过基本轮函数运算,然后进行迭代,生成密文。

运算方式与部件

  1. 基本运算方式

    • 模2加,用符号⊕表示,意为32比特异或运算;
    • 循环移位,符号<<<i,表示32位字循环左移i位;
  2. 基本密码部件

    • 非线性字节变换部件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

  1. 输入128位数据(X0,X1,X2,X3)(X_0,X_1,X_2,X_3)(X0​,X1​,X2​,X3​),4个32位字;

  2. 输入32位字轮密钥rk,输出32位字,轮密钥由加密密钥通过密钥扩展算法生成;

  3. 轮函数F(X0,X1,X2,X3,rk)=X0⊕T(X1⊕X2⊕X3⊕rk)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),如图所示

密钥扩展算法

  1. 使用常数FK,FK0=A3B1BAC6,FK1=56AA3350,FK2=677D9197,FK3=B27022DCFK_0=A3B1BAC6, FK_1=56AA3350, FK_2=677D9197, FK_3=B27022DCFK0​=A3B1BAC6,FK1​=56AA3350,FK2​=677D9197,FK3​=B27022DC;

  2. 32个固定参数CK, CKij=(4i+j)∗7(mod256),i=0,1,2,3,...31,j=0,1,2,3CK_{ij}=(4i+j)*7(mod 256),i=0,1,2,3,...31,j=0,1,2,3CKij​=(4i+j)∗7(mod256),i=0,1,2,3,...31,j=0,1,2,3;

  3. 输入加密秘钥MK,MK=(MK0,MK1,MK2,MK3)MK=(MK_0,MK_1,MK_2,MK_3)MK=(MK0​,MK1​,MK2​,MK3​);

  4. 中间数据Ki,i=0,1,…,34,35,(K0,K1,K2,K3)=(MK0⊕FK0,MK1⊕FK1,MK2⊕FK2,MK3⊕FK3)(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​);

  5. For i=0,1,2…,31 Do
    rki=Ki+4=Ki⊕T′(Ki+1⊕Ki+2⊕ki+3⊕CKi)rk_i = K_{i+4}=K_i⊕T'(K_{i+1}⊕K_{i+2}⊕k_{i+3}⊕CK_i)rki​=Ki+4​=Ki​⊕T′(Ki+1​⊕Ki+2​⊕ki+3​⊕CKi​)

    T’和轮函数中的T基本相同,将L变换修改为L‘,L’(B)=B⊕(B<<<13)⊕(B<<<23)

  6. 输出轮密钥rki,i=0,1,…,30,31;

加解密算法

  1. 输入明文(X0,X1,X2,X3)(X_0,X_1,X_2,X_3)(X0​,X1​,X2​,X3​),共128位,4个字;

  2. 输入轮密钥rkirk_irki​, i=0,1,…,31,共32个轮密钥;

  3. 算法结构为32轮轮函数迭代,每轮使用一个轮密钥;

  4. Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)X_{i+4}=F(X_i, X_{i+1}, X_{i+2}, X_{i+3}, rk_i)Xi+4​=F(Xi​,Xi+1​,Xi+2​,Xi+3​,rki​)

    ​ =Xi⊕T(Xi+1⊕Xi+2⊕Xi+3⊕rki),i=0,1,...,31=X_i⊕T(X_{i+1}⊕X_{i+2}⊕X_{i+3}⊕rk_i), i=0,1,...,31=Xi​⊕T(Xi+1​⊕Xi+2​⊕Xi+3​⊕rki​),i=0,1,...,31

    (Y0,Y1,Y2,Y3)=(X35,X34,X33,X32)(Y_0, Y_1, Y_2, Y_3)=(X_{35}, X_{34}, X_{33}, X_{32})(Y0​,Y1​,Y2​,Y3​)=(X35​,X34​,X33​,X32​)

  5. 输出密文(Y0,Y1,Y2,Y3)(Y_0, Y_1, Y_2, Y_3)(Y0​,Y1​,Y2​,Y3​),128位,4个字;

  1. 解密算法与加密相同,只是轮函数密钥使用顺序相反;

  2. Yi+4=F(Yi,Yi+1,Yi+2,Yi+3,rki)Y_{i+4}=F(Y_i, Y_{i+1}, Y_{i+2}, Y_{i+3}, rk_i)Yi+4​=F(Yi​,Yi+1​,Yi+2​,Yi+3​,rki​)

    ​ =Yi⊕T(Yi+1⊕Yi+2⊕Yi+3⊕rki),i=0,1,...,31=Y_i⊕T(Y_{i+1}⊕Y_{i+2}⊕Y_{i+3}⊕rk_i), i=0,1,...,31=Yi​⊕T(Yi+1​⊕Yi+2​⊕Yi+3​⊕rki​),i=0,1,...,31

    (X0,X1,X2,X3)=(Y35,Y34,Y33,Y32)(X_0, X_1, X_2, X_3)=(Y_{35}, Y_{34}, Y_{33}, Y_{32})(X0​,X1​,X2​,X3​)=(Y35​,Y34​,Y33​,Y32​)

SM3杂凑算法

概况

  1. hash函数也称报文摘要,将任意长的数据M变换为定长的码h,具有极强的错误检测能力,可以作为消息认证码,可以用于辅助数字签名和保密;
  2. SM3算法由国家密码管理局在2010年12月正式颁布,适用于商用密码中的数字签名和验证、消息认证码的生成与验证以及随机数的生成;
  3. 面向32比特字设计,输出的Hash长度为256比特;
  4. 基本框架:压缩函数+迭代结构

消息填充

SM3的消息扩展步骤是以512位的数据分组作为输入的。因此,我们需要在一开始就把数据长度填充至512位的倍数,数据填充规则和MD5一样。

  1. 假设消息m为长度为l的比特;
  2. 先填充一个“1”,后面加上k个“0”。其中k是满足(n+1+k) mod 512 = 448的最小正整数;
  3. 追加64位的比特串,是长度l的二进制表示,在内存中大端序存放;
  4. 填充后的消息为m’,m’的长度是512的倍数,m′=B(0)B(1)B(2)...B(n−1),B(i)m'=B^{(0)}B^{(1)}B^{(2)}...B^{(n-1)},B^{(i)}m′=B(0)B(1)B(2)...B(n−1),B(i)表示第i个消息分组,其中n=(l+k+65)/512。

消息扩展

  1. 置换函数为P,字为X

    • P0(X)=X⊕(X<<<9)⊕(X<<<17)P_0(X)=X⊕(X<<<9)⊕(X<<<17)P0​(X)=X⊕(X<<<9)⊕(X<<<17)
    • P1(X)=X⊕(X<<<15)⊕(X<<<23)P_1(X)=X⊕(X<<<15)⊕(X<<<23)P1​(X)=X⊕(X<<<15)⊕(X<<<23)
  2. 将消息分组BiB^{i}Bi扩展生成132个字W0,W1,...,W67,W0′,W1′,...,W63′W_0, W_1,...,W_{67}, W'_0, W'_1,...,W'_{63}W0​,W1​,...,W67​,W0′​,W1′​,...,W63′​,扩展方式为:

    FOR j=16 TO 67
    Wj←P1(Wj−16⊕Wj−9⊕(Wj−3≪15))⊕(Wj−13≪7)⊕Wj−6W_j ← P_1(W_{j−16} ⊕ W_{j−9} ⊕ (W_{j−3} ≪ 15)) ⊕ (W_{j−13} ≪ 7) ⊕ W_{j−6}Wj​←P1​(Wj−16​⊕Wj−9​⊕(Wj−3​≪15))⊕(Wj−13​≪7)⊕Wj−6​
    ENDFOR
    FOR j=0 TO 63
    W′j=Wj⊕Wj+4W′_j = W_j ⊕ W_{j+4}W′j​=Wj​⊕Wj+4​
    ENDFOR

迭代压缩

  1. 初始值IV,用于确定压缩函数寄存器的处态,IV =7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e;

  2. 布尔函数为FF, GG, 字为XYZ

    • FFj(X,Y,Z)={X⊕Y⊕Z,0≤j≤15(X∧Y)∨(X∧Z)∨(Y∧Z),16≤j≤63FF_j (X, Y, Z)= \begin{cases} X ⊕ Y ⊕ Z ,0 ≤ j ≤ 15\\ (X ∧ Y ) ∨ (X ∧ Z) ∨ (Y ∧ Z ) ,16 ≤ j ≤ 63\end{cases}FFj​(X,Y,Z)={X⊕Y⊕Z,0≤j≤15(X∧Y)∨(X∧Z)∨(Y∧Z),16≤j≤63​
    • GGj(X,Y,Z)={X⊕Y⊕Z,0≤j≤15(X∧Y)∨(¬X∧Z),16≤j≤63GG_j (X, Y, Z)= \begin{cases} X ⊕ Y ⊕ Z ,0 ≤ j ≤ 15\\ (X ∧ Y ) ∨ ( ¬X∧ Z) ,16 ≤ j ≤ 63\end{cases}GGj​(X,Y,Z)={X⊕Y⊕Z,0≤j≤15(X∧Y)∨(¬X∧Z),16≤j≤63​
  3. 令A,B,C,D,E,F,G,H为字寄存器,SS1,SS2,TT1,TT2为中间变量,压缩函数Vi+1=CF(V(i),B(i))V_{i+1} = CF(V^{(i)} , B^{(i)} )Vi+1​=CF(V(i),B(i)), 0 ≤ i ≤ n−1,压缩方式为:

    $ABCDEF GH ← V^{(i)} $

    FOR j=0 TO 63

    ​ SS1←((A≪12)+E+(Tj≪j))≪7SS1 ← ((A ≪ 12) + E + (T_j ≪ j)) ≪ 7SS1←((A≪12)+E+(Tj​≪j))≪7

    ​ SS2 ← SS1 ⊕ (A ≪ 12)

    ​ TT1←FFj(A,B,C)+D+SS2+W′jTT1 ← FF_j (A, B, C) + D + SS2 + W′_jTT1←FFj​(A,B,C)+D+SS2+W′j​

    ​ TT2←GGj(E,F,G)+H+SS1+WjTT2 ← GG_j (E, F, G) + H + SS1 + W_jTT2←GGj​(E,F,G)+H+SS1+Wj​

    ​ D ← C

    ​ C ← B ≪ 9

    ​ B ← A

    ​ A ← TT1

    ​ H ← G

    ​ G ← F ≪ 19

    ​ F ← E

    ​ E←P0(TT2)E ← P_0(TT2)E←P0​(TT2)

    ENDFOR

    V(i+1)←ABCDEFGH⊕V(i)V^{(i+1)} ← ABCDEFGH ⊕ V^{(i)}V(i+1)←ABCDEFGH⊕V(i)

    图示如下

  4. 令ABCEDFG=VnABCEDFG=V^{n}ABCEDFG=Vn,最后输出256位杂凑值y=ABCDEFG;

SM2椭圆曲线公钥算法

概况

SM2算法属于公开密钥密码,公钥密码的基本思想是,

  1. 将密钥K一分为二,KeK_eKe​KdK_dKd​,KeK_eKe​专门加密,KdK_dKd​专门解密,两者不相等;
  2. KeK_eKe​不能计算出KdK_dKd​,所以可以将KeK_eKe​公开;
  3. KdK_dKd​成为用户的指纹,可以实现数字签名;

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,在我们国家商用密码体系中被用来替换RSA算法。RSA基于特殊的可逆模幂运算实现,而SM2基于基本椭圆曲线(ECC)实现,相比于RSA密码复杂度高、处理速度快、机器性能消耗更小。

椭圆曲线

椭圆曲线简单的理解为描述了特定点的集合的公式,y2=x3+ax+by^2=x^3+ax+by2=x3+ax+b, a和b的取值变化决定了曲线在坐标系上的不同形状,椭圆曲线相对X轴是对称的;

令p是大于3的素数,且4a3+27b2≠0modp4a^3+27b^2≠0 mod p4a3+27b2​=0modp,称为有限域GF§上的椭圆曲线;

GF§上椭圆曲线密码的基础参数T=<p,a,b,G,n,h>,具体含义为

  • p是大于3的素数,确定了有限域GF§;
  • 元素a,b∈GF§, a和b确定了椭圆曲线y2=x3+ax+by^2=x^3+ax+by2=x3+ax+b;
  • G为循环子群E1E_1E1​的生成元点,n为素数且为生成元G的阶,G和n确定了循环子群E1E_1E1​;
  • h=|E|/n,并称为余因子,h将交换群E和循环子群E1E_1E1​联系起来;

椭圆曲线图示如下

SM2的曲线方程中,推荐使用256位素域GF§上的椭圆曲线,所有曲线参数都是定值。

SM2的曲线方程中,推荐使用256位素域GF§上的椭圆曲线,参数选取有如下几个要求,

  1. p越大越安全,但计算速度会变慢,160位可以满足;
  2. n为大素数(n>2160)(n>2^{160})(n>2160),对于固定有限域F§,n应当尽可能大;
  3. a3+27b2≠0(modp)a^3 + 27b^2 ≠0 (mod p)a3+27b2​=0(modp);
  4. 保证P的阶n足够大,h≤4;
  5. 不能选取超奇异椭圆曲线和异常椭圆曲线等两类特殊曲线。

密钥生成

选取一条满足安全要求的椭圆曲线,通过随机数发生器产生用户B的私钥dB∈[1,n−2]d_B∈[1, n-2]dB​∈[1,n−2],其中n为基点G的阶。其次通过以G 为基点,计算点PB=dB⋅GP_B = d_B·GPB​=dB​⋅G得到用户B的公钥。

密钥派生函数为KDF,通过输入比特串Z=x2∣∣y2Z=x_2||y_2Z=x2​∣∣y2​和整数len,得到一个长度为len的比特串,杂凑函数一般选用国密算法SM3。

加密算法

令要发送的消息为比特串M,len为M的比特长度,加密者A进行以下步骤,

  1. 用随机数发生器产生随机数k∈[1,n−1]k∈[1, n-1]k∈[1,n−1];
  2. 计算椭圆曲线点C1=[k]G=(x1,y1)C_1=[k]G=(x_1,y_1)C1​=[k]G=(x1​,y1​);
  3. 计算椭圆曲线上的点S=[h]PBS=[h]P_BS=[h]PB​,S不能为无穷远点O;
  4. 计算椭圆曲线点[k]PB=(x2,y2)[k]P_B=(x_2,y_2)[k]PB​=(x2​,y2​);
  5. 计算,t=KDF(x2∣∣y2,len),t=KDF(x_2||y_2, len),t=KDF(x2​∣∣y2​,len)密钥派生函数结果不能全为0,否则需要重新选择随机数k重新计算;
  6. 计算C2=M⊕tC_2=M⊕tC2​=M⊕t;
  7. 计算C3=Hash(x2∣∣M∣∣y2)C_3=Hash(x_2||M||y_2)C3​=Hash(x2​∣∣M∣∣y2​),Hash是密码杂凑函数;
  8. 输出密文C=C1∣∣C2∣∣C3C=C_1||C_2||C_3C=C1​∣∣C2​∣∣C3​;

解密算法

解密者B进行以下步骤,

  1. 从C中取出比特串C=C1C=C_1C=C1​,验证是否满足椭圆曲线方程,若不满足这种解密错误;
  2. 计算椭圆曲线点S=[h]C1S=[h]C_1S=[h]C1​,验证C1C_1C1​是否为无穷远点,若为无穷远点则解密错误;
  3. 计算[dB]C1=(x2,y2)[d_B]C_1=(x_2,y_2)[dB​]C1​=(x2​,y2​);
  4. 计算t=KDF(x2∣∣y2,len)t=KDF(x_2||y_2, len)t=KDF(x2​∣∣y2​,len),验证t是否为全0比特串,若为全0则解密错误;
  5. 从C中取出比特串C2C_2C2​,计算M′=C2M'=C_2M′=C2​⊕t;计算u=Hash(x2∣∣M′∣∣y2)u=Hash(x_2||M'||y_2)u=Hash(x2​∣∣M′∣∣y2​),从C中取出比特串C3C_3C3​,若uuu≠C_3则解密错误;
  6. M’为解密后的明文;

总结与展望

国密算法经过了国家专业机构设计,算法简洁,难以破解,十分安全。但是算法只公开了SM2,SM3和SM4,而且公开时间较短,需要进行更多的实践,在实践应用进一步验证算法。

浅析国家商用密码标准算法相关推荐

  1. python商用_python实现sm2和sm4国密(国家商用密码)算法的示例

    GMSSL模块介绍 GmSSL是一个开源的加密包的python实现,支持SM2/SM3/SM4等国密(国家商用密码)算法.项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用. 安 ...

  2. 国家商用密码(2)基于SM2的软件授权码生成及校验

    将公开密钥算法作为软件注册算法的好处是Cracker很难通过跟踪验证算法得到注册机.下面,将介绍使用SM2国密算法进行软件注册的方法. 生成授权码 选择SM2椭圆曲线参数(P,a,b,N,Gx,Gy) ...

  3. 《商用密码应用与安全性评估》第三章商用密码标准与产品应用3.4商用密码标准与产品

    一.智能IC卡标准与产品 智能IC卡的分类 存储器卡:内部一般不包含密码安全机制,不具备信息处理能力,外部可对片内信息任意存取,因此存储器卡一般用于存放不需要保密的信息 逻辑加密卡:逻辑加密卡内除了具 ...

  4. 国家商用密码算法介绍

    密码算法主要分三类:对称算法.非对称算法.杂凑算法. SM1对称密码算法:一种分组密码算法,分组长度为128位,密钥长度为128比特. 主要产品有:智能IC卡.智能密码钥匙.加密卡.加密机等安全产品. ...

  5. 麒麟信安天机存储加密系统——国家密码管理局商用密码认证产品

    随着<网络安全法>.<密码法> 和<数据安全法>等法律法规的颁布,信息安全受到空前重视而上升至国家战略层面."等保2.0" ."关键信 ...

  6. 安全密码c语言编程,商用密码算法原理与C语言实现

    2020年1月1日,<中华人民共和国密码法>正式施行.国家鼓励和支持密码科学技术研究与应用,促进密码科学技术进步与创新,加强密码人才培养和队伍建设,采取多种形式加强密码安全教育.本书是在国 ...

  7. 密码学读书笔记系列(三):《商用密码应用与安全性评估》

    密码学读书笔记系列(三):<商用密码应用与安全性评估> 思考/前言 第1章 密码基础知识 1.1 密码应用概述 1.2 密码应用安全性评估(密评)的基本原理 1.3 密码技术发展 1.4 ...

  8. 《商用密码-应用与安全性评估》学习1:密码基础知识

    目录 第一章 密码基础知识 1.1 密码应用概述 1.1.1 密码的概念与作用 1.1.2 密码的概念与作用 1.1.3 密码应用中的安全性问题 1.2 密码应用安全性评估的基本原理 1.3 密码技术 ...

  9. 国产密码安全算法总结

    为了保障商用密码安全,国家商用密码管理办公室制定了一系列密码标准,包括 SSF33.SM1(SCB2).SM2.SM3.SM4.SM7.SM9.祖冲之密码算法等等. 1.SM1算法.该算法是由国家密码 ...

最新文章

  1. java集合类讲解视频,关于java:实实在在面试List和Map集合面试合集含讲解视频
  2. python游戏最简单代码-用python写游戏脚本原来这么简单
  3. java 如何把源码导出为jar包,以及如何使用导出的jar包
  4. HDU 6833 A Very Easy Math Problem
  5. kotlin键值对数组_Kotlin程序检查数组是否包含给定值
  6. python购物车结算_python购物车-基础版本
  7. Winform窗体控件自适应大小
  8. tenorflow+python程序打包成.exe(收集方法1)
  9. STM32的两只狗儿——狗立看门狗
  10. matlab 常用函数或符号用法总结
  11. 【信号与系统|吴大正】4:信号分解、傅里叶变换与信号谱(下)
  12. Eclipse 官方简体中文语言包下载地址及安装方法
  13. iOS更新系统服务器出错,iPhone 更新失败怎么办?更新 iOS 常见的错误代码及解决方法...
  14. 关于浏览器无法访问宝塔控制面板解决方法
  15. python选取tensor某一维_超简单!pytorch入门教程(一):Tensor
  16. (连载)Android系统源码分析--Android系统启动流程之Linux内核
  17. python里面的pip是什么意思_python中的pip是什么意思
  18. Matlab 关闭提醒,开始使用MATLAB?[关闭]
  19. 百度云下载完成后baiduyun.downloading仍然存在,下载后源文件却一直没看到
  20. 关于Android状态栏反色(白底黑字)的适配小总结

热门文章

  1. 秘籍:打造自己的Flash游戏
  2. 通过定时器的Timer方式替代delay/Hal_delay函数进行定时
  3. 阿里云服务器ECS存储增强通用型g7se实例CPU性能参数详解
  4. Apple Pay出场带热NFC 国产手机厂商拥抱银联
  5. Win11如何删除升级包?Win11删除升级包的方法
  6. 易语言不能创建临时文件
  7. linux下升级g 版本,linux下升级gcc版本(gcc-7)
  8. 计算机快速启动BIOS,win10:你的系统快速启动如果变慢了,通过一下方法即可解决...
  9. Vue源码之mustache模板引擎(二) 手写实现mustache
  10. mysql数据库崩溃日志_我们崩溃并丢失了所有基本数据日志。 我们哪里错了?