泉缘泉 发表于 2024-12-2 13:07:53

安全基础学习-SM3加密算法_sm3算法

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到W和W’到W’),以便举行后续的压缩计算。
2.2.1 分块:



[*] 每个512位的消息块被分成16个32位的字(W到W)。
[*] 对于"abc",原始消息块为:```
W = 0x61626380
W = 0x00000000
W = 0x00000000

W = 0x00000018
2.2.2 消息扩展:



[*] 扩展为68个字(W-W):```
W = P1(W ^ W ^ ROTL(W, 15)) ^ ROTL(W, 7) ^ W
[*] 比方:```
W = P1(W ^ W ^ ROTL(W, 15)) ^ ROTL(W, 7) ^ W
2.2.3 计算W’:

W’共64个字,和W合起来共132个字


[*]根据W生成W’:```
W’ = W ^ W
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,更新寄存器的值。
[*] 比方,第1轮的计算:
SS1 = ROTL(ROTL(A, 12) + E + ROTL(T, 0), 7)
SS2 = SS1 ^ ROTL(A, 12)
TT1 = FF(A, B, C, j) + D + SS2 + W'
TT2 = GG(E, F, G, j) + H + SS1 + W



[*] 更新寄存器的值:
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技术手册大全
如果你对网络安全入门感爱好,那么你必要的话可以点击这里
页: [1]
查看完整版本: 安全基础学习-SM3加密算法_sm3算法