• SM4分组密码算法


    1. SM4算法定义

    SM4密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。

    1. 该算法的分组长度为128比特,密钥长度为128比特。(十六进制表示则为32位,明文和密钥等长)

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

    3. 密钥扩展算法:将加密密钥变换为轮密钥的运算单元。

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

    2. SM4算法的优势

    国密算法SM4有安全高效的特点,在设计与实现方面有以下优势:

    • 对合运算:解密算法与加密算法相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
    • 子密钥生成算法与加密算法结构类似,在设计上做到资源重用。
    • 加密算法与密钥扩展算法都采用32轮非线性迭代结构,将128位的明文、密钥通过32次循环的非线性迭代运算得到最终结果。

    3. 加密算法流程

    整体流程框架:

    或者参考
    北卡科技的博客中的流程图
    SM4算法结构:

    轮密钥生成:

    32次非线性迭代:

    3.1. 密钥扩展算法

    密钥扩展算法:将加密密钥变换为轮密钥的运算单元。

    轮密钥 (rk_i) 生成方法:

    (rk_i=K_{i+4}=K_ioplus T'(K_{i+1}oplus K_{i+2}oplus K_{i+3}oplus CK_{i}), i=0,1,cdots,31)

    合成置换 (T':Z_2^{32} ightarrow Z_2^{32}) 是一个可逆变换,由非线性变换 ( au) 和线性变换 (L')复合而成,即 (T'(cdot)=L'( au(cdot)))

    线性变换 (L')(L'(B)=B oplus (B <<< 13)oplus (B<<<23)),其中 (<<< i) 表示32位循环左移 (i) 位。

    非线性变换 ( au)( au (B))( au) 由4个并行的S盒构成。

    S盒为固定的8比特输入8比特输出的置换,记为 (Sbox(cdot))
    轮密钥由加密密钥生成。
    (FK = (FK_0,FK_1,FK_2,FK_3)) 为系统参数[^1],(CK=(CK_0,CK_1,cdots,CK_{31})) 为固定参数[^2],用于密钥扩展算法,其中 (FK_i (i=0,cdots,3))(CK_i (i=0,cdots,31)) 为字。

    [^1]:系统参数 (FK) 的取值为: (FK_0=(A3B1BAC6), FK_1=(56AA3350), FK_2=(677D9197), FK_3=(B27022DC))

    [^2]:固定参数 (CK) 的取值方法为:设 (ck_{i,j})(CK_i) 的第 (j) 字节((i=0,1,cdots,31; j=0,1,2,3)),即 (CK_i=(ck_{i,0},ck_{i,1},ck_{i,2},ck_{i,3})),则 (ck_{i,j}=(4i+j) imes 7 (mod 256))
    固定参数 (CK_i (i=0,1,cdots,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

    非线性变换 ( au)

    例如输入为 (01 23 45 67),则该 ( au) 变换应为:(90 F4 73 A2)((01 ightarrow 第0行第1列 ightarrow 90))

    3.2. 轮函数 (F) · 32次迭代

    轮函数 (F) 生成方法:
    (X_{i+4} = F(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i) = X_i oplus T(X_{i+1}oplus X_{i+2}oplus X_{i+3}oplus rk_i), i=0,1,cdots,31 )

    合成置换 (T:Z_2^{32} ightarrow Z_2^{32}) 是一个可逆变换,由非线性变换 ( au) 和线性变换 (L)复合而成,即 (T(cdot)=L( au(cdot)))

    线性变换 (L)(L(B)=B oplus (B <<< 2)oplus (B<<<10)oplus (B<<<18)oplus (B<<<24))

    非线性变换 ( au)( au (B))( au) 由4个并行的S盒构成。

    3.3. 反序变换 (R)

    4. 解密算法

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

    解密时,使用轮密钥序 (rk_{31}, rk_{30}, cdots, rk_0)

    5. 小结

    先将128比特密钥 (MK) 扩展为32个轮密钥 (rk),再将该轮密钥与128比特明文 (X) 经过轮函数进行32次迭代后,选取最后四次迭代生成的结果 (X_{32}, X_{33}, X_{34}, X_{35}) 进行反序变换,该变换结果作为最终的密文 (Y) 输出。




  • 相关阅读:
    Python CI中iOS项目自动打包运行
    Jquery 插件开发公开属性顺序的影响.
    MVC4使用SignalR出现$.connection is undefined错误备忘
    C语言运算符的优先级与结合性
    CF478C Table Decorations (贪心)
    LightOJ1370 Bishoe and Phishoe (欧拉函数+二分)
    经典排序:冒泡排序法与选择排序法
    STL初学
    博客园使用Markdown和公式
    为知笔记(Wiz)发布博客到博客园(cnblog)
  • 原文地址:https://www.cnblogs.com/11sgXL/p/13626483.html
Copyright © 2020-2023  润新知