【商密测评】SM3密码杂凑算法完整计算过程

admin 2026-03-27 13:34:56 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细解析了商密算法SM3的完整计算过程,以字符串利刃信安为例,展示了从消息填充、迭代压缩到消息扩展的核心步骤,并给出了各阶段的中间值和最终结果。 综合评分: 85 文章分类: 技术标准,解决方案,数据安全,应用安全,网络安全


cover_image

【商密测评】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′: 在消息末尾添加一个比特’1′
  2. 2. 添加k个’0′: 添加k个’0’比特,使得 (l+1+k) mod 512 = 448
  3. 3. 添加长度: 添加64位二进制表示的消息长度l(大端序)
  4. 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)
&nbsp; &nbsp; = ROTL(24a26d0d, 7)
&nbsp; &nbsp; = 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]
&nbsp; &nbsp; = 2db0e601 + da8a0600 + 505071aa + e588a9e5
&nbsp; &nbsp; = 3E140790

计算TT2:

GGj(E,F,G,0) = E⊕F⊕G = a96f30bc ⊕ 163138aa ⊕ e38dee4d = 5CD3E65B
TT2 = GGj + H + SS1 + W[0]
&nbsp; &nbsp; = 5cd3e65b + b0fb0e4e + 51368692 + e588a9e5
&nbsp; &nbsp; = 448E2520

计算P0(TT2):

P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
&nbsp; &nbsp; &nbsp; &nbsp; = 448e2520 ⊕ 1c4a4089 ⊕ 4a40891c
&nbsp; &nbsp; &nbsp; &nbsp; = 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)
&nbsp; &nbsp; = ROTL(46967ac8, 7)
&nbsp; &nbsp; = 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]
&nbsp; &nbsp; = 64f1636d + 172442d7 + 0b4467c2 + 8883e4bf
&nbsp; &nbsp; = 0FDDF2C5

计算TT2:

GGj(E,F,G,1) = E⊕F⊕G = 1284ecb5 ⊕ a96f30bc ⊕ c550b189 = 7EBB6D80
TT2 = GGj + H + SS1 + W[1]
&nbsp; &nbsp; = 7ebb6d80 + e38dee4d + 4b3d6423 + 8883e4bf
&nbsp; &nbsp; = 360AA4AF

计算P0(TT2):

P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
&nbsp; &nbsp; &nbsp; &nbsp; = 360aa4af ⊕ 15495e6c ⊕ 495e6c15
&nbsp; &nbsp; &nbsp; &nbsp; = 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)
&nbsp; &nbsp; = ROTL(307afc38, 7)
&nbsp; &nbsp; = 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]
&nbsp; &nbsp; = 31e52bb2 + 29657292 + e2524ce5 + a1e5ae89
&nbsp; &nbsp; = DF8299B2

计算TT2:

GGj(E,F,G,2) = E⊕F⊕G = 6a1d96d6 ⊕ 1284ecb5 ⊕ 85e54b79 = FD7C311A
TT2 = GGj + H + SS1 + W[2]
&nbsp; &nbsp; = fd7c311a + c550b189 + 3d7e1c18 + a1e5ae89
&nbsp; &nbsp; = A230AD44

计算P0(TT2):

P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
&nbsp; &nbsp; &nbsp; &nbsp; = a230ad44 ⊕ 615a8944 ⊕ 5a894461
&nbsp; &nbsp; &nbsp; &nbsp; = 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)
&nbsp; &nbsp; = ROTL(91e0b724, 7)
&nbsp; &nbsp; = 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]
&nbsp; &nbsp; = f8504b0b + 002cdee7 + d9c0bfb0 + 80000000
&nbsp; &nbsp; = 523DE9A2

计算TT2:

GGj(E,F,G,3) = E⊕F⊕G = 99e36061 ⊕ 6a1d96d6 ⊕ 65a89427 = 96566290
TT2 = GGj + H + SS1 + W[3]
&nbsp; &nbsp; = 96566290 + 85e54b79 + f05b9248 + 80000000
&nbsp; &nbsp; = 8C974051

计算P0(TT2):

P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
&nbsp; &nbsp; &nbsp; &nbsp; = 8c974051 ⊕ 2e80a319 ⊕ 80a3192e
&nbsp; &nbsp; &nbsp; &nbsp; = 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)
&nbsp; &nbsp; = ROTL(f205c85e, 7)
&nbsp; &nbsp; = 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]
&nbsp; &nbsp; = 2f4a395f + 54dd0692 + c17ddca5 + 915d3f94
&nbsp; &nbsp; = D7025C2A

计算TT2:

GGj(E,F,G,60) = (E∧F)∨(¬E∧G) = 691DA96B
TT2 = GGj + H + SS1 + W[60]
&nbsp; &nbsp; = 691da96b + 517f53e7 + 02e42f79 + 525b24ff
&nbsp; &nbsp; = 0FDC51CA

计算P0(TT2):

P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
&nbsp; &nbsp; &nbsp; &nbsp; = 0fdc51ca ⊕ b8a3941f ⊕ a3941fb8
&nbsp; &nbsp; &nbsp; &nbsp; = 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)
&nbsp; &nbsp; = ROTL(89ff7b8e, 7)
&nbsp; &nbsp; = 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]
&nbsp; &nbsp; = d7c03d0e + 0e522d7f + da7f6a34 + aa7d717f
&nbsp; &nbsp; = 6B0F4640

计算TT2:

GGj(E,F,G,61) = (E∧F)∨(¬E∧G) = 4FD35BA8
TT2 = GGj + H + SS1 + W[61]
&nbsp; &nbsp; = 4fd35ba8 + 699db3c3 + ffbdc744 + 9b3f8cd2
&nbsp; &nbsp; = 546E6381

计算P0(TT2):

P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
&nbsp; &nbsp; &nbsp; &nbsp; = 546e6381 ⊕ dcc702a8 ⊕ c702a8dc
&nbsp; &nbsp; &nbsp; &nbsp; = 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)
&nbsp; &nbsp; = ROTL(e2b1b807, 7)
&nbsp; &nbsp; = 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]
&nbsp; &nbsp; = db035e6a + d6f0bf4e + acb80541 + e2f2f0fc
&nbsp; &nbsp; = 419F13F5

计算TT2:

GGj(E,F,G,62) = (E∧F)∨(¬E∧G) = 94FFFE6F
TT2 = GGj + H + SS1 + W[62]
&nbsp; &nbsp; = 94fffe6f + 4bf8818d + 58dc03f1 + 56d02e54
&nbsp; &nbsp; = 90A4B241

计算P0(TT2):

P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
&nbsp; &nbsp; &nbsp; &nbsp; = 90a4b241 ⊕ 49648321 ⊕ 64832149
&nbsp; &nbsp; &nbsp; &nbsp; = 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)
&nbsp; &nbsp; = ROTL(ebc63307, 7)
&nbsp; &nbsp; = 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]
&nbsp; &nbsp; = 419f57e4 + 98733e7b + 1226d7ec + a269ad27
&nbsp; &nbsp; = 8EA31B72

计算TT2:

GGj(E,F,G,63) = (E∧F)∨(¬E∧G) = 4F2BA777
TT2 = GGj + H + SS1 + W[63]
&nbsp; &nbsp; = 4f2ba777 + d554361a + e31983f5 + e1628f3c
&nbsp; &nbsp; = E8FBF0C2

计算P0(TT2):

P0(TT2) = TT2 ⊕ ROTL(TT2,9) ⊕ ROTL(TT2,17)
&nbsp; &nbsp; &nbsp; &nbsp; = e8fbf0c2 ⊕ f7e185d1 ⊕ e185d1f7
&nbsp; &nbsp; &nbsp; &nbsp; = 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密码杂凑算法完整计算过程》

分享一些取证书籍 网络安全文章

分享一些取证书籍

文章总结: 本文分享了一些网络安全相关的学习资料和课程,包括免杀、逆向、CVE漏洞POC、挖洞技巧等,并通过公众号回复特定数字的方式提供获取链接。 综合评分:
评论:0   参与:  0