wordpress 制作企業(yè)站長春seo招聘
SHA-256 是一種密碼學(xué)哈希函數(shù),是 SHA-2(Secure Hash Algorithm 2)家族的一部分。它被廣泛用于數(shù)據(jù)完整性驗證、數(shù)字簽名以及密碼存儲等領(lǐng)域。
1、SHA-256的原理
SHA-256 生成一個固定長度為 256 位(32 字節(jié))的哈希值。無論輸入數(shù)據(jù)的大小或類型,輸出的哈希值始終是 256 位長。SHA-256 具有以下幾個特點:
- 單向性: 通過哈希值無法反推出原始數(shù)據(jù)。這使得它適用于存儲密碼等敏感信息。
- 抗碰撞性: 找到兩個不同的輸入數(shù)據(jù),它們的哈希值相同的難度非常高。
- 雪崩效應(yīng): 輸入數(shù)據(jù)的微小變化會導(dǎo)致輸出的哈希值有顯著變化。
- 固定長度輸出: 無論輸入數(shù)據(jù)的大小如何,輸出始終是256位。
2、SHA-256 的主要步驟
-
數(shù)據(jù)填充: 將數(shù)據(jù)填充到滿足 512 位的整數(shù)倍。填充方式是先加一個 ‘1’ 位,然后加足夠的 ‘0’,最后附加一個 64 位的數(shù)據(jù)長度。
-
初始散列值: 使用一組 32 位的常數(shù)初始化 8 個變量。
-
處理消息塊: 對每個 512 位的消息塊進(jìn)行一系列數(shù)學(xué)運算,這些運算主要包括位運算、模加法和一些常量的使用。每個塊處理后,將結(jié)果累加到初始散列值中。
-
輸出最終哈希值: 所有塊處理完后,將最終的 8 個變量拼接在一起形成 256 位的輸出哈希值。
3、示例數(shù)據(jù)
假設(shè)我們要計算字符串 “abc” 的 SHA-256 哈希值。
3.1.數(shù)據(jù)填充(同SHA1,不再詳細(xì)解釋原因)
首先將輸入數(shù)據(jù)填充到長度為 512 位的倍數(shù)(一個塊為 512 位)。對于字符串 “abc”:
3.1.1 原始數(shù)據(jù):
二進(jìn)制表示(ASCII 編碼):
a: 01100001
b: 01100010
c: 01100011
總共 24 位:01100001 01100010 01100011
3.1.2 添加一個 ‘1’ 位:
01100001 01100010 01100011 1
3.1.3 填充 ‘0’:填充到 448 位:
01100001 01100010 01100011 10000000
后面加 423 個 0
3.1.4 添加原始長度:最后附加 64 位的原始長度(24 位),結(jié)果為:
0000000000000000000000000000000000000000000000000000000000011000
3.1.5 填充后的總數(shù)據(jù)長度為 512 位(64 字節(jié)):
01100001 01100010 01100011 10000000 00000000 ... 00000000 00000000 00011000
3.2 初始化散列值
SHA-256 使用 8 個 32 位的初始哈希值(常數(shù)):
H0 = 6a09e667
H1 = bb67ae85
H2 = 3c6ef372
H3 = a54ff53a
H4 = 510e527f
H5 = 9b05688c
H6 = 1f83d9ab
H7 = 5be0cd19
3.3 處理消息塊
將 512 位的數(shù)據(jù)分成 16 個 32 位的字:
- W0 = 01100001 01100010 01100011 10000000
- W1 - W14都為 0,W15 為 00000000 00000000 00000000 00011000
然后將這些字?jǐn)U展為 64 個字,并依次進(jìn)行運算。這里會涉及到位操作、模加法和常量使用。
由于計算過程非常復(fù)雜且公式較多,下面是一些關(guān)鍵步驟:
3.3.1 主要計算公式:
Σ0(a) = ROTR(2,a) ^ ROTR(13,a) ^ ROTR(22,a)
Σ1(e) = ROTR(6,e) ^ ROTR(11,e) ^ ROTR(25,e)
Ch(e,f,g) = (e & f) ^ (~e & g)
Maj(a,b,c) = (a & b) ^ (a & c) ^ (b & c)
3.3.2 循環(huán)計算:
for i in range(64):T1 = h + Σ1(e) + Ch(e,f,g) + K[i] + W[i]T2 = Σ0(a) + Maj(a,b,c)h = gg = ff = ee = d + T1d = cc = bb = aa = T1 + T2
最終,這個塊的處理結(jié)果會累加到初始哈希值中。
3.4.輸出最終哈希值
處理所有塊后,將 H0-H7 的值連接起來就是最終的 SHA-256 哈希值。
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
4、python實現(xiàn)
import structdef right_rotate(n, b):"""右旋轉(zhuǎn) n by b bits."""return