跳到主要内容

GB/T 32907-2016 信息安全技术 SM4 分组密码算法

返回主题目录 · 官方来源

来源:GB/T 32907-2016 国家标准详情;发布日期:2016-08-29;实施日期:2017-03-01。 PDF SHA-256:7844b34640e074fb7c886a14f3223ec15abf21d74513efbb21416370b08b80de。 转写说明:按页渲染官方 PDF 并进行图像识别,对照全部 9 页原图校正公式、跨页 S 盒表和运算示例;省略封面、目录、页眉和页脚。正式引用请核对原 PDF。

前言​

本标准按照 GB/T 1.1—2009 给出的规则起草。

请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任。

本标准由国家密码管理局提出。

本标准由全国信息安全标准化技术委员会(SAC/TC 260)归口。

本标准起草单位:中国科学院数据与通信保护研究教育中心、国家密码管理局商用密码检测中心、北京信息科学技术研究院。

本标准主要起草人:吕述望、李大为、邓开勇、张超、罗鹏、张众、董芳、毛颖颖、刘振华。

1 范围​

本标准规定了 SM4 分组密码算法的算法结构和算法描述,并给出了运算示例。

本标准适用于商用密码产品中分组密码算法的实现、检测和应用。

2 术语和定义​

下列术语和定义适用于本文件。

2.1 分组长度 block length​

一个信息分组的比特位数。

2.2 密钥长度 key length​

密钥的比特位数。

2.3 密钥扩展算法 key expansion algorithm​

将密钥变换为轮密钥的运算单元。

2.4 轮数 rounds​

轮函数的迭代次数。

2.5 轮密钥 round key​

又称子密钥,在迭代分组密码中每一轮使用的密钥,根据输入密钥用密钥编排算法推导得出。

2.6 字 word​

长度为 32 比特的组(串)。

2.7 S 盒 S-box​

S 盒为固定的 8 比特输入 8 比特输出的置换,记为 Sbox(·)。

3 符号和缩略语​

下列符号和缩略语适用于本文件:

符号含义
⊕32 位异或
<<< i32 位循环左移 i 位
Z₂ⁿ比特长度为 n 的二进制序列集合

4 算法结构​

SM4 密码算法是一个分组算法。该算法的分组长度为 128 比特,密钥长度为 128 比特。加密算法与密钥扩展算法均采用非线性迭代结构,运算轮数均为 32 轮。数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

5 密钥及密钥参量​

密钥长度为 128 比特,表示为 MK = (MK₀, MK₁, MK₂, MK₃),其中 MKᵢ(i = 0, 1, 2, 3)为字。

轮密钥表示为 (rk₀, rk₁, …, rk₃₁),其中 rkᵢ(i = 0, …, 31)为 32 比特字。轮密钥由密钥生成。

FK = (FK₀, FK₁, FK₂, FK₃) 为系统参数,CK = (CK₀, CK₁, …, CK₃₁) 为固定参数,用于密钥扩展算法,其中 FKᵢ(i = 0, …, 3)、CKᵢ(i = 0, …, 31)为字。

6 轮函数 F​

6.1 轮函数结构​

设输入为 (X₀, X₁, X₂, X₃) ∈ (Z₂³²)⁴,轮密钥为 rk ∈ Z₂³²,则轮函数 F 见式(1):

F(X₀, X₁, X₂, X₃, rk) = X₀ ⊕ T(X₁ ⊕ X₂ ⊕ X₃ ⊕ rk) (1)

6.2 合成置换 T​

T: Z₂³² → Z₂³² 是一个可逆变换,由非线性变换 τ 和线性变换 L 复合而成,即 T(·) = L(τ(·))。

a)非线性变换 τ

τ 由 4 个并行的 S 盒构成。

设输入为 A = (a₀, a₁, a₂, a₃) ∈ (Z₂⁸)⁴,输出为 B = (b₀, b₁, b₂, b₃) ∈ (Z₂⁸)⁴,则见式(2):

(b₀, b₁, b₂, b₃) = τ(A) = (Sbox(a₀), Sbox(a₁), Sbox(a₂), Sbox(a₃)) (2)

式中,Sbox 数据见表 1。

表 1 Sbox 数据

0123456789ABCDEF
0D690E9FECCE13DB716B614C228FB2C05
12B679A762ABE04C3AA44132649860699
29C4250F491EF987A33540B43EDCFAC62
3E4B31CA9C908E89580DF94FA758F3FA6
44707A7FCF37317BA83593C19E6854FA8
5686B81B27164DA8BF8EB0F4B70569D35
61E240E5E6358D1A225227C3B01217887
7D40046579FD327524C3602E7A0C4C89E
8EABF8AD240C738B5A3F7F2CEF96115A1
9E0AE5DA49B341A55AD933230F58CB1E3
A1DF6E22E8266CA60C02923AB0D534E6F
BD5DB3745DEFD8E2F03FF6A726D6C5B51
C8D1BAF92BBDDBC7F11D95C411F105AD8
D0AC13188A5CD7BBD2D74D012B8E5B4B0
E8969974A0C96777E65B9F109C56EC684
F18F07DEC3ADC4D2079EE5F3ED7CB3948

例如:输入“EF”,则经 S 盒后的值为表中第 E 行和第 F 列的值,Sbox(EF) = 84。

b)线性变换 L

非线性变换 τ 的输出是线性变换 L 的输入。设输入为 B ∈ Z₂³²,输出为 C ∈ Z₂³²,则见式(3):

C = L(B) = B ⊕ (B <<< 2) ⊕ (B <<< 10) ⊕ (B <<< 18) ⊕ (B <<< 24) (3)

7 算法描述​

7.1 加密算法​

本加密算法由 32 次迭代运算和 1 次反序变换 R 组成。

设明文输入为 (X₀, X₁, X₂, X₃) ∈ (Z₂³²)⁴,密文输出为 (Y₀, Y₁, Y₂, Y₃) ∈ (Z₂³²)⁴,轮密钥为 rkᵢ ∈ Z₂³²,i = 0, 1, 2, …, 31。加密算法的运算过程如下:

a)32 次迭代运算见式(4):

Xᵢ₊₄ = F(Xᵢ, Xᵢ₊₁, Xᵢ₊₂, Xᵢ₊₃, rkᵢ),i = 0, 1, …, 31 (4)

b)反序变换见式(5):

(Y₀, Y₁, Y₂, Y₃) = R(X₃₂, X₃₃, X₃₄, X₃₅) = (X₃₅, X₃₄, X₃₃, X₃₂) (5)

加密运算过程的示例参见附录 A。

7.2 解密算法​

本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序。解密时,使用轮密钥序 (rk₃₁, rk₃₀, …, rk₀)。

7.3 密钥扩展算法​

加密过程使用的轮密钥由加密密钥生成,其中加密密钥 MK = (MK₀, MK₁, MK₂, MK₃) ∈ (Z₂³²)⁴,加密过程中的轮密钥生成方法见式(6)和式(7):

(K₀, K₁, K₂, K₃) = (MK₀ ⊕ FK₀, MK₁ ⊕ FK₁, MK₂ ⊕ FK₂, MK₃ ⊕ FK₃) (6)
rkᵢ = Kᵢ₊₄ = Kᵢ ⊕ T′(Kᵢ₊₁ ⊕ Kᵢ₊₂ ⊕ Kᵢ₊₃ ⊕ CKᵢ),i = 0, 1, …, 31 (7)

式中:

a)T′ 是将 6.2 中合成置换 T 的线性变换 L 替换为 L′,见式(8):

L′(B) = B ⊕ (B <<< 13) ⊕ (B <<< 23) (8)

b)系统参数 FK 的取值为:FK₀ = A3B1BAC6,FK₁ = 56AA3350,FK₂ = 677D9197,FK₃ = B27022DC;

c)固定参数 CK 取值方法为:

设 ckᵢ,ⱼ 为 CKᵢ 的第 j 字节(i = 0, 1, …, 31;j = 0, 1, 2, 3),即 CKᵢ = (ckᵢ,₀, ckᵢ,₁, ckᵢ,₂, ckᵢ,₃) ∈ (Z₂⁸)⁴,则 ckᵢ,ⱼ = (4i + j) × 7 (mod 256)。

固定参数 CKᵢ(i = 0, 1, …, 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。

解密密钥同加密密钥,解密使用的轮密钥由解密密钥生成,其轮密钥生成方法同加密过程的轮密钥生成方法。

附录 A(资料性附录)运算示例​

A.1 示例 1​

本附录为 SM4 分组密码算法对一组明文进行加密的运算示例。

输入明文: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输出状态 X
0F12186F9X[4] = 27FAD345
141662B61X[5] = A18B4CB2
25A6AB19AX[6] = 11C1E22A
37BA92077X[7] = CC13E2EE
4367360F4X[8] = F87C5BD5
5776A0C61X[9] = 33220757
6B6BB89B3X[10] = 77F4C297
724763151X[11] = 7A96F2EB
8A520307CX[12] = 27DAC07F
9B7584DBDX[13] = 42DD0F19
10C30753EDX[14] = B8A5DA02
117EE55B57X[15] = 907127FA
126988608CX[16] = 8B952B83
1330D895B7X[17] = D42B7C59
1444BA14AFX[18] = 2FFC5831
15104495A1X[19] = F69E6888
16D120B428X[20] = AF2432C4
1773B55FA3X[21] = ED1EC85E
18CC874966X[22] = 55A3BA22
1992244439X[23] = 124B18AA
20E89E641FX[24] = 6AE7725F
2198CA015AX[25] = F4CBA1F9
22C7159060X[26] = 1DCDFA10
2399E1FD2EX[27] = 2FF60603
24B79BD80CX[28] = EFF24FDC
251D2115B0X[29] = 6FE46B75
260E228AEBX[30] = 893450AD
27F1780C81X[31] = 7B938F4C
28428D3654X[32] = 536E4246
2962293496X[33] = 86B3E94F
3001CF72E5X[34] = D206965E
319124A012X[35] = 681EDF34

输出密文:68 1E DF 34 D2 06 96 5E 86 B3 E9 4F 53 6E 42 46

A.2 示例 2​

本附录为 SM4 分组密码算法使用固定的加密密钥,对一组明文反复加密 1 000 000 次的运算示例。

输入明文: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