zoukankan      html  css  js  c++  java
  • 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) 输出。




  • 相关阅读:
    关于Maven项目的pom.xml中的依赖或插件失效的解决方法
    java引用数据类型在方法中的值传递
    java匹配http或https的url的正则表达式20180912
    java正则表达式的进阶使用20180912
    java线程池 多线程 搜索包含关键字的文件路径
    魔术球问题
    [SDOI2009]晨跑
    [洛谷P2045]方格取数加强版
    最小路径覆盖问题
    最长不下降子序列问题
  • 原文地址:https://www.cnblogs.com/11sgXL/p/13626483.html
Copyright © 2011-2022 走看看