• SM4分组密码算法



    SM4算法介绍

    • SM4.0于2013年3月被列为国家密码行业标准“GM/T 0002-2012《SM4分组密码算法》(原SMS4分组密码算法)”。2016年被列入国家标准(GB/T 32907-2016)
    • 在商用密码体系中,SM4主要用于数据加密,其算法公开,分组长度与密钥长度均为128bit。加密算法与密钥扩展算法都采用32轮非线性迭代结构,采用非平衡Feistel。每一轮需要一个轮密钥。以字(32bit)为单位加密。
    • M4算法加/解密算法的结构相同,只是使用轮密钥相反,其中解密轮密钥是加密轮密钥的逆序。

    一、SM4加密流程

    下图是SM4的加密流程图以及SM4轮函数的示意图。
    在SM4加密的过程中经过了32轮轮函数F。
    在这里插入图片描述

    二、轮函数F

    X0,X1 ,X2 ,X3为128bit的输入
    轮函数F(Xi,Xi+1 ,Xi+2 ,Xi+3) = Xi ⊕T(Xi+1 ⊕Xi+2 ⊕Xi+3⊕rki) 。轮函数F如上图所示
    经过轮函数F之后会产生一个字的结果,执行32轮迭代之后会产生36个字(X0,X1 ,…,X32,X33,X34,X35)

    1.合成置换T

    T是一个可逆变换,由非线性变换τ和线性变换L复合而成。
    T(A)=L(τ(A))

    • 非线性变换τ是由4个S盒组成的。
    • 非线性变换τ的输出是线性变换L的输入。
      其中输入A是32bit
      第i轮A的值为:A=Xi+1 ⊕Xi+2 ⊕Xi+3⊕rki

    3.非线性变换τ

    S盒中的数据采用的是十六进制来表示。四个S盒一共为32bit,每个S盒为8bit。
    如S盒的输入如果是EF则输出结果是第E行第F列的值。
    eg:输入:A = a0,a1 ,a2 ,a3;输出B=b0,b1 ,b2 ,b3
    则(b0,b1 ,b2 ,b3)=τ(A)=(Sbox( a0),Sbox( a1),Sbox( a2),Sbox( a3))
    (其中A为合成置换中的输入A:A=Xi+1 ⊕Xi+2 ⊕Xi+3⊕rki

    2.线性变换L

    c=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18)⊕(B<<<24)
    其中B是32位的数,输出仍是32位
    输入B的值为非线性变换τ输出的32的值

    B<< eg:B=123456。则 B<<<3 = 456123

    4.加密的结果

    32轮迭代后在最后会加上反序变换。
    反序变换R:R(a0,a1 ,a2 ,a3)=(a3,a2 ,a1 ,a0)
    密文为(Y0,Y1 ,Y2 ,Y3) =R(X32,X33 ,X34 ,X35)=(X35,X34 ,X33 ,X32)


    总结

    上面写的有点乱。
    在EBC模式下SM4算法的流程如下:
    SM4
    如果有写的不对的地方欢迎指出!

  • 相关阅读:
    【明年找到好工作】:面试题打卡第三天
    MySQL 篇-深入了解事务四大特性及原理
    java学习--字符流
    程序通过命令行获取操作系统名称+版本+CPU名称等:Part2
    拿下Transformer
    博弈论入门
    Spring Integration 快速入门教程
    【java】异常
    【LibTorch】C++中部署PyTorch模型(以DenseTNT模型为例)
    redis基础
  • 原文地址:https://blog.csdn.net/qq_43589852/article/details/127994888