哈希算法到底是什么?它又是如何運(yùn)行的?Greg Walker 用視頻給出了一個(gè)可視化的解答,并在 GitHub 上進(jìn)行了共享,詳細(xì)介紹了 SHA-256 函數(shù)的工作原理。
項(xiàng)目鏈接:https://github.com/in3rsha/sha256-animation Greg Walker 喜歡構(gòu)建一些教育性網(wǎng)站,簡(jiǎn)單易懂地講解一些科普類(lèi)算法。 他在這個(gè)解釋 SHA-256 的視頻中,不僅介紹了哈希計(jì)算,還涉及比特幣挖礦、基礎(chǔ)運(yùn)算、函數(shù)、常量等知識(shí)。 什么是哈希函數(shù)? 哈希就是將不同的輸入映射成獨(dú)一無(wú)二的、固定長(zhǎng)度的值(又稱(chēng) "哈希值"),是最常見(jiàn)的軟件運(yùn)算之一。很多網(wǎng)絡(luò)服務(wù)會(huì)使用哈希函數(shù),產(chǎn)生一個(gè) token,標(biāo)識(shí)用戶的身份和權(quán)限。 那它是如何運(yùn)行的呢?哈希函數(shù)可以把給定的數(shù)據(jù)轉(zhuǎn)換成固定長(zhǎng)度的無(wú)規(guī)律數(shù)值。此處為方便讀者理解,我們借用《我的第一本算法書(shū)》里的比喻:將哈希函數(shù)想象成攪拌機(jī)。
圖源:《我的第一本算法書(shū)》 將數(shù)據(jù) “abc” 放入攪拌機(jī)里,經(jīng)過(guò)哈希函數(shù)計(jì)算后,會(huì)輸出固定長(zhǎng)度且無(wú)規(guī)律的數(shù)值,而這個(gè)無(wú)規(guī)律數(shù)值就是“哈希值”,絕大多數(shù)情況用十六進(jìn)制來(lái)表示。
哈希函數(shù)有一系列特征,如上圖所示,輸出的哈希值與輸入數(shù)據(jù)的大小、長(zhǎng)度等沒(méi)有任何關(guān)系。
若輸入相同,輸出的哈希值也必定相同。
如輸入不同,輸出的哈希值也必然不同,哪怕是只有細(xì)微區(qū)別。
在輸入數(shù)據(jù)完全不同的情況下,輸出的哈希值有可能是相同的,這種少數(shù)特殊情況稱(chēng)為“哈希沖突”。
同時(shí),哈希值是不可逆的,也就是說(shuō),通過(guò)哈希值不可能反向推算出原本的數(shù)據(jù)。 在本項(xiàng)目中,Greg Walker 也通過(guò)視頻介紹了以上幾大特征。
SHA-256 SHA 包括 SHA-0、SHA-1、SHA-2 和 SHA-3 系列,SHA-256 是 SHA-2 系列的函數(shù)之一。其摘要長(zhǎng)度為 256 bits,即 32 個(gè)字節(jié),故稱(chēng) SHA-256。SHA-256 常出現(xiàn)于比特幣領(lǐng)域。 那么 SHA-256 到底是什么樣的呢?Greg Walker 提供了動(dòng)畫(huà)展示。
動(dòng)畫(huà)展示 SHA-256,你也能做到
只需對(duì)需要進(jìn)行 hash 處理的數(shù)據(jù)運(yùn)行 sha256.rb 腳本即可。
# simpleruby sha256.rb abc # hash binary or hex data by using `0b` or `0x` prefixesruby sha256.rb 0b01100001ruby sha256.rb 0xaabbccdd # speed up or step through the animation (optional)ruby sha256.rb abc normal # defaultruby sha256.rb abc fastruby sha256.rb abc enter 輸入二進(jìn)制字符串作為參數(shù),從而運(yùn)行 SHA-256 中的各個(gè)函數(shù):
ruby shr.rb 11111111111111110000000000000000 22ruby rotr.rb 11111111111111110000000000000000 22ruby sigma0.rb 11111111111111110000000000000000ruby sigma1.rb 11111111111111110000000000000000ruby usigma0.rb 11111111111111110000000000000000ruby usigma1.rb 11111111111111110000000000000000ruby ch.rb 11111111111111110000000000000000 11110000111100001111000011110000 00000000000000001111111111111111ruby maj.rb 11111111111111110000000000000000 11110000111100001111000011110000 00000000000000001111111111111111 你也可以使用 hash256.rb 來(lái)進(jìn)行 double-SHA256,該腳本默認(rèn)接受十六進(jìn)制數(shù)據(jù),如交易數(shù)據(jù)等。
ruby hash256.rb 0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c # genesis block headerSHA-256 的工作原理基礎(chǔ)運(yùn)算 這里只對(duì) SHA-256 的基礎(chǔ)運(yùn)算進(jìn)行簡(jiǎn)單介紹。 SHA-256 uses four basic bitwise operations on words. SHA-256 對(duì) words 使用 4 種 bitwise 基礎(chǔ)運(yùn)算。 右移 (shr.rb)
SHRn(x) = x >> n 將 bits 向右移動(dòng)多個(gè)位置,同時(shí)從右側(cè)移出的 bits 丟失。 向右旋轉(zhuǎn) (rotr.rb)
將 bits 向右移動(dòng)多個(gè)位置,然后將移動(dòng)后的 bits 放在左側(cè),也稱(chēng)為「循環(huán)右移」。 Exclusive Or (xor.rb)
x ^ y ^ z XOR 的輸入為兩個(gè) bit,如果其中只有一個(gè)為 1,則輸出 1。在合并多個(gè) bit 時(shí)通過(guò)多次 XOR 運(yùn)算進(jìn)行,同時(shí)獲得多個(gè) bit 的“平衡表示”(balanced representation)。 加法 (add.rb)
(v + w + x + y + z) % 232 這是非常標(biāo)準(zhǔn)的整數(shù)加法運(yùn)算,唯一的不同是,此處采用結(jié)果模數(shù)為 2^32,從而將結(jié)果限制為 32 位數(shù)字。 函數(shù) 將上述運(yùn)算組合起來(lái),就可以創(chuàng)建函數(shù)。 前四個(gè)函數(shù)使用希臘符號(hào) Sigma 命名(小寫(xiě)σ和大寫(xiě)Σ)。 σ0 (sigma0.rb)
σ0(x) = ROTR7(x) ^ ROTR18(x) ^ SHR3(x) σ1 (sigma1.rb)
σ1(x) = ROTR17(x) ^ ROTR19(x) ^ SHR10(x) Σ0 (usigma0.rb)
Σ0(x) = ROTR2(x) ^ ROTR13(x) ^ ROTR22(x) Σ1 (usigma1.rb)
Σ1(x)=ROTR6(x)^ROTR11(x)^ROTR25(x) 最后兩個(gè)函數(shù) “Choice” 和“Majority”可接受三個(gè)不同的輸入,如下所示: Choice (ch.rb)
該函數(shù)基于 x 位在 y 位和 z 位之間做出選擇。如果 x = 1,則選擇 y 位;如果 x = 0,則選擇 z 位。
Ch(x, y, z) = (x & y) ^ (~x & z) Majority (maj.rb)
該函數(shù)返回的是三個(gè) bits 中的多數(shù)。
Maj(x, y, z) = (x & y) ^ (x & z) ^ (y & z)壓縮 該教程中還介紹了很多有趣的基礎(chǔ)知識(shí),這里不再贅述。我們重點(diǎn)來(lái)看哈希函數(shù)的壓縮函數(shù),這也是其核心功能。 對(duì)于消息調(diào)度中的每個(gè)詞,我們都使用 “狀態(tài)寄存器” 中的當(dāng)前值來(lái)計(jì)算兩個(gè)新的臨時(shí)詞(設(shè)為 T_1 和 T_2)。
Temporary Word 1 (t1.rb)
T1 = Σ1(e) + Ch(e, f, g) + h + Kt + Wt 此臨時(shí)詞將消息調(diào)度中的下一個(gè)單詞與列表中的下一個(gè)常量并在一起運(yùn)行。 Temporary Word 2 (t2.rb)
T2 = Σ0(a) + Maj(a, b, c) 通過(guò)將狀態(tài)寄存器中第一個(gè)值Σ_0 進(jìn)行旋轉(zhuǎn),與前三個(gè)寄存器中的 Majority 的值相加來(lái)計(jì)算這個(gè)臨時(shí)詞。 壓縮 (compression.rb)
在計(jì)算了兩個(gè)臨時(shí)詞之后,將狀態(tài)寄存器中的值移至下一個(gè)位置,并更新寄存器: 狀態(tài)寄存器中的第一個(gè)值變?yōu)?T_1 + T_2,同時(shí)狀態(tài)寄存器中的第五個(gè)值已添加了 T_1。 這即是一輪壓縮,對(duì)于信息調(diào)度中的每個(gè)詞該過(guò)程都會(huì)重復(fù)一次。 在壓縮了整個(gè)消息調(diào)度之后,我們將得到的哈希值添加到初始哈希值中,由此得出消息塊的最終哈希值。 但如果還有其他消息塊要處理,則將當(dāng)前哈希值在下一次壓縮中用作初始哈希值。如下圖所示:
-
算法
+關(guān)注
關(guān)注
23文章
4710瀏覽量
95405 -
哈希函數(shù)
+關(guān)注
關(guān)注
0文章
43瀏覽量
9605
原文標(biāo)題:對(duì)SHA-256感到好奇?這個(gè)項(xiàng)目教你如何可視化哈希函數(shù)的工作原理
文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論