SM4

sm4sm4

无线局域网产品使用的 SMS4 密码算法

本算法是一个分组算法。该算法的分组长度为 128 比特,密钥长度为 128 比特。加密算
法与密钥扩展算法都采用 32 轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮
密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
  1. 术语说明
    1.1 字与字节
    用 表示 e-比特的向量集, 中的元素称为字, 中的元素称为字节。 e Z 2
  2. Z2
  3. Z2
    1.2 S 盒
    S 盒为固定的 8 比特输入 8 比特输出的置换,记为 Sbox(.)。
    1.3 基本运算
    在本算法中采用了以下基本运算:
    ⊕ 32 比特异或
    <<< i 32 比特循环左移 i 位
    1.4 密钥及密钥参量
    加密密钥长度为 128 比特,表示为MK=(MK0, MK1, MK2, MK3),其中MKi(i=0,1,2,3)为
    字。
    轮密钥表示为(rk0, rk1, …, rk31),其中rki(i=0,…,31)为字。轮密钥由加密密钥生成。
    FK=(FK0, FK1, FK2, FK3)为系统参数,CK=(CK0, CK1,…, CK31)为固定参数,用于密钥扩
    展算法,其中FKi(i=0,…,3)、CKi(i=0,…,31)为字。
  4. 轮函数 F
    本算法采用非线性迭代结构,以字为单位进行加密运算,称一次迭代运算为一轮变换。
    设输入为 ,轮密钥为 ,则轮函数 F 为: 432
  5. 2 ∈ ZXXXX )(),,,( 32 ∈ Zrk 2
    ),,,,( ( ) 3210 0 321 = ⊕ ⊕ ⊕ ⊕ rkXXXTXrkXXXXF
    1
    2.1 合成置换 T
    T: ,是一个可逆变换,由非线性变换 τ 和线性变换 L 复合而成,即 T(.)=L(τ(.))。 32
    2
    32
  6. → ZZ
    2.1.1 非线性变换τ
    τ 由 4 个并行的 S 盒构成。
    设输入为 , 输出为 ,则 48
  7. 2 = ∈ ZaaaaA )(),,,( 48
  8. 2 = ∈ ZbbbbB )(),,,(
    ))(),(),(),(()(),,,( 3210 0 1 2 3 = τ = aSboxaSboxaSboxaSboxAbbbb
    2.1.2 线性变换 L
    非线性变换 τ 的输出是线性变换 L 的输入。设输入为 ,输出为 ,则 32 ∈ ZB 2
  9. ∈ ZC 2
    == ⊕ BBBLC B <<<⊕<<< ⊕ B <<< ⊕ B <<< )24()18()10()2()(
    2.2 S 盒
    S 盒中数据均采用 16 进制表示。

  1. 加/解密算法
    定义反序变换 R 为:
    ),,,(),,,( 3210 = AAAAAAAAR 0123 , 。 3,2,1,0, 32
    i 2 iZA =∈
    设明文输入为 ,密文输出为 ,轮密钥
    为 。则本算法的加密变换为:
    432
  2. 2 ∈ ZXXXX )(),,,( 432
  3. 2 ∈ ZYYYY )(),,,(
    31,...,2,1,0, 32
    i 2 iZrk =∈
    (),,,,( .13,...,1,0,) i+4 = +++ 321 = iiiiii ⊕ +1 ⊕ ii +2 ⊕ i+3 ⊕ i irkXXXTXrkXXXXFX =
    ),,,(),,,(),,,( 3210 = 35343332 = XXXXXXXXRYYYY 32333435 。
    本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序。
    加密时轮密钥的使用顺序为:(rk0, rk1, …, rk31)
    解密时轮密钥的使用顺序为:(rk31, rk30, …, rk0)
  4. 密钥扩展算法
    本算法中加密算法的轮密钥由加密密钥通过密钥扩展算法生成。
    加密密钥MK=(MK0, MK1, MK2, MK3),MKi∈ ,i=0,1,2,3;
  5. Z2
    令Ki∈ ,i=0,1,…,35,轮密钥为 ,则轮密钥生成方法为: 32 Z2 31,...,1,0, 32
    i 2 iZrk =∈
    首先,(K0,K1,K2,K3)=(MK0○+ FK0,MK1○+ FK1,MK2○+ FK2,MK3○+ FK3)
    然后,对i = 31,...,2,1,0 :
    ( ) ii 4 i i 1 ⊕ i 2 ⊕ i 3 ⊕ CKKKKTKKrk i ⊕== ′ + + + +
    说明:
    (1) ' T 变换与加密算法轮函数中的 T 基本相同,只将其中的线性变换 L 修改为以下 : ' L
    ' L (B)=B○+ (B<<< 13)○+ (B<<< 23);
    (2)系统参数 FK 的取值,采用 16 进制表示为:
    FK0=(A3B1BAC6),FK1=(56AA3350),FK2=(677D9197),FK3=(B27022DC)
    (3)固定参数 CK 的取值方法为:
    设cki,j为CKi的第j字节(i=0,1,…,31;j=0,1,2,3),即CKi = (cki,0,cki,1,cki,2,cki,3) ∈ ,
    则ck
    48
  6. Z )(
    i,j = (4i+j)×7(mod 256)。32 个固定参数CKi,其 16 进制表示为:
    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
    3
  7. 加密实例
    以下为本算法 ECB 工作方式的运算实例,用以验证密码算法实现的正确性。其中,数
    据采用 16 进制表示。
    实例一: 对一组明文用密钥加密一次
    明 文 : 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
    加密密钥 : 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
    轮密钥与每轮输出状态 :
    rk[ 0] = f12186f9 X[ 0] = 27fad345
    rk[ 1] = 41662b61 X[ 1] = a18b4cb2
    rk[ 2] = 5a6ab19a X[ 2] = 11c1e22a
    rk[ 3] = 7ba92077 X[ 3] = cc13e2ee
    rk[ 4] = 367360f4 X[ 4] = f87c5bd5
    rk[ 5] = 776a0c61 X[ 5] = 33220757
    rk[ 6] = b6bb89b3 X[ 6] = 77f4c297
    rk[ 7] = 24763151 X[ 7] = 7a96f2eb
    rk[ 8] = a520307c X[ 8] = 27dac07f
    rk[ 9] = b7584dbd X[ 9] = 42dd0f19
    rk[10] = c30753ed X[10] = b8a5da02
    rk[11] = 7ee55b57 X[11] = 907127fa
    rk[12] = 6988608c X[12] = 8b952b83
    rk[13] = 30d895b7 X[13] = d42b7c59
    rk[14] = 44ba14af X[14] = 2ffc5831
    rk[15] = 104495a1 X[15] = f69e6888
    rk[16] = d120b428 X[16] = af2432c4
    rk[17] = 73b55fa3 X[17] = ed1ec85e
    rk[18] = cc874966 X[18] = 55a3ba22
    rk[19] = 92244439 X[19] = 124b18aa
    rk[20] = e89e641f X[20] = 6ae7725f
    rk[21] = 98ca015a X[21] = f4cba1f9
    rk[22] = c7159060 X[22] = 1dcdfa10
    rk[23] = 99e1fd2e X[23] = 2ff60603
    rk[24] = b79bd80c X[24] = eff24fdc
    rk[25] = 1d2115b0 X[25] = 6fe46b75
    rk[26] = 0e228aeb X[26] = 893450ad
    rk[27] = f1780c81 X[27] = 7b938f4c
    rk[28] = 428d3654 X[28] = 536e4246
    rk[29] = 62293496 X[29] = 86b3e94f
    rk[30] = 01cf72e5 X[30] = d206965e
    rk[31] = 9124a012 X[31] = 681edf34
    密 文 : 68 1e df 34 d2 06 96 5e 86 b3 e9 4f 53 6e 42 46
    实例二: 利用相同加密密钥对一组明文反复加密 1000000 次
    明 文 : 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
    加密密钥 : 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
    密 文 : 59 52 98 c7 c6 fd 27 1f 04 02 f8 04 c3 3d 3f 66

新修订的《商用密码管理条例》7月1日起施行。

SM4
最后修改于:2023年09月11日 09:15