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

打印 上一主题 下一主题

主题 806|帖子 806|积分 2428

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轮的计算:
    1. SS1 = ROTL(ROTL(A, 12) + E + ROTL(T[0], 0), 7)
    2. SS2 = SS1 ^ ROTL(A, 12)
    3. TT1 = FF(A, B, C, j) + D + SS2 + W'[j]
    4. TT2 = GG(E, F, G, j) + H + SS1 + W[j]
    复制代码
  • 更新寄存器的值:
    1. 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”,最终输出的哈希值为:
    1. 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
    复制代码
3、python实现

  1. import struct
  2. def left_rotate(n, b):
  3.     """左旋转 n by b bits。"""
  4.     return ((n << b)
复制代码
最后

从期间发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同砚们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,本领越强机会才越多。
因为入门学习阶段知识点比较杂,以是我讲得比较笼统,各人如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,必要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。
干货重要有:
①1000+CTF历届题库(主流和经典的应该都有了)
②CTF技术文档(最全中文版)
③项目源码(四五十个风趣且经典的练手项目及源码)
④ CTF大赛、web安全、渗出测试方面的视频(适合小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ CTF/渗出测试工具镜像文件大全
⑦ 2023暗码学/隐身术/PWN技术手册大全
如果你对网络安全入门感爱好,那么你必要的话可以点击这里

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表