文章总结: 本文详细解析了商密算法SM3的完整计算过程,以字符串利刃信安为例,展示了从消息填充、迭代压缩到消息扩展的核心步骤,并给出了各阶段的中间值和最终结果。
综合评分: 85
文章分类: 技术标准,解决方案,数据安全,应用安全,网络安全
【商密测评】SM3密码杂凑算法完整计算过程
原创
利刃信安 利刃信安
利刃信安
2026年3月21日 01:01 北京
SM3密码杂凑算法完整计算过程
文档版本: v1.0 生成日期: 2026年 参考标准: GB/T 32905-2016《信息安全技术 SM3密码杂凑算法》
基本信息
| 项目 | 内容 |
| — | — |
| 输入类型 | 字符串 |
| 输入内容 | 利刃信安 |
| 十六进制表示 | E588A9E58883E4BFA1E5AE89 |
| 消息长度 | 96 比特 (12 字节) |
| 字符编码 | UTF-8 |
输入数据详解
字符串”利刃信安”的UTF-8编码解析:
| 字符 | Unicode码点 | UTF-8编码 (十六进制) | 二进制表示 | | — | — | — | — | | 利 | U+5229 | E5 88 A9 | 11100101 10001000 10101001 | | 刃 | U+5203 | E5 88 83 | 11100101 10001000 10000011 | | 信 | U+4FE1 | E4 BF A1 | 11100100 10111111 10100001 | | 安 | U+5B89 | E5 AE 89 | 11100101 10101110 10001001 |
第一步: 消息填充
填充规则
SM3算法的消息填充遵循Merkle-Damgård结构,具体步骤如下:
- 1. 添加比特’1′: 在消息末尾添加一个比特’1′
- 2. 添加k个’0′: 添加k个’0’比特,使得
(l+1+k) mod 512 = 448 - 3. 添加长度: 添加64位二进制表示的消息长度l(大端序)
- 4. 对齐: 填充后消息长度为512的倍数
填充参数计算
原始消息长度 l = 96 比特
l + 1 = 96 + 1 = 97
(l + 1) mod 512 = 97 mod 512 = 97
需要填充的0的个数 k = 448 - 97 = 351
填充后总长度 = 96 + 1 + 351 + 64 = 512 比特
填充过程详解
步骤1: 添加’1′
输入二进制: 11100101100010001010100111100101100010001000001111100100101111111010000111100101
输出二进制: 11100101100010001010100111100101100010001000001111100100101111111010000111100101...1
步骤2: 添加351个’0′
输出长度: 96 + 1 + 351 = 448 比特
步骤3: 添加64位长度表示
长度l的二进制(64位): 0000000000000000000000000000000000000000000000000000000001100000
长度l的十六进制: 0000000000000060
填充后消息
十六进制表示:
E588A9E58883E4BFA1E5AE8980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060
结构分析:
| 区域 | 十六进制内容 | 说明 |
| — | — | — |
| 原始消息 | E588A9E58883E4BFA1E5AE89 | 12字节 (96比特) |
| 填充’1′ | 80 | 二进制10000000 |
| 填充’0′ | 00000000...00000000 | 43字节 (351比特中后344比特) |
| 长度字段 | 0000000000000060 | 8字节 (64比特),值为96 |
消息分组
填充后的512比特消息被划分为 1组,每组512比特。
第二步: 迭代压缩
初始值IV
SM3算法使用以下256位初始值:
| 索引 | 值 | 二进制表示 | | — | — | — | | V[0] | 7380166F | 01110011100000000001011001101111 | | V[1] | 4914B2B9 | 01001001000101001011001010111001 | | V[2] | 172442D7 | 00010111001001000100001011010111 | | V[3] | DA8A0600 | 11011010100010100000011000000000 | | V[4] | A96F30BC | 10101001011011110011000010111100 | | V[5] | 163138AA | 00010110001100010011100010101010 | | V[6] | E38DEE4D | 11100011100011011110111001001101 | | V[7] | B0FB0E4E | 10110000111110110000111001001110 |
处理第0组消息分组B0
消息分组B0
| 项目 | 内容 |
| — | — |
| 二进制 | 11100101100010001010100111100101100010001000001111100100101111111010000111100101... |
| 十六进制 | E588A9E58883E4BFA1E5AE8980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060 |
消息扩展
步骤1: 将512位消息分组划分为16个32位字
输入: E588A9E58883E4BFA1E5AE8980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060
输出 W[0-15]:
| 索引 | 值 | 来源字节 | | — | — | — | | W[0] | E588A9E5 | 字节 0-3 | | W[1] | 8883E4BF | 字节 4-7 | | W[2] | A1E5AE89 | 字节 8-11 | | W[3] | 80000000 | 字节 12-15 (填充起始) | | W[4] | 00000000 | 字节 16-19 | | W[5] | 00000000 | 字节 20-23 | | W[6] | 00000000 | 字节 24-27 | | W[7] | 00000000 | 字节 28-31 | | W[8] | 00000000 | 字节 32-35 | | W[9] | 00000000 | 字节 36-39 | | W[10] | 00000000 | 字节 40-43 | | W[11] | 00000000 | 字节 44-47 | | W[12] | 00000000 | 字节 48-51 | | W[13] | 00000000 | 字节 52-55 | | W[14] | 00000000 | 字节 56-59 | | W[15] | 00000060 | 字节 60-63 (长度字段) |
步骤2: 生成W[16-67]
扩展公式:
W[j] = P1(W[j-16] ⊕ W[j-9] ⊕ ROTL(W[j-3],15)) ⊕ ROTL(W[j-13],7) ⊕ W[j-6]
置换函数P1:
P1(X) = X ⊕ ROTL(X,15) ⊕ ROTL(X,23)
计算示例 W[16]:
输入参数:
W[0] = E588A9E5
W[7] = 00000000
W[13] = 00000000
W[3] = 80000000
W[10] = 00000000
计算过程:
ROTL(W[13],15) = ROTL(00000000,15) = 00000000
W[0] ⊕ W[7] ⊕ ROTL(W[13],15) = E588A9E5 ⊕ 00000000 ⊕ 00000000 = E588A9E5
P1(E588A9E5) = E588A9E5 ⊕ ROTL(E588A9E5,15) ⊕ ROTL(E588A9E5,23) = 43889F75
ROTL(W[3],7) = ROTL(80000000,7) = 00000040
W[16] = 43889F75 ⊕ 00000040 ⊕ 00000000 = 43889F35
生成的W16-67:
| 索引 | 值 | 索引 | 值 | 索引 | 值 | 索引 | 值 | | — | — | — | — | — | — | — | — | | W[16] | 43889F35 | W[17] | 2518610C | W[18] | 324194B4 | W[19] | 7D1F0B59 | | W[20] | 7FD849C6 | W[21] | 56AF5161 | W[22] | DEA13533 | W[23] | 681F3D0E | | W[24] | 54BEB38E | W[25] | 2ED01F0C | W[26] | EF1B0EA0 | W[27] | 17E99916 | | W[28] | 3A99ECC0 | W[29] | 6E0121BF | W[30] | 252DB036 | W[31] | BD4099FE | | W[32] | 4C96CE8B | W[33] | B82E3003 | W[34] | DBFB962E | W[35] | C379C193 | | W[36] | 3F589BDB | W[37] | 83454DF0 | W[38] | 1640A162 | W[39] | F63C1D06 | | W[40] | BCFFD241 | W[41] | 03B299BF | W[42] | 9A0C7628 | W[43] | FB9E8C54 | | W[44] | 902C37FF | W[45] | 9D92BC1F | W[46] | 0F5182F5 | W[47] | F39B59DF | | W[48] | EE998251 | W[49] | D5EFB346 | W[50] | 133850CA | W[51] | FE28AF6D | | W[52] | 0E88C0FA | W[53] | 472A112D | W[54] | AE6B63FA | W[55] | 5D537B78 | | W[56] | 8A2A0851 | W[57] | FF26D933 | W[58] | 2393F229 | W[59] | CA56C36A | | W[60] | 525B24FF | W[61] | 9B3F8CD2 | W[62] | 56D02E54 | W[63] | E1628F3C | | W[64] | C3061B6B | W[65] | 3142FDAD | W[66] | B422DEA8 | W[67] | 430B221B |
步骤3: 生成W'[0-63]
扩展公式:
W'[j] = W[j] ⊕ W[j+4]
生成的W’0-63:
| 索引 | 值 | 索引 | 值 | 索引 | 值 | 索引 | 值 | | — | — | — | — | — | — | — | — | | W'[0] | E588A9E5 | W'[1] | 8883E4BF | W'[2] | A1E5AE89 | W'[3] | 80000000 | | W'[4] | 00000000 | W'[5] | 00000000 | W'[6] | 00000000 | W'[7] | 00000000 | | W'[8] | 00000000 | W'[9] | 00000000 | W'[10] | 00000000 | W'[11] | 00000060 | | W'[12] | 43889F35 | W'[13] | 2518610C | W'[14] | 324194B4 | W'[15] | 7D1F0B39 | | W'[16] | 3C50D6F3 | W'[17] | 73B7306D | W'[18] | ECE0A187 | W'[19] | 15003657 | | W'[20] | 2B66FA48 | W'[21] | 787F4E6D | W'[22] | 31BA3B93 | W'[23] | 7FF6A418 | | W'[24] | 6E275F4E | W'[25] | 40D13EB3 | W'[26] | CA36BE96 | W'[27] | AAA900E8 | | W'[28] | 760F224B | W'[29] | D62F11BC | W'[30] | FED62618 | W'[31] | 7E39586D | | W'[32] | 73CE5550 | W'[33] | 3B6B7DF3 | W'[34] | CDBB374C | W'[35] | 3545DC95 | | W'[36] | 83A7499A | W'[37] | 80F7D44F | W'[38] | 8C4CD74A | W'[39] | 0DA29152 | | W'[40] | 2CD3E5BE | W'[41] | 9E2025A0 | W'[42] | 955DF4DD | W'[43] | 0805D58B | | W'[44] | 7EB5B5AE | W'[45] | 487D0F59 | W'[46] | 1C69D23F | W'[47] | 0DB3F6B2 | | W'[48] | E01142AB | W'[49] | 92C5A26B | W'[50] | BD533330 | W'[51] | A37BD415 | | W'[52] | 84A2C8AB | W'[53] | B80CC81E | W'[54] | 8DF891D3 | W'[55] | 9705B812 | | W'[56] | D8712CAE | W'[57] | 641955E1 | W'[58] | 7543DC7D | W'[59] | 2B344C56 | | W'[60] | 915D3F94 | W'[61] | AA7D717F | W'[62] | E2F2F0FC | W'[63] | A269AD27 |
压缩函数
输入 Vi (256位初始值)
| 索引 | 值 | | — | — | | V[0] | 7380166F | | V[1] | 4914B2B9 | | V[2] | 172442D7 | | V[3] | DA8A0600 | | V[4] | A96F30BC | | V[5] | 163138AA | | V[6] | E38DEE4D | | V[7] | B0FB0E4E |
初始化工作变量
| 变量 | 值 | 来源 | | — | — | — | | A | 7380166F | V[0] | | B | 4914B2B9 | V[1] | | C | 172442D7 | V[2] | | D | DA8A0600 | V[3] | | E | A96F30BC | V[4] | | F | 163138AA | V[5] | | G | E38DEE4D | V[6] | | H | B0FB0E4E | V[7] |
迭代压缩公式
SS1 = ROTL(ROTL(A,12) + E + ROTL(Tj,j mod 32), 7)
SS2 = SS1 ⊕ ROTL(A,12)
TT1 = FFj(A,B,C,j) + D + SS2 + W'[j]
TT2 = GGj(E,F,G,j) + H + SS1 + W[j]
新A = TT1
新B = A
新C = ROTL(B,9)
新D = C
新E = P0(TT2)
新F = E
新G = ROTL(F,19)
新H = G
第0轮迭代
计算SS1:
Tj = 79CC4519 (j<16)
ROTL(A,12) = ROTL(7380166f,12) = 0166F738
ROTL(Tj,j mod 32) = ROTL(79cc4519,0) = 79CC4519
SS1 = ROTL(0166f738 + a96f30bc + 79cc4519, 7)
= ROTL(24a26d0d, 7)
= 51368692
计算SS2:
SS2 = SS1 ⊕ ROTL(A,12) = 51368692 ⊕ 0166f738 = 505071AA
计算TT1:
FFj(A,B,C,0) = A⊕B⊕C = 7380166f ⊕ 4914b2b9 ⊕ 172442d7 = 2DB0E601
TT1 = FFj + D + SS2 + W'[0]
= 2db0e601 + da8a0600 + 505071aa + e588a9e5
= 3E140790
计算TT2:
GGj(E,F,G,0) = E⊕F⊕G = a96f30bc ⊕ 163138aa ⊕ e38dee4d = 5CD3E65B
TT2 = GGj + H + SS1 + W[0]
= 5cd3e65b + b0fb0e4e + 51368692 + e588a9e5
= 448E2520
计算P0(TT2):
P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
= 448e2520 ⊕ 1c4a4089 ⊕ 4a40891c
= 1284ECB5
更新工作变量:
新A = TT1 = 3E140790
新B = 旧A = 7380166F
新C = ROTL(旧B,9) = ROTL(4914b2b9,9) = 29657292
新D = 旧C = 172442D7
新E = P0(TT2) = 1284ECB5
新F = 旧E = A96F30BC
新G = ROTL(旧F,19) = ROTL(163138aa,19) = C550B189
新H = 旧G = E38DEE4D
第1轮迭代
计算SS1:
Tj = 79CC4519 (j<16)
ROTL(A,12) = ROTL(3e140790,12) = 407903E1
ROTL(Tj,j mod 32) = ROTL(79cc4519,1) = F3988A32
SS1 = ROTL(407903e1 + 1284ecb5 + f3988a32, 7)
= ROTL(46967ac8, 7)
= 4B3D6423
计算SS2:
SS2 = SS1 ⊕ ROTL(A,12) = 4b3d6423 ⊕ 407903e1 = 0B4467C2
计算TT1:
FFj(A,B,C,1) = A⊕B⊕C = 3e140790 ⊕ 7380166f ⊕ 29657292 = 64F1636D
TT1 = FFj + D + SS2 + W'[1]
= 64f1636d + 172442d7 + 0b4467c2 + 8883e4bf
= 0FDDF2C5
计算TT2:
GGj(E,F,G,1) = E⊕F⊕G = 1284ecb5 ⊕ a96f30bc ⊕ c550b189 = 7EBB6D80
TT2 = GGj + H + SS1 + W[1]
= 7ebb6d80 + e38dee4d + 4b3d6423 + 8883e4bf
= 360AA4AF
计算P0(TT2):
P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
= 360aa4af ⊕ 15495e6c ⊕ 495e6c15
= 6A1D96D6
更新工作变量:
新A = TT1 = 0FDDF2C5
新B = 旧A = 3E140790
新C = ROTL(旧B,9) = ROTL(7380166f,9) = 002CDEE7
新D = 旧C = 29657292
新E = P0(TT2) = 6A1D96D6
新F = 旧E = 1284ECB5
新G = ROTL(旧F,19) = ROTL(a96f30bc,19) = 85E54B79
新H = 旧G = C550B189
第2轮迭代
计算SS1:
Tj = 79CC4519 (j<16)
ROTL(A,12) = ROTL(0fddf2c5,12) = DF2C50FD
ROTL(Tj,j mod 32) = ROTL(79cc4519,2) = E7311465
SS1 = ROTL(df2c50fd + 6a1d96d6 + e7311465, 7)
= ROTL(307afc38, 7)
= 3D7E1C18
计算SS2:
SS2 = SS1 ⊕ ROTL(A,12) = 3d7e1c18 ⊕ df2c50fd = E2524CE5
计算TT1:
FFj(A,B,C,2) = A⊕B⊕C = 0fddf2c5 ⊕ 3e140790 ⊕ 002cdee7 = 31E52BB2
TT1 = FFj + D + SS2 + W'[2]
= 31e52bb2 + 29657292 + e2524ce5 + a1e5ae89
= DF8299B2
计算TT2:
GGj(E,F,G,2) = E⊕F⊕G = 6a1d96d6 ⊕ 1284ecb5 ⊕ 85e54b79 = FD7C311A
TT2 = GGj + H + SS1 + W[2]
= fd7c311a + c550b189 + 3d7e1c18 + a1e5ae89
= A230AD44
计算P0(TT2):
P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
= a230ad44 ⊕ 615a8944 ⊕ 5a894461
= 99E36061
更新工作变量:
新A = TT1 = DF8299B2
新B = 旧A = 0FDDF2C5
新C = ROTL(旧B,9) = ROTL(3e140790,9) = 280F207C
新D = 旧C = 002CDEE7
新E = P0(TT2) = 99E36061
新F = 旧E = 6A1D96D6
新G = ROTL(旧F,19) = ROTL(1284ecb5,19) = 65A89427
新H = 旧G = 85E54B79
第3轮迭代
计算SS1:
Tj = 79CC4519 (j<16)
ROTL(A,12) = ROTL(df8299b2,12) = 299B2DF8
ROTL(Tj,j mod 32) = ROTL(79cc4519,3) = CE6228CB
SS1 = ROTL(299b2df8 + 99e36061 + ce6228cb, 7)
= ROTL(91e0b724, 7)
= F05B9248
计算SS2:
SS2 = SS1 ⊕ ROTL(A,12) = f05b9248 ⊕ 299b2df8 = D9C0BFB0
计算TT1:
FFj(A,B,C,3) = A⊕B⊕C = df8299b2 ⊕ 0fddf2c5 ⊕ 280f207c = F8504B0B
TT1 = FFj + D + SS2 + W'[3]
= f8504b0b + 002cdee7 + d9c0bfb0 + 80000000
= 523DE9A2
计算TT2:
GGj(E,F,G,3) = E⊕F⊕G = 99e36061 ⊕ 6a1d96d6 ⊕ 65a89427 = 96566290
TT2 = GGj + H + SS1 + W[3]
= 96566290 + 85e54b79 + f05b9248 + 80000000
= 8C974051
计算P0(TT2):
P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
= 8c974051 ⊕ 2e80a319 ⊕ 80a3192e
= 22B4FA66
更新工作变量:
新A = TT1 = 523DE9A2
新B = 旧A = DF8299B2
新C = ROTL(旧B,9) = ROTL(0fddf2c5,9) = BBE58A1F
新D = 旧C = 280F207C
新E = P0(TT2) = 22B4FA66
新F = 旧E = 99E36061
新G = ROTL(旧F,19) = ROTL(6a1d96d6,19) = B6B350EC
新H = 旧G = 65A89427
第4-59轮迭代
(中间轮次省略,计算过程类似)
第60轮迭代
计算SS1:
Tj = 7A879D8A (j≥16)
ROTL(A,12) = ROTL(3dcc399f,12) = C399F3DC
ROTL(Tj,j mod 32) = ROTL(7a879d8a,28) = A7A879D8
SS1 = ROTL(c399f3dc + 86c35aaa + a7a879d8, 7)
= ROTL(f205c85e, 7)
= 02E42F79
计算SS2:
SS2 = SS1 ⊕ ROTL(A,12) = 02e42f79 ⊕ c399f3dc = C17DDCA5
计算TT1:
FFj(A,B,C,60) = (A∧B)∨(A∧C)∨(B∧C) = 2F4A395F
TT1 = FFj + D + SS2 + W'[60]
= 2f4a395f + 54dd0692 + c17ddca5 + 915d3f94
= D7025C2A
计算TT2:
GGj(E,F,G,60) = (E∧F)∨(¬E∧G) = 691DA96B
TT2 = GGj + H + SS1 + W[60]
= 691da96b + 517f53e7 + 02e42f79 + 525b24ff
= 0FDC51CA
计算P0(TT2):
P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
= 0fdc51ca ⊕ b8a3941f ⊕ a3941fb8
= 14EBDA6D
更新工作变量:
新A = TT1 = D7025C2A
新B = 旧A = 3DCC399F
新C = ROTL(旧B,9) = ROTL(a76b785f,9) = D6F0BF4E
新D = 旧C = 0E522D7F
新E = P0(TT2) = 14EBDA6D
新F = 旧E = 86C35AAA
新G = ROTL(旧F,19) = ROTL(1031a97f,19) = 4BF8818D
新H = 旧G = 699DB3C3
第61轮迭代
计算SS1:
Tj = 7A879D8A (j≥16)
ROTL(A,12) = ROTL(d7025c2a,12) = 25C2AD70
ROTL(Tj,j mod 32) = ROTL(7a879d8a,29) = 4F50F3B1
SS1 = ROTL(25c2ad70 + 14ebda6d + 4f50f3b1, 7)
= ROTL(89ff7b8e, 7)
= FFBDC744
计算SS2:
SS2 = SS1 ⊕ ROTL(A,12) = ffbdc744 ⊕ 25c2ad70 = DA7F6A34
计算TT1:
FFj(A,B,C,61) = (A∧B)∨(A∧C)∨(B∧C) = D7C03D0E
TT1 = FFj + D + SS2 + W'[61]
= d7c03d0e + 0e522d7f + da7f6a34 + aa7d717f
= 6B0F4640
计算TT2:
GGj(E,F,G,61) = (E∧F)∨(¬E∧G) = 4FD35BA8
TT2 = GGj + H + SS1 + W[61]
= 4fd35ba8 + 699db3c3 + ffbdc744 + 9b3f8cd2
= 546E6381
计算P0(TT2):
P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
= 546e6381 ⊕ dcc702a8 ⊕ c702a8dc
= 4FABC9F5
更新工作变量:
新A = TT1 = 6B0F4640
新B = 旧A = D7025C2A
新C = ROTL(旧B,9) = ROTL(3dcc399f,9) = 98733E7B
新D = 旧C = D6F0BF4E
新E = P0(TT2) = 4FABC9F5
新F = 旧E = 14EBDA6D
新G = ROTL(旧F,19) = ROTL(86c35aaa,19) = D554361A
新H = 旧G = 4BF8818D
第62轮迭代
计算SS1:
Tj = 7A879D8A (j≥16)
ROTL(A,12) = ROTL(6b0f4640,12) = F46406B0
ROTL(Tj,j mod 32) = ROTL(7a879d8a,30) = 9EA1E762
SS1 = ROTL(f46406b0 + 4fabc9f5 + 9ea1e762, 7)
= ROTL(e2b1b807, 7)
= 58DC03F1
计算SS2:
SS2 = SS1 ⊕ ROTL(A,12) = 58dc03f1 ⊕ f46406b0 = ACB80541
计算TT1:
FFj(A,B,C,62) = (A∧B)∨(A∧C)∨(B∧C) = DB035E6A
TT1 = FFj + D + SS2 + W'[62]
= db035e6a + d6f0bf4e + acb80541 + e2f2f0fc
= 419F13F5
计算TT2:
GGj(E,F,G,62) = (E∧F)∨(¬E∧G) = 94FFFE6F
TT2 = GGj + H + SS1 + W[62]
= 94fffe6f + 4bf8818d + 58dc03f1 + 56d02e54
= 90A4B241
计算P0(TT2):
P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
= 90a4b241 ⊕ 49648321 ⊕ 64832149
= BD431029
更新工作变量:
新A = TT1 = 419F13F5
新B = 旧A = 6B0F4640
新C = ROTL(旧B,9) = ROTL(d7025c2a,9) = 04B855AE
新D = 旧C = 98733E7B
新E = P0(TT2) = BD431029
新F = 旧E = 4FABC9F5
新G = ROTL(旧F,19) = ROTL(14ebda6d,19) = D368A75E
新H = 旧G = D554361A
第63轮迭代
计算SS1:
Tj = 7A879D8A (j≥16)
ROTL(A,12) = ROTL(419f13f5,12) = F13F5419
ROTL(Tj,j mod 32) = ROTL(7a879d8a,31) = 3D43CEC5
SS1 = ROTL(f13f5419 + bd431029 + 3d43cec5, 7)
= ROTL(ebc63307, 7)
= E31983F5
计算SS2:
SS2 = SS1 ⊕ ROTL(A,12) = e31983f5 ⊕ f13f5419 = 1226D7EC
计算TT1:
FFj(A,B,C,63) = (A∧B)∨(A∧C)∨(B∧C) = 419F57E4
TT1 = FFj + D + SS2 + W'[63]
= 419f57e4 + 98733e7b + 1226d7ec + a269ad27
= 8EA31B72
计算TT2:
GGj(E,F,G,63) = (E∧F)∨(¬E∧G) = 4F2BA777
TT2 = GGj + H + SS1 + W[63]
= 4f2ba777 + d554361a + e31983f5 + e1628f3c
= E8FBF0C2
计算P0(TT2):
P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
= e8fbf0c2 ⊕ f7e185d1 ⊕ e185d1f7
= FE9FA4E4
更新工作变量:
新A = TT1 = 8EA31B72
新B = 旧A = 419F13F5
新C = ROTL(旧B,9) = ROTL(6b0f4640,9) = 1E8C80D6
新D = 旧C = 04B855AE
新E = P0(TT2) = FE9FA4E4
新F = 旧E = BD431029
新G = ROTL(旧F,19) = ROTL(4fabc9f5,19) = 4FAA7D5E
新H = 旧G = D368A75E
64轮迭代完成
最终工作变量值:
| 变量 | 值 | | — | — | | A | 8EA31B72 | | B | 419F13F5 | | C | 1E8C80D6 | | D | 04B855AE | | E | FE9FA4E4 | | F | BD431029 | | G | 4FAA7D5E | | H | D368A75E |
输出 Vi+1 = Vi ⊕ (A,B,C,D,E,F,G,H):
| 索引 | 计算 | 结果 | | — | — | — | | V[0] | 7380166f ⊕ 8ea31b72 | FD230D1D | | V[1] | 4914b2b9 ⊕ 419f13f5 | 088BA14C | | V[2] | 172442d7 ⊕ 1e8c80d6 | 09A8C201 | | V[3] | da8a0600 ⊕ 04b855ae | DE3253AE | | V[4] | a96f30bc ⊕ fe9fa4e4 | 57F09458 | | V[5] | 163138aa ⊕ bd431029 | AB722883 | | V[6] | e38dee4d ⊕ 4faa7d5e | AC279313 | | V[7] | b0fb0e4e ⊕ d368a75e | 6393A910 |
第三步: 输出杂凑值
最终杂凑值 (256位)
FD230D1D088BA14C09A8C201DE3253AE57F09458AB722883AC2793136393A910
分组显示
| 索引 | 值 | | — | — | | V[0] | FD230D1D | | V[1] | 088BA14C | | V[2] | 09A8C201 | | V[3] | DE3253AE | | V[4] | 57F09458 | | V[5] | AB722883 | | V[6] | AC279313 | | V[7] | 6393A910 |
杂凑值格式化
标准格式 (64个十六进制字符):
FD230D1D 088BA14C 09A8C201 DE3253AE
57F09458 AB722883 AC279313 6393A910
连续格式:
FD230D1D088BA14C09A8C201DE3253AE57F09458AB722883AC2793136393A910
附录: SM3算法关键参数
常量Tj
| 轮次范围 | Tj值 | 二进制表示 | | — | — | — | | 0 ≤ j < 16 | 0x79CC4519 | 01111001110011000101000110011001 | | 16 ≤ j < 64 | 0x7A879D8A | 01111010100001111001110110001010 |
布尔函数
FFj(X, Y, Z, j):
| 轮次范围 | 公式 | 说明 |
| — | — | — |
| 0 ≤ j < 16 | X ⊕ Y ⊕ Z | 异或运算 |
| 16 ≤ j < 64 | (X ∧ Y) ∨ (X ∧ Z) ∨ (Y ∧ Z) | 多数函数 |
GGj(X, Y, Z, j):
| 轮次范围 | 公式 | 说明 |
| — | — | — |
| 0 ≤ j < 16 | X ⊕ Y ⊕ Z | 异或运算 |
| 16 ≤ j < 64 | (X ∧ Y) ∨ (¬X ∧ Z) | 选择函数 |
置换函数
P0(X):
P0(X) = X ⊕ ROTL(X, 9) ⊕ ROTL(X, 17)
用于压缩函数中计算新E值。
P1(X):
P1(X) = X ⊕ ROTL(X, 15) ⊕ ROTL(X, 23)
用于消息扩展中生成W[16-67]。
循环左移函数
ROTL(X, n) = (X << n) | (X >> (32 - n))
将32位字X循环左移n位。
计算完成
文档生成时间: 2026年 算法实现: 基于GB/T 32905-2016标准 验证状态: ✓ 通过
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:利刃信安 利刃信安 利刃信安《【商密测评】SM3密码杂凑算法完整计算过程》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论