国密算法SM4

1. 算法结构

        SM4密码算法是一个分组算法。

        算法的分组长度:128比特。

        密钥长度:128比特。

        轮密钥长度:32比特。

        加密算法与密钥扩展算法都采用32轮非线性迭代结构。

        数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

2. 密钥及密钥参量

        加密密钥长度为128比特,表示为MK=(MK_0,MK_1,MK_2,MK_3),其中MK_i(i=0,1,2,3)为字。

        轮密钥表示为(rk_0,rk_1,...,rk_{31}),其中rk_i(i=0,...,31)为32比特字。轮密钥由加密密钥生成。

        FK=(FK_0,FK_1,FK_2,FK_3)为系统参数,CK=(CK_0,CK_1,...,CK_{31})为固定参数,用于密钥扩展算法,其中FK_i(i=0,...,3)CK_i(i=0,...,31)为字。

3. 轮函数F

3.1 轮函数结构

        设输入为(X_0,X_1,X_2,X_3)\;\epsilon\;(z_2^{32})^4,轮密钥为rk\;\epsilon \;Z_2^{32},则轮函数F为:    

         F(X_0,X_1,X_2,X_3,rk)=X_0\oplus T(X_1\oplus X_2\oplus X_3\oplus rk)

3.2 合成置换T

        TZ_2^{32}\rightarrow Z_2^{32}是一个可逆变换,由非线性变换 \iota 和线性变换L复合而成,即T(.)=L(\iota (.))

        (1)非线性变换 \iota 

                 \iota 由四个并行的 S 盒构成。

                设输入为A=(a_0,a_1,a_2,a_3)\;\epsilon\;(Z_2^8)^4,输出为B=(b_0,b_1,b_2,b_3)\;\epsilon\;(Z_2^8)^4,则

                (b_0,b_1,b_2,b_3)=\iota (A)=(Sbox(a_0),Sbox(a_1,Sbox(a_2,Sbox(a_3))

                其中,Sbox数据如下:

0123456789ABCDEF
0D690E9FECCE13DB716B614C228FB2C05
12B679A762ABE04C3AA44132649860699
29C4250F491EF987A33540B43EDCFAC62
3E4B31CA9C908E89580DF94FA758F3FA6
44707A7FCF37317BA83593C19E6854FA8
5686B81B27164DA8BF8EB0F4B70569D35
61E240E5E6358D1A225227C3B01217887
7D40046579FD327524C3602E7A0C4C89E
8EABF8AD240C738B5A3F7F2CEF96115A1
9E0AE5DA49B341A55AD933230F58CB1E3
A1DF6E22E8266CA60C02923AB0D534E6F
BD5DB3745DEFD8E2F03FF6A726D6C5B51
C8D1BAF92BBDDBC7F11D95C411F105AD8
D0AC13188A5CD7BBD2D74D012B8E5B4B0
E8969974A0C96777E65B9F109C56EC684
F18F07DEC3ADC4D2079EE5F3ED7CB3948

        (2)线性变换L

                非线性变换 \iota 的输出是线性变换L的输入。设输入为B\;\epsilon \;Z_2^{32},输出为C\;\epsilon \;Z_2^{32},则:

 C=L(B)=B\oplus (B<< 2)\oplus (B<< 10)\oplus (B < < 18)\oplus (B < < 24)

4. 算法描述

4.1 加密算法

        加密算法由32次迭代运算和1次反序变换R组成。

        设明文输入为(X_0,X_1,X_2,X_3)\;\epsilon\;(z_2^{32})^4,密文输出为(Y_0,Y_1,Y_2,Y_3)\;\epsilon\;(z_2^{32})^4,轮密钥

rk_i\;\epsilon Z_2^{32}\; ,\;i=0,...,31。加密算法运算过程如下:

        (1)32次迭代运算:X_{i+4}=F(X_0,X_1,X_2,X_3,rk_i)\;,\;i=0,1,...,31;

        (2)反序变换:(Y_0,Y_1,Y_2,Y_3)=R(X_{32},X_{33},X_{34},X_{35})=(X_{35},X_{34},X_{33},X_{32})

4.2 解密算法

        解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序,解密时,使用轮密钥序

(rk_{31},rk_30,...,rk_0)

4.3 密钥拓展算法

        轮密钥由加密密钥通过密钥扩展算法生成。

        加密密钥MK=(MK_0,MK_1,MK_2,MK_3)\;\epsilon\;(Z_2^{32})^4,轮密钥生成方法为:

        (K_0,K_1,K_2,K_3)=(MK_0\oplus FK_0,MK_1\oplus FK_1,MK_2\oplus FK_2,MK_3\oplus \\ .\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;FK_3),

        rk_i=K_{i+4}=K_i\oplus {T}'(K_{i+1}\oplus K_{i+2} \oplus K_{i+3}\oplus CK_{i})

        其中:

        (1){T}'是将合成置换T的线性变换L替换为{L}'

                {L}'(B)=B\oplus (B<<<13)\oplus(B<<<23)     

        (2)系统参数FK的取值为:

                FK_0=(A3B1BAC6),FK_1=(56AA3500),\\ FK_2=(677D9197),FK_3=(B27022DC);

        (3)固定参数CK的取值为:

                设ck_{i,j}CK_i的第 j 字节(i=0,1,...,31;j=0,1,2,3),即

                CK_i=(ck_{i,0},ck_{i,1},ck_{i,2},ck_{i,3})\;\epsilon\;(Z_2^8)^4,则ck_{i,j}=(4i+j)\times 37(mod\;256)

                固定参数CK_i(i=0,1,...,31)具体值为:

                00070E15,1C232A31,383F464D,545B6269,

                70777E85,8C939AA1,A8AFB6BD,C4CBD2D9,

                E0E7EEF5,FC030A11,181F262D,343B4249,

                50575E65,6C737A81,888F969D,A4ABB2B9,

                C0C7CED5,DCE3EAF1,F8FF060D,141B2229,

                30373E45,4C535A61,686F767D,848B9299,

                A0A7AEB5,BCC3CAD1,D8DFE6ED,F4FB0209,

                10171E25,2C333A41,484F565D,646B7279。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值