zoukankan      html  css  js  c++  java
  • 国密杂凑算法SM3

    0. 引言

    SM3杂凑算法是中国国家密码局公布的hash算法商用标准,能应用于数字签名与验证、消息认证码的生成以及伪随机数的生成。

    1. 常数与函数

    1.1 初始值

    IV = 7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e

    1.2 常量

    Tj={ 79cc4519    0≤j≤15;7a879d8a    16≤j≤63}

    1.3 布尔函数

    FFj(X,Y,Z)={X^Y^Z  0≤j≤15;(X & Y)|(X&Z)|(Y&Z) 16≤j≤63}

    GGj(X,Y,Z)={X^Y^Z  0≤j≤15;(X & Y)|(~X&Z)16≤j≤63}

    X,Y,Z为字(32bit)

    1.4 置换函数

    P0(X)= X^(X<<<9)^(X<<<17)

    P1(X)= X^(X<<<15)^(X<<<23)

    X 为字

    2. 算法简介

    SM3算法能够对长度为l(l<2^64)bit的消息m,进行填充和迭代压缩,生成杂凑值,最终的杂凑值为256bit。

    2.1 填充过程

    设消息m的长度为l bit,首先将bit"1"添加到消息末尾,再加k个“0”,k是满足l+1+k =448 mod 512的最小非负整数。然后再添加一个64bit串,该串是l的二进制表示,填充后的消息m'长度为512的整数倍。

    2.2 迭代压缩

    迭代过程:

    m'按照512bit进行分组:m'=B(0)B(1)...B(n-1)

    n=(l+k+65)/512.

    迭代过程如下:

    FOR i=0 to n-1

      V(i+1) = CF(V(i),B(i)

    ENDFOR

    CF为压缩函数,V(0)为初始值IV,迭代压缩的结果为V(n)

    消息扩展:

    消息分组B(i)扩展生成132个字W0,W1,...W67,W0',W1'...W63'。

    a)消息分组B(i)划分为16个字W0,W1,...W15.

    b)FOR j=16 to 67

      Wj=P1(Wj-16 ^ Wj-9 ^ (Wj-3 <<<15)^(Wj-13<<<7)^Wj-6

       ENDFOR

    c)FOR j=0 to 63

      Wj'=Wj^Wj+4

       ENDFOR

    压缩函数:

    A/B/C/D/E/F/G/H为字寄存器,SS1/SS2/TT1/TT2为中间变量,压缩函数V(i+1) = CF(V(i),B(i))计算过程如下:

    ABCDEFGH = V(i)

    FOR j=0 to 63

      SS1 = ((A<<<12)+E+(Tj<<<j))<<<7

      SS2 = SS1^(A<<<12)

      TT1 = FFj(A,B,C)+D+SS2+Wj'

      TT2 = GGj(E,F,G)+H+SS1+Wj

      D = C

      C = B<<<9

      B = A

      A = TT1

      H = G

      G = F<<<19

      F = E

      E = P0(TT2)

    ENDFOR

    V(i+1) = ABCDEFGH^V(i)

    运算过程中,字按照大端格式存储。

    2.3 杂凑结果

    杂凑结果为256bit值y=ABCDEFGH=V(n)

  • 相关阅读:
    Python
    算法的时间复杂度和空间复杂度-总结
    列表自动滚动
    React 结合ant-mobile 省市区级联
    5G从小就梦想着自己要迎娶:高速率、低时延、大容量三个老婆
    一文读懂GaussDB(for Mongo)的计算存储分离架构
    cpu占用过高排查
    我是如何从零开始自学转行IT并进入世界500强实现薪资翻倍?
    Linux重定向用法详解
    说出来也许你不信,我被 Linux 终端嘲笑了……
  • 原文地址:https://www.cnblogs.com/lkiller/p/5107693.html
Copyright © 2011-2022 走看看