溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行散列算法中SHA256算法的分析與實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-18 13:43:48 來(lái)源:億速云 閱讀:209 作者:柒染 欄目:互聯(lián)網(wǎng)科技

如何進(jìn)行散列算法中SHA256算法的分析與實(shí)現(xiàn),相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

在很多技術(shù)人員的眼中,區(qū)塊鏈并不是一種新的技術(shù),而是過(guò)去很多年計(jì)算機(jī)技術(shù)的組合運(yùn)用。而在這個(gè)方方面面技術(shù)的運(yùn)用上,基于密碼學(xué)的加密算法可以說(shuō)是區(qū)塊鏈各種特點(diǎn)得以表現(xiàn)的根本,一旦目前使用的加密算法被證實(shí)可以破解,那么現(xiàn)有的區(qū)塊鏈技術(shù)很有可能土崩瓦解。本文所要講述的就是目前區(qū)塊鏈中運(yùn)用最廣的加密算法:SHA256。

SHA是一個(gè)密碼散列函數(shù)家族,是英文Secure Hash Algorithm的縮寫。由美國(guó)國(guó)家安全局(NSA)所設(shè)計(jì),并由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)發(fā)布。本文的主角SHA256算法就是這個(gè)家族中的一員。在此之前的SHA0,SHA1都被證明是可以破解的,目前SHA2以及SHA3尚未被證實(shí)可以破解。這里引申一下,在密碼學(xué)的定義中,所謂可以破解,即是計(jì)算復(fù)雜度少于暴力破解所需要的計(jì)算復(fù)雜度。SHA256中的256取的這種算法的摘要長(zhǎng)度。下面會(huì)具體講一下SHA256的實(shí)現(xiàn)原理。

SHA256算法的設(shè)計(jì)思路主要是依賴于一個(gè)優(yōu)秀的HASH散列算法的特點(diǎn):任何微小的輸入都有可能對(duì)輸出產(chǎn)生巨大的影響,以及HASH算法極低的碰撞概率。

常量定義:

SHA256算法中首先規(guī)定了8個(gè)哈希初值和64個(gè)哈希常量。8個(gè)哈希初值取的是自然數(shù)中前8個(gè)質(zhì)數(shù)(2,3,5,7,11,13,17,19)的平方根的小數(shù)部分的前32bit的值。例如:

取小數(shù)部分:0.414213562373095048(用16進(jìn)制表示)= 6\times16^{-1}+a\times16^{-2}+0\times16^{-3}+...

所以8個(gè)哈希初值的第一個(gè)可以表示為: h0 : = 0X6a09e667。最終取到的8個(gè)哈希初值分別是:

H0= 0x6a09e667 
H1 = 0xbb67ae85  
H2 = 0x3c6ef372 
H3 = 0xa54ff53a 
H4 = 0x510e527f 
H5 = 0x9b05688c 
H6 = 0x1f83d9ab 
H7 = 0x5be0cd19

在看前面8個(gè)哈希初值的定義,64個(gè)哈希常量的定義是取自然數(shù)中前64個(gè)質(zhì)數(shù)的立方根的小數(shù)部分的前32bit的值。這里就不貼出來(lái)了,了解定義即可。細(xì)心的讀者應(yīng)該能發(fā)現(xiàn),8個(gè)哈希初值,每個(gè)32位,總長(zhǎng)度對(duì)應(yīng)的就是SHA256算法的最后結(jié)果的長(zhǎng)度。

邏輯函數(shù)定義:

SHA256算法定義了6中邏輯函數(shù),這6個(gè)邏輯函數(shù)的作用這里先簡(jiǎn)單了解,后續(xù)的代碼部分會(huì)看到如何使用。

備注: AND 表示”與“運(yùn)算,NOT 表示:”或“運(yùn)算,XOR 表示”異或“運(yùn)算。ROTR^2(X)表示對(duì)X進(jìn)行循環(huán)右移兩位,SHR^3(X)表示對(duì)X右移三位。函數(shù)的輸入都是32bit的字。

CH(x, y, z) = (x AND y) XOR ( (NOT x) AND z)  
MAJ( x, y, z) = (x AND y) XOR (x AND z) XOR (y AND z)  
BSIG0(x) = ROTR^2(x) XOR ROTR^13(x) XOR ROTR^22(x)  
BSIG1(x) = ROTR^6(x) XOR ROTR^11(x) XOR ROTR^25(x)  
SSIG0(x) = ROTR^7(x) XOR ROTR^18(x) XOR SHR^3(x)  
SSIG1(x) = ROTR^17(x) XOR ROTR^19(x) XOR SHR^10(x)

算法過(guò)程:

補(bǔ)位:

補(bǔ)位的目的是為了使消息長(zhǎng)度滿足: (消息原始長(zhǎng)度+1+K) mod 512 = 448 這個(gè)公式。為什么是448,目的是為了后續(xù)留有64位的長(zhǎng)度來(lái)表示消息的長(zhǎng)度,SHA256支持的消息長(zhǎng)度是不大于2的64次方。1表示補(bǔ)位第一步補(bǔ)的一個(gè)位,K表示需要補(bǔ)的0的個(gè)數(shù)。補(bǔ)位的第一步是不管消息長(zhǎng)度多少(即使對(duì)512去模等于448),都在末尾補(bǔ)一個(gè)1。

假設(shè)原始消息是這樣: 01111101 01110000 11110000 00000001

補(bǔ)位第一步后的消息: 01111101 01110000 11110000 00000001 1

根據(jù)上面的解釋很容易算出需要補(bǔ) 415個(gè)0。

補(bǔ)長(zhǎng)度:

補(bǔ)充的長(zhǎng)度一般是固定的64bit,用來(lái)表示消息的初始長(zhǎng)度。上面輸入的長(zhǎng)度是32位,轉(zhuǎn)換成16進(jìn)制是100000。所以將會(huì)把100000補(bǔ)在上面的消息后面,不足64位用0補(bǔ)。

計(jì)算過(guò)程:

整體思路:把消息分成大小512bit的N份,取第一個(gè)數(shù)據(jù)塊的數(shù)據(jù),分成16份32bit的數(shù)組。最開(kāi)始的8個(gè)哈希初值H(0)經(jīng)過(guò)第一個(gè)消息塊數(shù)據(jù)運(yùn)算得到H(1),經(jīng)過(guò)第二個(gè)消息塊數(shù)據(jù)運(yùn)算得到H(2),一次循環(huán),直到得到H(N),就是最后得到的信息摘要。

詳細(xì)過(guò)程如下:

1)首先使用一個(gè)256-bit 的緩存來(lái)存放該散列函數(shù)的中間及最終結(jié)果。我們前面提到SHA256中定義了8個(gè)初始值,這8個(gè)初始值用a,b,c,d,e,f,g,h表示:

a=0x6a09e667, b=0xbb67ae85,

c=0x3c6ef372, d=0xa54ff53a,

e=0x510e527f, f=0x9b05688

c, g=0x1f83d9ab, h=0x5be0cd19。

2)把補(bǔ)長(zhǎng)過(guò)的消息進(jìn)行拆分成N個(gè)512bit數(shù)據(jù)。首先計(jì)算函數(shù)的外部有個(gè)大的循環(huán),形如: For i =1 to N;

3 ) 在每一次的循環(huán)里,需要給函數(shù)W(t)的輸入t為0到63的結(jié)果賦值,即W(0),W(1),W(2)...W(63)。其中W(0)到W(15)的值為當(dāng)前快消息被拆分的16個(gè)值(前面提到的每個(gè)塊分成16個(gè)32bit的數(shù)據(jù))。然后W(16)到W(63)取的值為依賴前面16個(gè)值產(chǎn)生,具體算法如下 :

For t = 0 to 15
Wt = M(i)t   //賦值W(t)的前16個(gè)值
For t = 16 to 63
Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(w(t-15)) + W(t-16) //利用W(t)前面的16個(gè)值計(jì)算后面的值

4)利用第三步取到的W(t)的64個(gè)值,進(jìn)行64次循環(huán),打亂原有的順序。過(guò)程中有一些中間變量,但是目的是為了重新給a,b,c,d,e,f,g,h賦值。代碼過(guò)程:

For t = 0 to 63     
T1 = h + BSIG1(e) + CH(e,f,g) + Kt + Wt //這里的Wt就是在文章開(kāi)頭定義的64個(gè)哈希常量。
T2 = BSIG0(a) + MAJ(a,b,c)
h = g
g = f
f = e
e = d + T1
d = c
c = b
b = a
a = T1 + T2

可以看到,利用之前介紹的邏輯函數(shù)和第三步的運(yùn)算結(jié)果,重新計(jì)算了a,b,c,d,e,f,g,h的值。

5) 最后一步就是根據(jù)第四步重新賦值的8個(gè)變量得出這個(gè)塊的SHA256結(jié)果。

通過(guò)上一步的H(i-1)0到H(i-1)7的值計(jì)算H(i)0到H(i)7的值。

H(i)0 = a + H(i-1)0    //a是一個(gè)32bit的值,H(i-1)0也是一個(gè)32bit的值

H(i)1 = b + H(i-1)1

H(i)2 = c + H(i-1)2

H(i)3 = d + H(i-1)3

H(i)4 = e + H(i-1)4

H(i)5 = f + H(i-1)5

H(i)6 = g + H(i-1)6

H(i)7 = h + H(i-1)7

到這里,第一次循環(huán)就結(jié)束了,還記得之前提過(guò)的”外部有個(gè)大的循環(huán),形如: For i =1 to N “ 嗎?在SHA256中,消息的長(zhǎng)度越長(zhǎng),循環(huán)的次數(shù)也越多。經(jīng)過(guò)N此循環(huán)得到H(N)0,H(N)1,H(N)2,...H(N)7,8個(gè)32位的數(shù)拼接起來(lái)就形成了SHA256算法的最終結(jié)果:一個(gè)長(zhǎng)度為256位的消息摘要。

在比特幣中,SHA256運(yùn)用在了錢包地址的產(chǎn)生,也是實(shí)現(xiàn)pow共識(shí)機(jī)制的主要手段。就目前來(lái)說(shuō),2的256次方近似于10的77次方,10的77次方有多大?到目前為止,人類可觀測(cè)的宇宙中的原子數(shù)約為10的80次方,這種數(shù)量級(jí)的散列算法想要通過(guò)碰撞來(lái)攻擊基本是不可能的。這也是目前為什么SHA256算法得到普遍應(yīng)用的原因之一。

看完上述內(nèi)容,你們掌握如何進(jìn)行散列算法中SHA256算法的分析與實(shí)現(xiàn)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI