浅析国家商用密码标准算法
浅析国家商用密码标准算法
中国商用密码概况
概况
国产商密算法是我国自主研发、具有自主知识产权的一系列密码算法,具有较高安全性,由国家密码局公开并大力推广。我国公开的国产商用密码算法包括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位数据(X0,X1,X2,X3)(X_0,X_1,X_2,X_3)(X0,X1,X2,X3),4个32位字;
输入32位字轮密钥rk,输出32位字,轮密钥由加密密钥通过密钥扩展算法生成;
轮函数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),如图所示
密钥扩展算法
使用常数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;
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;
输入加密秘钥MK,MK=(MK0,MK1,MK2,MK3)MK=(MK_0,MK_1,MK_2,MK_3)MK=(MK0,MK1,MK2,MK3);
中间数据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);
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)
输出轮密钥rki,i=0,1,…,30,31;
加解密算法
输入明文(X0,X1,X2,X3)(X_0,X_1,X_2,X_3)(X0,X1,X2,X3),共128位,4个字;
输入轮密钥rkirk_irki, i=0,1,…,31,共32个轮密钥;
算法结构为32轮轮函数迭代,每轮使用一个轮密钥;
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)
输出密文(Y0,Y1,Y2,Y3)(Y_0, Y_1, Y_2, Y_3)(Y0,Y1,Y2,Y3),128位,4个字;
解密算法与加密相同,只是轮函数密钥使用顺序相反;
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杂凑算法
概况
- hash函数也称报文摘要,将任意长的数据M变换为定长的码h,具有极强的错误检测能力,可以作为消息认证码,可以用于辅助数字签名和保密;
- SM3算法由国家密码管理局在2010年12月正式颁布,适用于商用密码中的数字签名和验证、消息认证码的生成与验证以及随机数的生成;
- 面向32比特字设计,输出的Hash长度为256比特;
- 基本框架:压缩函数+迭代结构
消息填充
SM3的消息扩展步骤是以512位的数据分组作为输入的。因此,我们需要在一开始就把数据长度填充至512位的倍数,数据填充规则和MD5一样。
- 假设消息m为长度为l的比特;
- 先填充一个“1”,后面加上k个“0”。其中k是满足(n+1+k) mod 512 = 448的最小正整数;
- 追加64位的比特串,是长度l的二进制表示,在内存中大端序存放;
- 填充后的消息为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。
消息扩展
置换函数为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)
将消息分组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
迭代压缩
初始值IV,用于确定压缩函数寄存器的处态,IV =7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e;
布尔函数为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
令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)
图示如下
令ABCEDFG=VnABCEDFG=V^{n}ABCEDFG=Vn,最后输出256位杂凑值y=ABCDEFG;
SM2椭圆曲线公钥算法
概况
SM2算法属于公开密钥密码,公钥密码的基本思想是,
- 将密钥K一分为二,KeK_eKeKdK_dKd,KeK_eKe专门加密,KdK_dKd专门解密,两者不相等;
- KeK_eKe不能计算出KdK_dKd,所以可以将KeK_eKe公开;
- 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§上的椭圆曲线,参数选取有如下几个要求,
- p越大越安全,但计算速度会变慢,160位可以满足;
- n为大素数(n>2160)(n>2^{160})(n>2160),对于固定有限域F§,n应当尽可能大;
- a3+27b2≠0(modp)a^3 + 27b^2 ≠0 (mod p)a3+27b2=0(modp);
- 保证P的阶n足够大,h≤4;
- 不能选取超奇异椭圆曲线和异常椭圆曲线等两类特殊曲线。
密钥生成
选取一条满足安全要求的椭圆曲线,通过随机数发生器产生用户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进行以下步骤,
- 用随机数发生器产生随机数k∈[1,n−1]k∈[1, n-1]k∈[1,n−1];
- 计算椭圆曲线点C1=[k]G=(x1,y1)C_1=[k]G=(x_1,y_1)C1=[k]G=(x1,y1);
- 计算椭圆曲线上的点S=[h]PBS=[h]P_BS=[h]PB,S不能为无穷远点O;
- 计算椭圆曲线点[k]PB=(x2,y2)[k]P_B=(x_2,y_2)[k]PB=(x2,y2);
- 计算,t=KDF(x2∣∣y2,len),t=KDF(x_2||y_2, len),t=KDF(x2∣∣y2,len)密钥派生函数结果不能全为0,否则需要重新选择随机数k重新计算;
- 计算C2=M⊕tC_2=M⊕tC2=M⊕t;
- 计算C3=Hash(x2∣∣M∣∣y2)C_3=Hash(x_2||M||y_2)C3=Hash(x2∣∣M∣∣y2),Hash是密码杂凑函数;
- 输出密文C=C1∣∣C2∣∣C3C=C_1||C_2||C_3C=C1∣∣C2∣∣C3;
解密算法
解密者B进行以下步骤,
- 从C中取出比特串C=C1C=C_1C=C1,验证是否满足椭圆曲线方程,若不满足这种解密错误;
- 计算椭圆曲线点S=[h]C1S=[h]C_1S=[h]C1,验证C1C_1C1是否为无穷远点,若为无穷远点则解密错误;
- 计算[dB]C1=(x2,y2)[d_B]C_1=(x_2,y_2)[dB]C1=(x2,y2);
- 计算t=KDF(x2∣∣y2,len)t=KDF(x_2||y_2, len)t=KDF(x2∣∣y2,len),验证t是否为全0比特串,若为全0则解密错误;
- 从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则解密错误;
- M’为解密后的明文;
总结与展望
国密算法经过了国家专业机构设计,算法简洁,难以破解,十分安全。但是算法只公开了SM2,SM3和SM4,而且公开时间较短,需要进行更多的实践,在实践应用进一步验证算法。
浅析国家商用密码标准算法相关推荐
- python商用_python实现sm2和sm4国密(国家商用密码)算法的示例
GMSSL模块介绍 GmSSL是一个开源的加密包的python实现,支持SM2/SM3/SM4等国密(国家商用密码)算法.项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用. 安 ...
- 国家商用密码(2)基于SM2的软件授权码生成及校验
将公开密钥算法作为软件注册算法的好处是Cracker很难通过跟踪验证算法得到注册机.下面,将介绍使用SM2国密算法进行软件注册的方法. 生成授权码 选择SM2椭圆曲线参数(P,a,b,N,Gx,Gy) ...
- 《商用密码应用与安全性评估》第三章商用密码标准与产品应用3.4商用密码标准与产品
一.智能IC卡标准与产品 智能IC卡的分类 存储器卡:内部一般不包含密码安全机制,不具备信息处理能力,外部可对片内信息任意存取,因此存储器卡一般用于存放不需要保密的信息 逻辑加密卡:逻辑加密卡内除了具 ...
- 国家商用密码算法介绍
密码算法主要分三类:对称算法.非对称算法.杂凑算法. SM1对称密码算法:一种分组密码算法,分组长度为128位,密钥长度为128比特. 主要产品有:智能IC卡.智能密码钥匙.加密卡.加密机等安全产品. ...
- 麒麟信安天机存储加密系统——国家密码管理局商用密码认证产品
随着<网络安全法>.<密码法> 和<数据安全法>等法律法规的颁布,信息安全受到空前重视而上升至国家战略层面."等保2.0" ."关键信 ...
- 安全密码c语言编程,商用密码算法原理与C语言实现
2020年1月1日,<中华人民共和国密码法>正式施行.国家鼓励和支持密码科学技术研究与应用,促进密码科学技术进步与创新,加强密码人才培养和队伍建设,采取多种形式加强密码安全教育.本书是在国 ...
- 密码学读书笔记系列(三):《商用密码应用与安全性评估》
密码学读书笔记系列(三):<商用密码应用与安全性评估> 思考/前言 第1章 密码基础知识 1.1 密码应用概述 1.2 密码应用安全性评估(密评)的基本原理 1.3 密码技术发展 1.4 ...
- 《商用密码-应用与安全性评估》学习1:密码基础知识
目录 第一章 密码基础知识 1.1 密码应用概述 1.1.1 密码的概念与作用 1.1.2 密码的概念与作用 1.1.3 密码应用中的安全性问题 1.2 密码应用安全性评估的基本原理 1.3 密码技术 ...
- 国产密码安全算法总结
为了保障商用密码安全,国家商用密码管理办公室制定了一系列密码标准,包括 SSF33.SM1(SCB2).SM2.SM3.SM4.SM7.SM9.祖冲之密码算法等等. 1.SM1算法.该算法是由国家密码 ...
最新文章
- java集合类讲解视频,关于java:实实在在面试List和Map集合面试合集含讲解视频
- python游戏最简单代码-用python写游戏脚本原来这么简单
- java 如何把源码导出为jar包,以及如何使用导出的jar包
- HDU 6833 A Very Easy Math Problem
- kotlin键值对数组_Kotlin程序检查数组是否包含给定值
- python购物车结算_python购物车-基础版本
- Winform窗体控件自适应大小
- tenorflow+python程序打包成.exe(收集方法1)
- STM32的两只狗儿——狗立看门狗
- matlab 常用函数或符号用法总结
- 【信号与系统|吴大正】4:信号分解、傅里叶变换与信号谱(下)
- Eclipse 官方简体中文语言包下载地址及安装方法
- iOS更新系统服务器出错,iPhone 更新失败怎么办?更新 iOS 常见的错误代码及解决方法...
- 关于浏览器无法访问宝塔控制面板解决方法
- python选取tensor某一维_超简单!pytorch入门教程(一):Tensor
- (连载)Android系统源码分析--Android系统启动流程之Linux内核
- python里面的pip是什么意思_python中的pip是什么意思
- Matlab 关闭提醒,开始使用MATLAB?[关闭]
- 百度云下载完成后baiduyun.downloading仍然存在,下载后源文件却一直没看到
- 关于Android状态栏反色(白底黑字)的适配小总结
热门文章
- 秘籍:打造自己的Flash游戏
- 通过定时器的Timer方式替代delay/Hal_delay函数进行定时
- 阿里云服务器ECS存储增强通用型g7se实例CPU性能参数详解
- Apple Pay出场带热NFC 国产手机厂商拥抱银联
- Win11如何删除升级包?Win11删除升级包的方法
- 易语言不能创建临时文件
- linux下升级g 版本,linux下升级gcc版本(gcc-7)
- 计算机快速启动BIOS,win10:你的系统快速启动如果变慢了,通过一下方法即可解决...
- Vue源码之mustache模板引擎(二) 手写实现mustache
- mysql数据库崩溃日志_我们崩溃并丢失了所有基本数据日志。 我们哪里错了?