SHA-256 算法輸入報文的最大長度不超過2^64 bit,輸入按512-bit 分組進行處理,產生
的輸出是一個256-bit 的報文摘要。該算法處理包括以下幾步:
STEP1:附加填充比特。對報文進行填充使報文長度與448 模512 同余(長度=448 mod 512),
填充的比特數范圍是1 到512,填充比特串的最高位為1,其余位為0。
就是先在報文后面加一個 1,再加很多個0,直到長度 滿足 mod 512=448.
為什么是448,因為448+64=512. 第二步會加上一個 64bit的 原始報文的 長度信息。
STEP2:附加長度值。將用64-bit 表示的初始報文(填充前)的位長度附加在步驟1 的結果
后(低位字節優先)。
STEP3:初始化緩存。使用一個256-bit 的緩存來存放該散列函數的中間及最終結果。
該緩存表示為A=0x6A09E667 , B=0xBB67AE85 , C=0x3C6EF372 , D=0xA54FF53A,
E=0x510E527F , F=0x9B05688C , G=0x1F83D9AB , H=0x5BE0CD19 。
STEP4:處理512-bit(16 個字)報文分組序列。該算法使用了六種基本邏輯函數,由64
步迭代運算組成。每步都以256-bit 緩存值ABCDEFGH 為輸入,然后更新緩存內容。
每步使用一個32-bit 常數值Kt 和一個32-bit Wt。
常數K為

六種基本函數如下:



就像上圖一樣,參與運算的都是 32 bit的數,Wt 是 分組之后的報文,512 bit=32bit*16. 也就是 Wt t=1,2..16 由 該組報文產生。
Wt t=17,18,..,64 由 前面的Wt按遞推公式 計算出來。Wt遞推公式為:

Kt t=1,2..64 是已知的常數。
上面的計算就是不斷更新 a,b,c…h這 32bit*8 。在每個512bit的分組里面迭代計算64次。
STEP5:所有的512-bit分組處理完畢后,對於SHA-256算法最后一個分組產生的輸出便是256-bit的報文摘要。
補充內容:
#define shr(x,n) (x>>n) #define rotr(x,n) ((x>>n) | (x<<(32-n))) /* Various logical functions */ #define Ch(x,y,z) (z ^ (x & (y ^ z))) #define Maj(x,y,z) (((x | y) & z) | (x & y)) #define S(x, n) rotr((x),(n)) #define R(x, n) (((x)&0xFFFFFFFFUL)>>(n)) #define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) #define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) #define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) #define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
#define RND(a,b,c,d,e,f,g,h,i,ki) \ t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \ t1 = Sigma0(a) + Maj(a, b, c); \ d += t0; \ h = t0 + t1; RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98); RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491); ....
ki 為常數 K 數組。
W[i] 為分組后的報文經過變換后的數組。
/* copy the state into 512-bits into W[0..15] */ for (i = 0; i < 16; i++) { LOAD32H(W[i], buf + (4*i)); } /* fill W[16..63] */ for (i = 16; i < 64; i++) { W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; }
