您好,登錄后才能下訂單哦!
如何進(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)度。
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)
補(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)度一般是固定的64bit,用來(lái)表示消息的初始長(zhǎng)度。上面輸入的長(zhǎng)度是32位,轉(zhuǎn)換成16進(jìn)制是100000。所以將會(huì)把100000補(bǔ)在上面的消息后面,不足64位用0補(bǔ)。
整體思路:把消息分成大小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è)資訊頻道,感謝各位的閱讀!
免責(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)容。