安全算法—SHA-256算法
1. 什么是SHA-256?
????????SHA-256是SHA2中的一種。對于長度L(L<)比特的消息m,經過對消息的填充和迭代壓縮,SHA-256可以生成一個被稱為消息摘要的256位(32字節)散列值,散列值通常的呈現形式為64個十六進制數。
2. ?SHA-256算法實現步驟
2.1 把消息轉換為位字符串
? ? ? ?SHA-256算法是按照位作為輸入,所以進行計算前必須把原始消息(比如字符串、文件等)轉換成位字符串。
比如,對字符串“abc”產生消息摘要,‘a’=97 ‘b’=98 ‘c’=99,先轉換成24位的字符串:
????????????01100001 01100010 01100011
2.2 對轉換得到的位字符串進行補位操作
消息必須進行補位,使其長度在對512取模以后的余數是448,即(補位后的消息長度)%512 = 448。
對消息進行補位時,先在后面補一個1,如果不滿足要求,再補0直到滿足對512取模余數為448。這就意味著,補位至少補一位(原消息位數為512n+447),最多補512位(原消息位數為512n+448)。
還是以前面的“abc”為例顯示補位的過程:
原始信息: 01100001 01100010 01100011
補位第一步,首先補一個1:01100001 01100010 01100011?1
可以確定的是,如果用一個字節來表示一個字符,補1之后肯定不滿足條件,仍需繼續補位。
補位第二步,后面補0直到總長度對512取模余數為448,這里補423個0,使總長度達到為448:
????????????01100001 01100010 01100011 1000…..00
補位完成后的數據轉換為16進制:
61626380 00000000 00000000 00000000
???????00000000 00000000 00000000 00000000
? ? ? ?00000000 00000000 00000000 00000000
????? ?00000000 00000000
從16進制數據里可以看到,我們也可以直接采用16進制的方式進行補位,我們先補80,看是否滿足長度對64取余的結果為56,不滿足則繼續補0。
2.3 消息擴展、分組處理
這一步中,要將原始消息(沒有進行補位操作之前)的長度(二進制位數)附加到已經補位的消息之后。
通常用一個64位的數據來表示原始消息的長度。如果消息長度不大于2^64,那么第一個字就是0。
補長度的操作以后,整個消息(16進制)如下:
????????61626380 00000000 00000000 00000000
????????00000000 00000000 00000000 00000000
????????00000000 00000000 00000000 00000000
????????00000000 00000000 00000000 00000018
然后,將整個消息拆分為一個一個的512位的數據塊M1,M2,…,Mn,然后分別對每一個數據塊Mi (1≤i≤n)做處理,得到消息摘要。
注意,這里是64位,上一步補位后的長度是512k+448,k≥0,這樣,512k+448+64=512(k+1),恰好可以被512整除。
在我們舉得例子里,一共只有512位,因此做為一個數據塊進行處理。
填充完了之后消息被分為了512位的消息分組。每個分組被分為16個32位的子分組,記為:M(i)0、M(i)1、...、M(i)15。將對N個消息分組進行如下操作。
a、64個消息列表的生成
????For t = 0 to 15
????Wt = M(i)t
????For t = 16 to 63
????Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(w(t-15)) + W(t-16)
2.4 使用的常量和函數
????????SHA-256采用64個32位的常數序列。通常記為:K0、K1、……、K63,這些常數的取值是前64個質數的立方根的小數部分的前32位。
????????SHA-256采用6個邏輯函數,每個函數均基于32位字運算,這些輸入的32位字我們記為x、y、z,同樣的這些函數的計算結果也是一個32位字。
2.5計算消息摘要
??消息列表每32位分為一個子分組,被標記為W0、W1、…、W63。8個工作變量分別為a、b、c、d、e、f、g和h,8個散列值被標記為h(i)0、h(i)1、…、H(i)7,并保留初始散列值H(0),替換為每一個連續的中間散列值(在處理完每個消息分組后) H(i),并以最終的散列值H(N)結束,在處理完所有N塊后。還使用兩個臨時變量T1和T2。
(1)初始化工作變量
而對于SHA-256來說,初始散列值H(0)由以下8個32位的十六進制數組成。這些字由前8個質數的平方根的小數部分的錢32位組成。
????a = H(0)0 = 6a09e667
????b = H(0)1 = bb67ae85
????c= H(0)2 = 3c6ef372
????d = H(0)3 = a54ff53a
????e = H(0)4 = 510e527f
????F = H(0)5 = 9b05688c
????g = H(0)6 = 1f83d9ab
????H(0)7 = 5be0cd19
(2)執行散列計算
????For t = 0 to 63
????T1 = h + BSIG1(e) + CH(e,f,g) + Kt + Wt
????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
(3)輸出計算結果
????H(i)0 = a + H(i-1)0
????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
最后得到H(i)0、H(i)1、H(i)2、H(i)3、H(i)4、H(i)5、H(i)6、H(i)7的串聯值,256位的消息摘要。
3. ?SHA-256安全性分析
????????Hash函數的安全性很大程度上取決于抗強碰撞的能力,即攻擊者找出兩個消息M和Mt,M≠Mt,使得H(M)=HMt ?,因此,評價一個Hash函數的安全性,就是看攻擊者在現有的條件下,是否可以找到該函數的一對碰撞。目前已有的對Hash函數攻擊的方法包括生日攻擊、彩虹表攻擊、差分攻擊等。
??生日攻擊:生日攻擊是一種可用于攻擊任何類型函數Hash函數的攻擊方法。從攻擊原理上看,它沒有利用Hash函數的結構和任何代數弱性質,只依賴與Hash值的長度。因此,抵御生日攻擊最有效的方法是Hash值必須有足夠的長度。
??差分攻擊:差分攻擊是目前破譯迭代Hash函數最有效的手法之一,其基本方法是利用明文的輸入差值對輸出差值的影響,運用差分的高概率的繼承或者消除來產生最終的相同輸出。
??用于消息唯一性和數據完整性驗證的Hash函數,其安全性依賴于函數本身的屬性和對抗碰撞的抵抗。Hash函數的算法結構特點和Hash值的長度是決定函數碰撞性的而主要因素,Hash值越長,越能抵御生日攻擊。SHA-256有256比特Hash值,MD5和SHA-1分別有128和160比特的Hash值。因此,SHA-256比MD5和SHA-1能抵抗生日攻擊。通過對Chabaud-Joux攻擊SHA-256的分析,找到了SHA-256的一個部分碰撞,其復雜度為2^66,但無法找到SHA-256的一個整體碰撞,因此SHA-256算法也能抵御現有的差分攻擊。由此可見,在抵御生日攻擊和抵御已知差分攻擊方面,SHA-256算法比現在廣泛使用的MD5和SHA-1等更具安全性。
?
總結
以上是生活随笔為你收集整理的安全算法—SHA-256算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 左程云算法学习笔记
- 下一篇: EtherCAT 网站链接