國密雜湊算法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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM