中国商用密码算法SM4

article/2025/9/25 2:34:31

中国商用密码算法SM4

2006年我国国家密码管理局公布了无线局域网产品使用的SM4密码算法。这是我国第一次公布自己的商用密码算法,意义重大,影响深远。这一举措标志着我国商用密码管理更加科学化和国际接轨。

SM4密码算法设计简洁,算法结构有特点,安全高效。它的公开颁布向世界展示了我国在商用密码方面的研究成果。

1. SM4算法描述

SM4算法是一个分组算法。数据分组长度为128比特,密钥长度为128比特。加密算法与密钥扩展都采用32轮迭代结构。SM4以字节(8比特)和字(32比特)位单位进行数据处理。它是对合算法,因此加解密算法相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

1.1 基本运算

SM4算法使用模2加循环移位作为基本运算。

1.2 基本密码部件

SM4密码算法使用了以下基本密码部件

  1. S盒

    SM4的S盒是一种以字节为单位的非线性代替变换,其密码学的作用是起混淆作用。S盒的输入和输出都是8位的字节。它的本质上是8位的非线性置换。例如S盒输入为EF,则取第E行第F列交点处的值进行替换。

    S盒

  2. 非线性变换 τ \tau τ

    SM4的非线性变换 τ \tau τ 是一种以字为单位的非线性变换。它由4个S盒并置构成。这里的非线性变换就和之前zuc的S盒变换原理相同,一个字有4个字节,每个字节都使用S盒进行变化,再将结果进行首尾连接。不同的是ZUC使用的是两个S盒,这里只有一个S盒。

  3. 线性变换 L L L

    线性变换 L L L是以字为处理单位的线性变换部件,其输入输出都是32位的字。其密码学的作用是起扩散作用。

    L L L的输入为字B,输出为字C,则:
    C = L ( B ) = B ⨁ ( B < < < 2 ) ⨁ ( B < < < 10 ) ⨁ ( B < < < 18 ) ⨁ ( B < < < 24 ) C=L(B)=B\bigoplus(B<<<2)\bigoplus(B<<<10)\bigoplus(B<<<18)\bigoplus(B<<<24) C=L(B)=B(B<<<2)(B<<<10)(B<<<18)(B<<<24)

  4. 合成变换 T T T

    合成变换是由非线性变换 τ \tau τ 和线性变换L复合而成。
    T ( X ) = L ( τ ( X ) ) T(X)=L(\tau(X)) T(X)=L(τ(X))
    合成变换 T T T起到混淆和扩散作用,提高密码安全性。

1.3 轮函数

SM4密码算法的轮函数是一种以字为处理单位的密码函数。

设轮函数 F F F的输入为 ( X 0 , X 1 , X 2 , X 3 ) (X_0,X_1,X_2,X_3) (X0,X1,X2,X3),四个32位字,共128位。轮密钥为 r k rk rk r k rk rk也是一个32位的字。其输出也是32位的字。
F ( X 0 , X 1 , X 2 , X 3 ) = X 0 ⨁ T ( X 1 ⨁ X 2 ⨁ X 3 ⨁ r k ) F(X_0,X_1,X_2,X_3) = X_0\bigoplus T(X_1\bigoplus X_2\bigoplus X_3\bigoplus rk) F(X0,X1,X2,X3)=X0T(X1X2X3rk)
轮函数

1.4 密钥扩展算法

SM4密码使用128位的加密密钥,并采用32轮迭代加密结构,每一轮加密使用一个32位的轮密钥,共使用32个轮密钥。因此需要使用密钥扩展算法。

  1. 系统参数FK

    在密钥扩展中使用如下的参数:

    FK0=(A3B1BAC6),FK1=(56AA3350),FK2=(677D9197),FK3=(B27022DC),

  2. 固定参数CK

    共使用32个固定参数CKi,CKi是一个字,其产生规则如下:

    设cki,j 为CKi的第j字节( i = 0,1,…,31; j=0,1,2,3 ),即CKi = ( cki,0 , cki,1 , cki,2 , cki,3 ),则
    c k i , j = ( 4 i + j ) × 7 ( m o d 256 ) ck_{i,j}=(4i+j)\times 7(mod 256) cki,j=(4i+j)×7(mod256)
    这32个固定参数如下(16进制):

    00070e151c232a31383f464d545b6269
    70777e858c939aa1a8afb6bd545b6269
    e0e7eef5fc030a11181f262d343b4249
    50575e656c737a81888f969da4abb2b9
    c0c7ced5dce3eaf1f8ff060d141b2229
    30373e454c535a61686f767d848b9299
    a0a7aeb5bcc3cad1d8dfe6edf4fb0209
    10171e252c333a41484f565d646b7279
  3. 密钥扩展算法

    设输入加密密钥为MK = ( MK0,MK1,MK2,MK3),输出轮密钥为 r k i rk_i rki i = 0 , 1 , . . . , 31 i=0,1,...,31 i=0,1,...,31,中间数据为 K i K_i Ki i = 0 , 1 , . . . , 34 , 35 i=0,1,...,34,35 i=0,1,...,34,35。则密钥扩展算法为:

    1. ( 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\bigoplus FK_0,MK_1\bigoplus FK_1,MK_2\bigoplus FK_2,MK_3\bigoplus FK_3) (K0,K1,K2,K3)=(MK0FK0,MK1FK1,MK2FK2,MK3FK3)

    2. f o r ( i = 0 ; i < 32 ; i + + ) for(i=0;i<32;i++) for(i=0;i<32;i++)

      r k i = K i + 4 = K i ⨁ T ′ ( K i + 1 ⨁ K i + 2 ⨁ K i + 3 ⨁ C K i ) rk_i=K_{i+4}=K_i\bigoplus T^{'}(K_{i+1}\bigoplus K_{i+2}\bigoplus K_{i+3}\bigoplus CK_i) rki=Ki+4=KiT(Ki+1Ki+2Ki+3CKi)

      其中 T ′ T^{'} T的变换与加密函数中的 T T T基本相同,只是将其中的线性变换 L L L修改为 L ′ L^{'} L
      L ′ ( B ) = B ⨁ ( B < < < 13 ) ⨁ ( B < < < 23 ) L^{'}(B)=B\bigoplus (B<<<13)\bigoplus (B<<<23) L(B)=B(B<<<13)(B<<<23)
      分析密钥扩展算法可以发现,在算法结构方面密钥扩展算法与加密算法类似,也是采用了32轮类似的迭代处理。

    特别应当注意的是在密钥扩展算法中采用了非线性变化 τ \tau τ ,这将大大加强密钥扩展的安全性。

2. SM4加密过程

SM4密码算法是一个分组算法。数据分组长度为128比特,密钥长度为128比特。加密算法采用32轮迭代结构,每轮使用一个轮密钥。

设输入的明文为 ( X 0 , X 1 , X 2 , X 3 ) (X_0,X_1,X_2,X_3) (X0,X1,X2,X3),输入轮密钥为 r k i rk_i rki i = 0 , 1 , . . , 31 i=0,1,..,31 i=0,1,..,31,共32个字。输出的密文为 ( Y 0 , Y 1 , Y 2 , Y 3 ) (Y_0,Y_1,Y_2,Y_3) (Y0,Y1,Y2,Y3)

加密算法为:
X i + 4 = F ( X i , X i + 1 , X i + 2 , X i + 3 , r k i ) = X i ⨁ T ( X i + 1 ⨁ X i + 2 ⨁ X i + 3 ⨁ r k i ) X_{i+4}=F(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i)=X_i\bigoplus T(X_{i+1}\bigoplus X_{i+2}\bigoplus X_{i+3}\bigoplus rk_i) Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)=XiT(Xi+1Xi+2Xi+3rki)
为了与解密算法需要的顺序一致,在加密算法之后还需要一个反序处理 R R R
R ( Y 0 , Y 1 , Y 2 , Y 3 ) = ( X 35 , X 34 , X 33 , X 32 ) R(Y_0,Y_1,Y_2,Y_3)=(X_{35},X_{34},X_{33},X_{32}) R(Y0,Y1,Y2,Y3)=(X35,X34,X33,X32)
加密算法流程如下:
SM4加密

从图中可以看出,SM4一次加密处理4个字,产生一个字的中间密文,这个中间密文,这个中间密文与前三个字拼接在一起供下一次加处理,共迭代32轮,最终产生出四个字的密文。

加密过程也可如下所示:

加密过程

3. SM4解密过程

SM4密码算法是对合运算,因此加解密算法相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

设输入密文为 ( Y 0 , Y 1 , Y 2 , Y 3 ) (Y_0,Y_1,Y_2,Y_3) (Y0,Y1,Y2,Y3),输入轮密钥为 r k i rk_i rki i = 31 , 30 , . . . , 1 , 0 i=31,30,...,1,0 i=31,30,...,1,0,输出明文为 ( M 0 , M 1 , M 2 , M 3 ) (M_0,M_1,M_2,M_3) (M0,M1,M2,M3)。由 ( Y 0 , Y 1 , Y 2 , Y 3 ) = ( X 35 , X 34 , X 33 , X 32 ) (Y_0,Y_1,Y_2,Y_3)=(X_{35},X_{34},X_{33},X_{32}) (Y0,Y1,Y2,Y3)=(X35,X34,X33,X32),得解密算法为:
X i = F ( X i + 4 , X i + 3 , X i + 2 , X i + 1 , r k i ) = X i + 4 ⨁ T ( X i + 3 ⨁ X i + 2 ⨁ X i + 1 ⨁ r k i ) X_i=F(X_{i+4},X_{i+3},X_{i+2},X_{i+1},rk_i)=X_{i+4}\bigoplus T(X_{i+3}\bigoplus X_{i+2}\bigoplus X_{i+1}\bigoplus rk_i) Xi=F(Xi+4,Xi+3,Xi+2,Xi+1,rki)=Xi+4T(Xi+3Xi+2Xi+1rki)

i = 31 , 30 , . . , 1 , 0 i=31,30,..,1,0 i=31,30,..,1,0

与加密算法之后需要一个反序处理同样的道理,在解密算法之后也需要有一个反序处理 R R R:
R ( M 0 . M 1 , M 2 , M 3 ) = ( X 3 , X 2 , X 1 , X 0 ) R(M_0.M_1,M_2,M_3)=(X_3,X_2,X_1,X_0) R(M0.M1,M2,M3)=(X3,X2,X1,X0)
解密过程可如下所示:

在这里插入图片描述

4. SM4的对合性和可逆性

可逆性是对称密码算法的基本要求,对合性能够使密码算法实现的工作量减半。

4.1 SM4对合性

先分析SM4的加密轮函数,如图所示,它由两个运算组成:

轮函数

加密函数G的运算可以写成:
G = G i ( X i , X i + 1 , X i + 2 , X i + 3 , r k i ) = ( X i ⨁ T ( X i + 1 , X i + 2 , X i + 3 , r k i ) , X i + 1 , X i + 2 , X i + 3 ) G=G_i(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i)\\ \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad =(X_i\bigoplus T(X_{i+1}, X_{i+2}, X_{i+3}, rk_i),X_{i+1}, X_{i+2}, X_{i+3}) G=Gi(Xi,Xi+1,Xi+2,Xi+3,rki)=(XiT(Xi+1,Xi+2,Xi+3,rki),Xi+1,Xi+2,Xi+3)

( G i ) 2 = G i ( X i ⨁ T ( X i + 1 , X i + 2 , X i + 3 , r k i ) , X i + 1 , X i + 2 , X i + 3 , r k i ) = ( X i ⨁ T ( X i + 1 , X i + 2 , X i + 3 , r k i ) ⨁ T ( X i + 1 , X i + 2 , X i + 3 , r k i ) , X i + 1 , X i + 2 , X i + 3 , r k i ) = ( X i , X i + 1 , X i + 2 , X i + 3 , r k i ) = I (G_i)^2=G_i(X_i\bigoplus T(X_{i+1}, X_{i+2}, X_{i+3}, rk_i), X_{i+1}, X_{i+2}, X_{i+3},rk_i)\\ \quad \quad =(X_i\bigoplus T(X_{i+1}, X_{i+2}, X_{i+3}, rk_i)\bigoplus T(X_{i+1}, X_{i+2}, X_{i+3},rk_i),X_{i+1}, X_{i+2}, X_{i+3},rk_i)\\ \quad \quad=(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i)\\ \quad \quad =I (Gi)2=Gi(XiT(Xi+1,Xi+2,Xi+3,rki),Xi+1,Xi+2,Xi+3,rki)=(XiT(Xi+1,Xi+2,Xi+3,rki)T(Xi+1,Xi+2,Xi+3,rki),Xi+1,Xi+2,Xi+3,rki)=(Xi,Xi+1,Xi+2,Xi+3,rki)=I

I I I是恒等变换,可以看出加密函数Gi是对合运算。

数据交换E的运算可以写成:
E = ( X i + 4 , ( X i + 1 , X i + 2 , X i + 3 ) ) = ( ( X i + 1 , X i + 2 , X i + 3 ) , X i + 4 ) E=(X_{i+4},(X_{i+1},X_{i+2},X_{i+3}))=((X_{i+1},X_{i+2},X_{i+3}),X_{i+4}) E=(Xi+4,(Xi+1,Xi+2,Xi+3))=((Xi+1,Xi+2,Xi+3),Xi+4)
显然 E = E − 1 E=E^{-1} E=E1,即 E E E是对合运算。

因此,加密轮函数可以写成:
F i = F i ( X i , X i + 1 , X i + 2 , X i + 3 , r k i ) = G i E F_i=F_i(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i)=G_iE Fi=Fi(Xi,Xi+1,Xi+2,Xi+3,rki)=GiE
则加密的过程可以写成:
S M 4 = G 0 E G 1 E . . . G 30 E G 31 R SM4=G_0EG_1E...G_{30}EG_{31}R SM4=G0EG1E...G30EG31R
解密过程可以写成:
S M 4 − 1 = G 31 E G 30 E . . . G 1 E G 0 R SM4^{-1}=G_{31}EG_{30}E...G_1EG_0R SM41=G31EG30E...G1EG0R
比较加解密式子可以发现二者是相同的,只是密钥的使用顺序相反。这就说明SM4算法是对合运算。

4.2 SM4可逆性

加密过程可以写为:

( X 0 , X 1 , X 2 , X 3 ) (X_0,X_1,X_2,X_3) (X0,X1,X2,X3)–> ( X 1 , X 2 , X 3 , X 4 ) (X_1,X_2,X_3,X_4) (X1,X2,X3,X4)–> ( X 2 , X 3 , X 4 , X 5 ) (X_2,X_3,X_4,X_5) (X2,X3,X4,X5)–>…–> ( X 32 , X 33 , X 34 , X 35 ) (X_{32},X_{33},X_{34},X_{35}) (X32,X33,X34,X35)–> ( X 35 , X 34 , X 33 , X 32 ) (X_{35},X_{34},X_{33},X_{32}) (X35,X34,X33,X32)= ( Y 0 , Y 1 , Y 2 , Y 3 ) (Y_0,Y_1,Y_2,Y_3) (Y0,Y1,Y2,Y3)

其中最后一步为反序。

同理,解密过程可以写为:

( X 35 , X 34 , X 33 , X 32 ) (X_{35},X_{34},X_{33},X_{32}) (X35,X34,X33,X32)–> ( X 34 , X 33 , X 32 , X 31 ) (X_{34},X_{33},X_{32},X_{31}) (X34,X33,X32,X31)–> ( X 33 , X 32 , X 31 , X 30 ) (X_{33},X_{32},X_{31},X_{30}) (X33,X32,X31,X30)–>…–> ( X 3 , X 2 , X 1 , X 0 ) (X_3,X_2,X_1,X_0) (X3,X2,X1,X0)–> ( X 0 , X 1 , X 2 , X 3 ) (X_0,X_1,X_2,X_3) (X0,X1,X2,X3)

其中最后一步为反序。

由此可以得出:
S M 4 − 1 ( S M 4 ( X 0 , X 1 , X 2 , X 3 ) ) = ( X 0 , X 1 , X 2 , X 3 ) SM4^{-1}(SM4(X_0,X_1,X_2,X_3))=(X_0,X_1,X_2,X_3) SM41(SM4(X0,X1,X2,X3))=(X0,X1,X2,X3)
因此SM4是可逆的。


http://chatgpt.dhexx.cn/article/lRvmc7h4.shtml

相关文章

区块链的密码算法

区块链系统包含了计算机科学过去几十年的成果&#xff1a;计算机网络P2P、算法、数据库、分布式系统、计算机密码学等 密码学是区块链系统安全性保障的基础技术&#xff0c;形象地称为区块链的骨骼 哈希算法 ■哈希算法(Hash、 散列、杂凑&#xff0c; 消息摘要&#xff0c;…

8、RSA 公钥密码算法

目录 RSA公钥密码算法 一、RSA的数学基础 二、RSA原理 三、算法详细流程 四、RSA特点 五、RSA应用 参考推荐&#xff1a; https://blog.csdn.net/lemon_tree12138/article/details/50696926 RSA加密算法原理_张维鹏的博客-CSDN博客_rsa加密算法原理 图解RSA算法取余和…

常用的密码算法有哪些?

我们将密码算法分为两大类。 对称密码&#xff08;密钥密码&#xff09;——算法只有一个密钥。如果多个参与者都知道该密钥&#xff0c;该密钥 也称为共享密钥。非对称密码&#xff08;公钥密码&#xff09;——参与者对密钥的可见性是非对称的。例如&#xff0c;一些参与者仅…

分组密码算法与DES算法

目录 1 分组密码的含义 1.1 分组密码介绍 1.2 分组密码的含义 1.3 分组密码的要求 2 分组密码的设计思想 2.1 分组密码的设计思想 3 分组密码的基本特点 3.1 分组密码的基本特点 3.2 分组密码的迭代结构 3.3 子密钥的生成方法 3.4 轮函数的设计准则 3.5 迭代的轮数 4…

11、国产密码算法

参考推荐&#xff1a; 国密SM1\ SM2\ SM3\ SM4\ SSF33算法和国际RSA算法的对应关系_小明做IT的博客-CSDN博客_ssf33算法 国密算法SM1/SM2/SM3/SM4_fengwang0301的博客-CSDN博客_sm2/sm3/sm4 国产密码算法 国产密码算法是指由国家密码研究相关机构自主研发&#xff0c;具有相…

密码算法应用规范

术语解释 对称算法&#xff08;Symmetric key algorithm&#xff09;&#xff1a;采用相同的密钥执行加密或解密。 非对称算法&#xff08;Asymmertric key algorithm&#xff0c;公开密钥算法&#xff09;&#xff1a;用作加密的密钥不同于用作解密的密钥&#xff0c;而且解密…

古典密码算法(移位密码算法、维吉尼亚算法)

古典密码算法(凯撒、维吉尼亚) A. 1-1.移位密码算法 【实验目的】 1&#xff09; 学习移位密码的原理 2&#xff09; 学习移密码的实现 【实验原理】 算法原理 a) 移位密码就是对26个字母进行移位操作&#xff0c;可以移动任意位数&#xff0c;这样就实现了对明文的加密…

换位密码算法

换位密码算法基本原理&#xff1a;先把明文按固定长度进行分组&#xff0c;然后对每一组的字符进行换位操作&#xff0c;从而实现加密。为加强安全性&#xff0c;可进行多次换位密码算法运算。 import random def encrypt(plainText,t):result[]lengthlen(t)temp[plainText[i:…

常见密码学算法

学习笔记 分类 密码学用于解决信息安全中的保密性&#xff0c;完整性&#xff0c;认证和不可否认性等问题。最初主要用于解决保密性。随着密码学技术的发展&#xff0c;逐渐应用到其它领域。 常见密码学算法&#xff1a;DES,AES; RSA, ECC; Hash; Signature等。 分类 对称密…

密码学基础(一)常见密码算法分类

一、密码算法分类&#xff1a; 密码算法主要分为三类&#xff1a;对称密码算法、 非对称密码算法、摘要算法。 二、对称密码算法&#xff08;Symmetric-key Algorithm&#xff09; 1、概念 对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算…

常用的密码算法汇总分析(动态更新ing)

常用密码算法整理汇总 常用对称加密算法常用非对称加密算法常用Hash算法国产密码关于密码算法会持续更新.... 常用对称加密算法 对称加密算法(分组加密)描述DES将明文分为64位一组、密钥64位&#xff0c;实际56位&#xff08;64位中8位奇偶校验位&#xff09;3DES执行了3次DES&…

【密码学】常见密码算法分类和运用

一、摘要算法&#xff08;Digest Algorithm&#xff09; 摘要算法 是指把任意长度的输入消息数据转化为固定长度的输出数据的一种密码算法&#xff0c;又称为 散列函数 、 哈希函数 、 杂凑函数 、单向函数 等&#xff0c;通常用来做数据完整性的判定&#xff0c;即对数据进行…

常用密码算法介绍

算法种类 根据技术特征&#xff0c;现代密码学可分为三类&#xff1a; 对称算法 说明&#xff1a;加密密钥和解密密钥相同&#xff0c;对明文、密文长度没有限制 子算法&#xff1a; 流密码算法&#xff1a;每次加密或解密一位或一字节的明文或密文 分组密码算法&#xff…

2020 shodan 配置详解

需要先注册一个号>然后才能在kali里安装并认证 官网&#xff1a;https://www.shodan.io 安装命令&#xff1a; git clone https://github.com/achillean/shodan-python.git cd shodan-python python setup.py installshodan -h 查看使用&#xff1a; 这个。。土味英语&am…

Python中shodan模块的使用

关于shodan的安装和使用&#xff0c;传送门——> 渗透测试之Shodan的安装和使用 常用 Shodan 库函数 shodan.Shodan(key) &#xff1a;初始化连接APIShodan.count(query, facetsNone)&#xff1a;返回查询结果数量Shodan.host(ip, historyFalse)&#xff1a;返回一个IP的详细…

暗黑引擎 -- Shodan常用搜索语法

fofa&#xff0c;钟馗之眼&#xff0c;shodan等等一系列的公网设备搜索引擎&#xff0c;其中fofa和shodan使用的最多&#xff0c;本文就来整理一些shodan的搜索语法 Shodan&#xff1a;www.shodan.io Ps&#xff1a;均来自互联网搜集整理 工业控制系统 三星电子广告牌 &quo…

shodan的使用及maltego的注册

渗透学习 信息收集工具指南1 文章目录 渗透学习前言*本文只做学习用途&#xff0c;严禁利用本文提到的技术进行非法攻击&#xff0c;否则后果自负&#xff0c;本人不承担任何责任。* 一、shodan1.网络空间搜索引擎2.shodan3.命令行shodan 二、maltego1.情报分析2.maltego 总结…

shodan命令行

shodan获取IP信息 kali中命令行输入 shodan host ip 可以看到好多&#xff0c;比如可能漏洞&#xff0c;开放端口&#xff0c;运行的服务 shodan info 查询账户信息 Shodan获取自身外部IP shodan myip shodan检测是否有蜜罐保护 shodan honeyscore ip 蜜罐好比是情报收…

使用shodan/censys API搜索免费的elasticsearch/kibana资源

文章目录 注册shodan并获取API安装shodan注册censys并获取API安装censys用censys查询可用elasticsearch资源 记得以前我在elastic社区分享过一个主题《ITDS如何玩转elastic》(这里的ITDS是IT屌丝的意思)&#xff0c;里面提到过如何用elasticsearch做数字货币的交易数据分析&…

探究Shodan之旅之Shodan Hacking

下面让我们继续浅析一下国外专注于物联设备扫描的Shodan引擎~~ ExploreSearch Engine for the Internet of Thingshttps://www.shodan.io/explore Shodan除了能搜索Web服务器&#xff0c;还能扫描防火墙、路由器、交换机等一切 联网设备且支持Chrome和Firefox拓展插件 Shodan…