SHA256安全散列算法
生活随笔
收集整理的這篇文章主要介紹了
SHA256安全散列算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
SHA256是安全散列算法SHA(Secure Hash Algorithm)系列算法之一,其摘要長度為256bits,即32個字節(jié),故稱SHA256。SHA系列算法是美國國家安全局 (NSA) 設(shè)計,美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST) 發(fā)布的一系列密碼散列函數(shù),包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等變體。主要適用于數(shù)字簽名標(biāo)準(zhǔn)(DigitalSignature Standard DSS)里面定義的數(shù)字簽名算法(Digital Signature Algorithm DSA)。下面介紹該算法計算消息摘要的原理。
對于任意長度(按bit計算)的消息,SHA256都會產(chǎn)生一個32個字節(jié)長度數(shù)據(jù),稱作消息摘要。當(dāng)接收到消息的時候,這個消息摘要可以用來驗證數(shù)據(jù)是否發(fā)生改變,即驗證其完整性。在傳輸?shù)倪^程中,數(shù)據(jù)很可能會發(fā)生變化,那么這時候就會產(chǎn)生不同的消息摘要。SHA算法有如下特性:1.不可以從消息摘要中復(fù)原信息;2.兩個不同的消息不會產(chǎn)生同樣的消息摘要。
一、術(shù)語和概念
(一)位(Bit),字節(jié)(Byte)和字(Word)
SHA始終把消息當(dāng)成一個位(bit)字符串來處理。本文中,一個“字”(Word)是32位,而一個“字節(jié)”(Byte)是8位。比如,字符串“abc”可以被轉(zhuǎn)換成一個位字符串:01100001 01100010 01100011。它也可以被表示成16進(jìn)制字符串:0x616263.
二、SHA256算法描述
(一)補(bǔ)位
信息必須進(jìn)行補(bǔ)位,以使其長度在對512取模以后的余數(shù)是448。也就是說,(補(bǔ)位后的消息長度)Q2 = 448。即使長度已經(jīng)滿足對512取模后余數(shù)是448,補(bǔ)位也必須要進(jìn)行。
補(bǔ)位是這樣進(jìn)行的:先補(bǔ)一個1,然后再補(bǔ)0,直到長度滿足對512取模后余數(shù)是448。總而言之,補(bǔ)位是至少補(bǔ)一位,最多補(bǔ)512位。以信息“abc”為例顯示補(bǔ)位的過程。
原始信息:01100001 01100010 01100011
補(bǔ)位第一步:0110000101100010 01100011 1
首先補(bǔ)一個“1”
補(bǔ)位第二步:0110000101100010 01100011 10…..0
然后補(bǔ)423個“0”
我們可以把最后補(bǔ)位完成后的數(shù)據(jù)用16進(jìn)制寫成下面的樣子
61626380 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 00000000
現(xiàn)在,數(shù)據(jù)的長度是448了,我們可以進(jìn)行下一步操作。
(二)補(bǔ)長度
所謂的補(bǔ)長度是將原始數(shù)據(jù)的長度補(bǔ)到已經(jīng)進(jìn)行了補(bǔ)位操作的消息后面。通常用一個64位的數(shù)據(jù)來表示原始消息的長度。如果消息長度不大于2^64,那么第一個字就是0。在進(jìn)行了補(bǔ)長度的操作以后,整個消息就變成下面這樣了(16進(jìn)制格式)
61626380 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 0000000000000000 00000018
如果原始的消息長度超過了512,我們需要將它補(bǔ)成512的倍數(shù)。然后我們把整個消息分成一個一個512位的數(shù)據(jù)塊,分別處理每一個數(shù)據(jù)塊,從而得到消息摘要。
(三)使用的常量
在SHA256算法中,用到64個常量,這些常量是對自然數(shù)中前64個質(zhì)數(shù)的立方根的小數(shù)部分取前32bit而來。這64個常量如下:
? 428a2f98 71374491 b5c0fbcf e9b5dba5?
? ? ? ? 3956c25b 59f111f1 923f82a4 ab1c5ed5?
? ? ? ? d807aa98 12835b01 243185be 550c7dc3?
? ? ? ? 72be5d74 80deb1fe 9bdc06a7 c19bf174?
? ? ? ? e49b69c1 efbe4786 0fc19dc6 240ca1cc?
? ? ? ? 2de92c6f 4a7484aa 5cb0a9dc 76f988da?
? ? ? ? 983e5152 a831c66d b00327c8 bf597fc7?
? ? ? ? c6e00bf3 d5a79147 06ca6351 14292967?
? ? ? ? 27b70a85 2e1b2138 4d2c6dfc 53380d13?
? ? ? ? 650a7354 766a0abb 81c2c92e 92722c85?
? ? ? ? a2bfe8a1 a81a664b c24b8b70 c76c51a3?
? ? ? ? d192e819 d6990624 f40e3585 106aa070?
? ? ? ? 19a4c116 1e376c08 2748774c 34b0bcb5??
? ? ? ? 391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3?
? ? ? ? 748f82ee 78a5636f 84c87814 8cc70208?
? ? ? ? 90befffa a4506ceb bef9a3f7 c67178f2
?
(四)需要使用的函數(shù)
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)?
? ? ? ? 其中x、y、z皆為32bit的字。
? ? ? ? ROTR^2(x)是對x進(jìn)行循環(huán)右移2位。
?
(五)計算消息摘要
? ? ? ? 基本思想:就是將消息分成N個512bit的數(shù)據(jù)塊,哈希初值H(0)經(jīng)過第一個數(shù)據(jù)塊得到H(1),H(1)經(jīng)過第二個數(shù)據(jù)塊得到H(2),......,依次處理,最后得到H(N),然后將H(N)的8個32bit連接成256bit消息摘要
? ? ? ? I、哈希初值H(0)
? ? ? ? SHA256算法中用到的哈希初值H(0)如下
? ? ? ? H(0)0 = 6a09e667?
? ? ? ? H(0)1 = bb67ae85??
? ? ? ? H(0)2 = 3c6ef372?
? ? ? ? H(0)3 = a54ff53a?
? ? ? ? H(0)4 = 510e527f?
? ? ? ? H(0)5 = 9b05688c?
? ? ? ? H(0)6 = 1f83d9ab?
? ? ? ? H(0)7 = 5be0cd19
注:這些初值是對自然數(shù)中前8個質(zhì)數(shù)3、5、7、11等的平方根的小數(shù)部分取前32bit而來。
? ? ? ?
? ? ? ? II、 計算過程中用到的三種中間值
? ? ? ? 1、64個32bit字的message schedule標(biāo)記為w0、w1、…、w63。
? ? ? ? 2、8個32bit字的工作變量標(biāo)記為a、b、c、d、e、f、g。
? ? ? ? 3、包括8個32bit字的哈希值標(biāo)記為H(i)0、…、H(i)7。
? ? ? ?
? ? ? ? III、 工作流程
? ? ? ? 原始消息分為N個512bit的消息塊。每個消息塊分成16個32bit的字標(biāo)記為M(i)0、M(i)1、M(i)2、…、M(i)15然后對這N個消息塊依次進(jìn)行如下處理
? ? ? ? For i=1 to N
? ? ?1)? ?For t = 0 to 15?
? ? ? ? ? ? ? ? ? ? ?Wt = M(i)t?
? ? ? ? ? ? ? ? ?For t = 16 to 63?
? ? ? ? ? ? ? ? ? ? ?Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(t-15) + W(t-16)?
? ? ? ? ?2)? a = H(i-1)0?
? ? ? ? ? ? ? ? b = H(i-1)1?
? ? ? ? ? ? ? ? c = H(i-1)2?
? ? ? ? ? ? ? ? d = H(i-1)3?
? ? ? ? ? ? ? ? e = H(i-1)4?
? ? ? ? ? ? ? ? f = H(i-1)5?
? ? ? ? ? ? ? ? g = H(i-1)6?
? ? ? ? ? ? ? ? h = H(i-1)7
? ? ? ? ?3)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
?
? ? ? ? ? ?4)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
對N個消息塊依次進(jìn)行以上四步操作后將最后得到的H(N)0、H(N)1、H(N)2、…、H(N)7串聯(lián)起來即可得到最后的256bit消息摘要。
?
? 三、SHA算法安全嗎?
? ? ? ? 2013年9月10日美國約翰霍普金斯大學(xué)的計算機(jī)科學(xué)教授,知名的加密算法專家,Matthew Green被NSA要求刪除他的一份關(guān)于破解加密算法的與NSA有關(guān)的博客。 同時約翰霍普金斯大學(xué)服務(wù)器上的該博客鏡像也被要求刪除。但當(dāng)記者向該大學(xué)求證時,該校稱從未收到來自NSA的要求要刪除博客或鏡像的資料,但記者卻無法在原網(wǎng)址再找到該博客。幸運的是,從谷歌的緩存可以找到該博客。該博客提到NSA每年花費2.5億美元來為自己在解密信息方面獲取優(yōu)勢,并列舉了NSA的一系列見不得人的做法。在BitcoinTalk上,已經(jīng)掀起了一輪爭論:到底SHA256是否安全?
? ? ? ? ?部分認(rèn)為不安全的觀點包括:
NSA制造了sha256, 我們不相信NSA,他們不可能不留后門。
棱鏡事件已經(jīng)明白的告訴我們,政府會用一切可能的手段來監(jiān)視與解密。
雖然有很多人會研究SHA-2,且目前沒有公開的證據(jù)表明有漏洞。但沒有公開這并不能代表就沒有,因為發(fā)現(xiàn)漏洞的人一定更傾向于保留這個秘密來自己利用,而不是公布。
部分認(rèn)為安全的觀點包括:
SHA-2是應(yīng)用廣泛的算法,應(yīng)該已經(jīng)經(jīng)歷了實踐的檢驗。
美國的對頭中國和俄國都有很多杰出的數(shù)學(xué)家,如果有問題的話,他們肯定已經(jīng)發(fā)現(xiàn)了。
如果真的不安全,世界上安全的東西就太少了,我不能生活在提心吊膽里,所以我選擇相信安全。
http://blog.sina.com.cn/s/blog_d66494300102wz0z.html
總結(jié)
以上是生活随笔為你收集整理的SHA256安全散列算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2015一新建项目就出现未将对象引用
- 下一篇: python2.7获取当前脚本目录