SM3是一种广泛使用在中国国家标准中的哈希算法,全称为“中国国家暗码算法SM3”。它由中国国家暗码管理局订定,重要用于数字署名和消息完备性验证。SM3算法与SHA-256在结构上类似,但其计划具有特定的改进以增强安全性。
SM3算法生成256位的哈希值,使用了32轮的迭代运算,而且依赖于消息扩展、压缩函数、消息肴杂等步骤。
1、SM3算法重要步骤
- 消息填充:起首对输入的消息举行填充,使其长度变为512的倍数。填充方法是在消息末尾添加一个’1’位,然后添加一定命量的’0’位,最后再添加64位的消息长度。
- 消息扩展:将填充后的消息分为512位的块,然后举行消息扩展,将每个512位的消息块扩展为132个32位的字。
- 压缩函数:将消息块与初始的IV(Initial Vector,初始向量)通过非线性变换举行压缩,32轮迭代,每轮使用扩展后的消息字和常量举行肴杂运算。
- 迭代运算:将压缩后的结果与前一个结果相加,作为下一次压缩的输入,直到全部消息块都处置处罚完毕。
- 输出哈希值:最后得到的256位数据即为SM3的哈希值。
2、数据示例
假设输入消息为 “abc”。在SM3算法中,这将被转化为字节形式举行处置处罚:b"abc"。
2.1步骤 1: 消息填充
SM3算法的第一步是对消息举行填充,使其长度变为512的倍数。
2.1.1 原始消息:
- “abc” 在ASCII中的十六进制表现为:0x61 0x62 0x63,即 b"abc"。
- 长度为3字节,大概24位(二进制)。
2.1.2 附加 ‘1’ 位:
- 在消息末尾添加一个’1’位:0x61 0x62 0x63 0x80,即 b"abc\x80"。
2.1.3 填充 ‘0’ 位:
- 为了使填充后的长度为448位(512位-64位,数据长度必要用64位的),我们必要在’1’位后填充448 - 24 - 8 = 416位的0。
- 填充后的消息为:0x61 0x62 0x63 0x80 加上 52 (64字节-8字节-3字节-1字节)个 0x00,即 b"abc\x80" + b’\x00’*52。
2.1.4 附加消息长度:
- 将原始消息的长度(24位)用64位二进制表现,并附加到消息末尾:0x0000000000000018(64位表现的十六进制)。
- 最终填充后的消息为:```
b"abc\x80" + b’\x00’*52 + b’\x00\x00\x00\x00\x00\x00\x00\x18
0x61 0x62 0x63 0x80 00 00 00 00 00 00 00 00 00 00 00 00 …
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18
2.2 步骤 2: 消息扩展
将填充后的消息块扩展为132个32位字(W[0]到W[67]和W’[0]到W’[63]),以便举行后续的压缩计算。
2.2.1 分块:
- 每个512位的消息块被分成16个32位的字(W[0]到W[15])。
- 对于"abc",原始消息块为:```
W[0] = 0x61626380
W[1] = 0x00000000
W[2] = 0x00000000
…
W[15] = 0x00000018
2.2.2 消息扩展:
- 扩展为68个字(W[16]-W[67]):```
W[j] = P1(W[j-16] ^ W[j-9] ^ ROTL(W[j-3], 15)) ^ ROTL(W[j-13], 7) ^ W[j-6]
- 比方:```
W[16] = P1(W[0] ^ W[7] ^ ROTL(W[13], 15)) ^ ROTL(W[3], 7) ^ W[10]
2.2.3 计算W’:
W’共64个字,和W合起来共132个字
- 根据W[j]生成W’[j]:```
W’[j] = W[j] ^ W[j+4]
2.3 步骤 3: 压缩函数
目标:将扩展后的消息块与初始向量(IV)通过32轮迭代压缩,生成新的哈希值。
2.3.1 初始化寄存器:
- 使用8个初始向量IV初始化寄存器(A到H):```
A = 0x7380166F, B = 0x4914B2B9, C = 0x172442D7, D = 0xDA8A0600,
E = 0xA96F30BC, F = 0x163138AA, G = 0xE38DEE4D, H = 0xB0FB0E4E
2.3.1 32轮迭代计算:
- 每轮使用FF、GG、P0、P1等函数,以及常量T[j],更新寄存器的值。
- 比方,第1轮的计算:
- SS1 = ROTL(ROTL(A, 12) + E + ROTL(T[0], 0), 7)
- SS2 = SS1 ^ ROTL(A, 12)
- TT1 = FF(A, B, C, j) + D + SS2 + W'[j]
- TT2 = GG(E, F, G, j) + H + SS1 + W[j]
复制代码 - 更新寄存器的值:
- A = TT1, B = A, C = ROTL(B, 9), D = C, ...
复制代码 2.3.2 压缩结果:
- 每一轮的结果与前一轮的结果相加,作为下一轮的输入。处置处罚完全部消息块后,将最终结果作为哈希值。
2.4 步骤4:输出哈希值
目标:将最终压缩后的256位寄存器值作为SM3的哈希值输出。
2.4.1组合寄存器值:
- 将最终的寄存器A到H的值毗连起来,形成一个256位(64个十六进制字符)的哈希值。
- 对于消息 “abc”,最终输出的哈希值为:
- 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
复制代码 3、python实现
- import struct
- def left_rotate(n, b):
- """左旋转 n by b bits。"""
- return ((n << b)
复制代码 最后
从期间发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同砚们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,本领越强机会才越多。
因为入门学习阶段知识点比较杂,以是我讲得比较笼统,各人如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,必要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。
干货重要有:
①1000+CTF历届题库(主流和经典的应该都有了)
②CTF技术文档(最全中文版)
③项目源码(四五十个风趣且经典的练手项目及源码)
④ CTF大赛、web安全、渗出测试方面的视频(适合小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ CTF/渗出测试工具镜像文件大全
⑦ 2023暗码学/隐身术/PWN技术手册大全
如果你对网络安全入门感爱好,那么你必要的话可以点击这里 |