【SM3哈希算法】算法原理

03-01 1113阅读

【SM3哈希算法】算法原理

参考:

文章目录

  • 【SM3哈希算法】算法原理
    • 一、算法简介
    • 二、基本原理
    • 三、具体流程
      • 1、填充
      • 2、分组
      • 3、迭代压缩
      • C语言实现

        一、算法简介

        SM3算法是一种密码散列函数标准,由国家密码管理局发布。它的安全性和SHA-256相当,适用于商用密码应用中的数字签名和验证、消息认证码生成和验证、随机数生成等。

        二、基本原理

        将输入的消息分成512位的分组,并对每个分组进行填充、分组、扩展、迭代压缩等操作,最后输出256位的摘要值。这里给大家展示一个之前密码学课程设计,通过调用java已有的密码学库实现的SM3哈希值计算:

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TmZ2BVSN-1686183884493)(null)]

        输入:

        Hello World!

        输出:

        0AC0A9FEF0D212AA76A3C431F793853CE145659CA1D14B114E96C1215CF26582

        三、具体流程

        1、填充

        此处我们记输入的消息为m,假设m的长度为l比特,填充后得到的消息为m‘。因为我们输入的消息内容长度不是固定的,但是为了后续能够运算,需要将消息m填充为512倍数的消息m’。

        填充步骤:

        1. 先将1比特添加到消息的末尾

        2. 通过公式

          l + 1 + k ≡ 448 m o d 512 l + 1 + k ≡ 448 mod 512 l+1+k≡448mod512

          计算得出最小的非负整数k,然后再添加k个0

          补充:448=512-64,448是因为最后需要添加l的64比特长度二进制表示,详见下一步。

        3. 最后,再添加一个64位比特串,比特串的内容是m的长度 ‘l’ 的二进制表示

        Example:

        输入的消息	 m:01100001 01100010 01100011
        输入m的长度: l = 24
        计算出来的k: l+1+k≡24+1+423≡448 mod 512----->k=423
        

        填充后:

        【SM3哈希算法】算法原理

        2、分组

        分组这一步,就是简单的将上一步填充得到的消息m‘,由于填充后,m’的长度为512的倍数,因此分组只需将m‘分为512位长度的n (n=(l+k+64)/512) 个小组即可。(||表示拼接)

        m ’ = B ( 0 ) ∣ ∣ B ( 1 ) ∣ ∣ ⋅ ⋅ ⋅ ∣ ∣ B ( n − 1 ) m’ = B(0)||B(1)||···||B(n-1) m’=B(0)∣∣B(1)∣∣⋅⋅⋅∣∣B(n−1)

        3、迭代压缩

        针对每个分组的内容,进行n轮迭代运算,所得结果V(n)即为最终的哈希值。

        1. 迭代原理:

          for i=0 to n-1
          	v(i+1)=CF(V(i), B(i))
          endfor
          

          CF():压缩函数

          B(i):填充后的消息分组

          V(n):最终结果

          V(0):256比特的初始值IV,IV的初始值已提前规定

          V(0)=IV=7380166f 4914b2b9 172442d7
                  da8a0600 a96130bc 163138aa
                  E38dee4d b0fb0e4e
          
        2. 符号定义:

          在详细讲解压缩函数之前,需要先看一些参考文献中的符号:

          【SM3哈希算法】算法原理

          【SM3哈希算法】算法原理

          【SM3哈希算法】算法原理

          P 0 ( X ) = X ⊕ ( X

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]