SM4
无线局域网产品使用的 SMS4 密码算法
本算法是一个分组算法。该算法的分组长度为 128 比特,密钥长度为 128 比特。加密算
法与密钥扩展算法都采用 32 轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮
密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
- 术语说明
1.1 字与字节
用 表示 e-比特的向量集, 中的元素称为字, 中的元素称为字节。 e Z 2 - Z2
- 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)为字。 - 轮函数 F
本算法采用非线性迭代结构,以字为单位进行加密运算,称一次迭代运算为一轮变换。
设输入为 ,轮密钥为 ,则轮函数 F 为: 432 - 2 ∈ ZXXXX )(),,,( 32 ∈ Zrk 2
),,,,( ( ) 3210 0 321 = ⊕ ⊕ ⊕ ⊕ rkXXXTXrkXXXXF
1
2.1 合成置换 T
T: ,是一个可逆变换,由非线性变换 τ 和线性变换 L 复合而成,即 T(.)=L(τ(.))。 32
2
32 - → ZZ
2.1.1 非线性变换τ
τ 由 4 个并行的 S 盒构成。
设输入为 , 输出为 ,则 48 - 2 = ∈ ZaaaaA )(),,,( 48
- 2 = ∈ ZbbbbB )(),,,(
))(),(),(),(()(),,,( 3210 0 1 2 3 = τ = aSboxaSboxaSboxaSboxAbbbb
2.1.2 线性变换 L
非线性变换 τ 的输出是线性变换 L 的输入。设输入为 ,输出为 ,则 32 ∈ ZB 2 - ∈ ZC 2
== ⊕ BBBLC B <<<⊕<<< ⊕ B <<< ⊕ B <<< )24()18()10()2()(
2.2 S 盒
S 盒中数据均采用 16 进制表示。
- 加/解密算法
定义反序变换 R 为:
),,,(),,,( 3210 = AAAAAAAAR 0123 , 。 3,2,1,0, 32
i 2 iZA =∈
设明文输入为 ,密文输出为 ,轮密钥
为 。则本算法的加密变换为:
432 - 2 ∈ ZXXXX )(),,,( 432
- 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) - 密钥扩展算法
本算法中加密算法的轮密钥由加密密钥通过密钥扩展算法生成。
加密密钥MK=(MK0, MK1, MK2, MK3),MKi∈ ,i=0,1,2,3; - 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 - 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 - 加密实例
以下为本算法 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日起施行。