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

SM3是一种广泛使用在中国国家标准中的哈希算法,全称为“中国国家密码算法SM3”。它由中国国家密码管理局制定,主要用于数字签名和消息完整性验证。SM3算法与SHA-256在结构上类似,但其设计具有特定的改进以增强安全性。

SM3算法生成256位的哈希值,使用了32轮的迭代运算,并且依赖于消息扩展、压缩函数、消息混淆等步骤。

1、SM3算法主要步骤

  1. 消息填充:首先对输入的消息进行填充,使其长度变为512的倍数。填充方法是在消息末尾添加一个’1’位,然后添加一定数量的’0’位,最后再添加64位的消息长度。

  2. 消息扩展:将填充后的消息分为512位的块,然后进行消息扩展,将每个512位的消息块扩展为132个32位的字。

  3. 压缩函数:将消息块与初始的IV(Initial Vector,初始向量)通过非线性变换进行压缩,32轮迭代,每轮使用扩展后的消息字和常量进行混合运算。

  4. 迭代运算:将压缩后的结果与前一个结果相加,作为下一次压缩的输入,直到所有消息块都处理完毕。

  5. 输出哈希值:最后得到的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技术手册大全

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

扫码领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值