SHA與SM3算法簡介

一、SHA-224和SHA-256算法原理

協議標準:https://csrc.nist.gov/CSRC/media/Publications/fips/180/2/archive/2002-08-01/documents/fips180-2withchangenotice.pdf

算法處理分如下幾步:

 

 

消息填充
消息填充分爲兩部分:第一部分是附加填充比特,第二部分是附加長度,目的是讓整個消息滿足指定的結構,從而處理起來可以統一化、格式化。

附加填充比特:指在消息尾部進行填充,使報文長度在對512取模後的餘數爲448。具體操作是:先被1比特1,然後都被0,直到滿足對512取模餘448。需要注意的是:即使原始消息長度已經滿足對512取模餘448,補位也需要進行,這時地填充512比特。所以附加填充時至少補1位,最多補512位。

附加長度:將原始數據的長度信息補到已經進行了填充的消息後面。

消息分組
消息分組指將消息填充後的數據按512bit(16*32bit)進行分組,並擴充爲64*32bit,擴充算法如下:

當 0 ≤ t ≤ 15 時,W[t] = M[t],M[t]爲512bit原始數據中第t個32bit數據。

當 16 ≤ t ≤ 63時,W[t] = W[t-7] + (W[t-2] >>> 17) ⊕ (W[t-2] >>> 19) ⊕ (W[t-2] >> 10) + \

W[t-16] + (W[t-15] >>> 7) ⊕ (W[t-15] >>> 18) ⊕ (W[t-15] >> 3)

消息填充和消息分組處理圖示如下:

 

 

 

迭代運算
SHA-224/SHA-256算法對輸入的消息進行64輪迭代運算,分別輸出224bit和256bit的HASH結果。

 

 

 

SHA-224/SHA-256處理過程中會用到8個哈希初值和64個哈希常量。

SHA-224/SHA-256的8個哈希初值分別爲:

SHA-224:

A=0xC1059ED8,B=0x367CD507,C=0x3070DD17,D=0xF70E5939

E=0xFFC00B31,F=0x68581511,G=0x64F98FA7,H=0xBEFA4FA4

SHA-256:

A=0x6A09E667,B=0xBB67AE85,C=0x3C6EF372,D=0xA54FF53A

E=0x510E527F,F=0x9B05688C,G=0x1F83D9AB,H=0x5BE0CD19

64個哈希常量:

 

 

SHA-224/256迭代運算的詳細流程爲:

1. 哈希初值賦值:

H0=A,H1=B,H2=C,H3=D,H4=E,H5=F,H6=G,H7=H

2. 64輪迭代運算

for (t=0; t≤63; t++)

{

T1 = H + (E >>> 6) ⊕ (E >>> 11) ⊕ (E >>>25) + (E & F) ⊕ (~E & G) + K[t] + W[t]

T2 = (A >>> 2) ⊕ (A >>> 13) ⊕ (A >>>22) + (A & B) ⊕ (A & C) ⊕ (B & C)

H = G;

G = F;

F = E;

E = D + T1;

D = C;

C = B;

B = A;

A = T1 + T2;

}

3. 結果輸出

SHA-224輸出224bit:

H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D,H4=H4+E,H5=H5+F,H6=H6+G

SHA-256輸出256bit:

H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D,H4=H4+E,H5=H5+F,H6=H6+G,H7=H7+H
————————————————
版權聲明:本文爲CSDN博主「j64993」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/j64993/article/details/127132255

 

 

二、SM3算法原理

協議標準:http://www.sca.gov.cn/sca/xxgk/2010-12/17/1002389/files/302a3ada057c4a73830536d03e683110.pdf

算法處理分如下幾步:

 

 

 

消息填充
消息填充分爲兩部分:第一部分是附加填充比特,第二部分是附加長度,目的是讓整個消息滿足指定的結構,從而處理起來可以統一化、格式化。

附加填充比特:指在消息尾部進行填充,使報文長度在對512取模後的餘數爲448。具體操作是:先被1比特1,然後都被0,直到滿足對512取模餘448。需要注意的是:即使原始消息長度已經滿足對512取模餘448,補位也需要進行,這時地填充512比特。所以附加填充時至少補1位,最多補512位。

附加長度:將原始數據的長度信息補到已經進行了填充的消息後面。

消息分組
消息分組指將消息填充後的數據按512bit(16*32bit)進行分組,並擴充爲132*32bit,擴充算法如下:

當 0 ≤ t ≤ 15 時,W[t] = M[t],M[t]爲512bit原始數據中第t個32bit數據。

當 16 ≤ t ≤ 67時,P1(X) = X ⊕ (X <<< 15) ⊕ (X <<< 23)

W[t] = P1(W[t-16] ⊕ W[t-9] ⊕ (W[t-3] <<< 15)) ⊕ (W[t-13] <<< 7) ⊕ W[t-6]

當 68 ≤ t ≤ 131時,W'[i] = W[i] ⊕ W[i+4],其中i=0..63

消息填充和消息分組處理圖示如下:

 

 

 

迭代運算
SM3算法對輸入的消息進行64輪迭代運算,輸出256bit的HASH結果。

 

 

 

SM3處理過程中會用到8個哈希初值和2個哈希常量。

SM3的8個哈希初值分別爲:

A=0x7380166F,B=0x4914B2B9,C=0x172442D7,D=0xDA8A0600

E=0xA96F30BC,F=0x163138AA,G=0xE38DEE4D,H=0xB0FB0E4E

2個哈希常量:

0≤𝑗≤15: 𝑇𝑗=0𝑥79𝐶𝐶4519

16≤𝑗≤63: 𝑇𝑗=0𝑥7A879D8A

SM3迭代運算的詳細流程爲:

1. 哈希初值賦值:

H0=A,H1=B,H2=C,H3=D,H4=E,H5=F,H6=G,H7=H

2. 64輪迭代運算

for (t=0; t≤63; t++)

{

SS1 = ((A <<< 12) + E + (Tt <<< t)) <<< 7

SS2 = SS1 ⊕ (A <<< 12)

TT1 = FFj(A, B, C) + D + SS2 + W‘[t]

TT2 = GGj(E,F,G) + H + SS1 + W[t]

D = C;

C = B <<< 9;

B = A;

A = TT1;

H = G;

G = F <<< 19;

F = E;

E = TT2 ⊕ (TT2 <<<9) ⊕ (TT2 <<< 17);

}

3. 結果輸出

H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D,H4=H4+E,H5=H5+F,H6=H6+G,H7=H7+H
————————————————
版權聲明:本文爲CSDN博主「j64993」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/j64993/article/details/127132264

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章