你真是個(gè)特別的人
誰(shuí)能想到,我們之前用作校驗(yàn)文件,核驗(yàn)數(shù)據(jù)的一種算法,現(xiàn)在卻奠定了區(qū)塊鏈數(shù)字貨幣帝國(guó)大廈,這個(gè)算法有很多名字,比如一般叫做哈希算法(HASH的英文而來(lái)),有的也稱(chēng)在雜湊算法(很形象~~)或者散列算法等(以下我們統(tǒng)稱(chēng)哈希)。那么現(xiàn)在我們就來(lái)解開(kāi)這種算法的層層面紗,在本文中,我們將解析加密貨幣中最常用的四種加密哈希函數(shù)的特性和差異。但在此之前,還是需要了解哈希的含義。
什么是HASH(哈希)
簡(jiǎn)單來(lái)說(shuō),哈希意味著輸入任意長(zhǎng)度的字符串通過(guò)密碼運(yùn)算來(lái)實(shí)現(xiàn)固定長(zhǎng)度的輸出。在像比特幣這樣的加密貨幣的情況下,交易被視為輸入并通過(guò)哈希算法(比特幣使用SHA-256)運(yùn)行(該算法提供固定長(zhǎng)度的輸出)。
先了解下哈希算法是如何工作的。我們以SHA-256(256位安全哈希算法)為例。
在SHA-256的情況下,無(wú)論你的輸入有多大或多小,輸出總是有一個(gè)固定的256位長(zhǎng)度。這對(duì)于處理大量的數(shù)據(jù)和事務(wù)校驗(yàn)時(shí)非常關(guān)鍵,這里先看看哈希函數(shù)的各種特性以及它們?cè)趨^(qū)塊鏈中的實(shí)現(xiàn)方式。
加密哈希算法特性
哈希算法其特俗的特性使得非常適合密碼應(yīng)用,加密哈希算法具有以下幾個(gè)特性:
特性 1:確定性
這意味著無(wú)論 你通過(guò)哈希函數(shù)解析特定輸入多少次, 你都會(huì)得到相同的結(jié)果。這是至關(guān)重要的,因?yàn)槿绻看味嫉玫讲煌墓V?,就不可能跟蹤輸入?/p>
特性2:快速計(jì)算
哈希函數(shù)應(yīng)該能夠快速返回輸入的哈希。
性質(zhì)3:?jiǎn)蜗蛐?/p>
單向性指的是:假設(shè)A是輸入數(shù)據(jù)并且H(A)是輸出哈希結(jié)果,假設(shè)給定H(A)來(lái)倒推出A是“不可行”的(注意使用“不可行”一詞而不是“不可能”)。
因?yàn)槲覀円呀?jīng)知道從它的哈希值中確定原始輸入并不是“不可能”的。舉個(gè)例子吧。
假設(shè)你擲骰子,輸出是骰子出現(xiàn)的數(shù)字的哈希。我們將如何確定原始號(hào)碼是什么?很簡(jiǎn)單,所要做的就是從1-6中找出所有數(shù)字的哈希值并進(jìn)行比較。由于哈希函數(shù)是確定性的,所以特定輸入的哈??偸窍嗤?,因此 我們可以簡(jiǎn)單地比較哈希并找出原始輸入。
但是,只有在給定的數(shù)據(jù)量非常少的情況下,這才有效。當(dāng)你有大量的數(shù)據(jù)時(shí)會(huì)發(fā)生什么?假設(shè)你正在處理128位哈希。唯一必須找到原始輸入的方法是使用“暴力群舉”。暴力群舉基本上意味著你必須選取一個(gè)隨機(jī)輸入,對(duì)其進(jìn)行哈希,然后將輸出與目標(biāo)哈希進(jìn)行比較并重復(fù),直到找到匹配。
如果你使用這種暴力方法后:
最好的結(jié)果: 你可能在第一次嘗試時(shí)獲得答案,不過(guò)這只是理論上的可能,因?yàn)樗母怕适?的128次方分之1(自己去算算)。
最壞的情況:你在2 ^ 128 - 1次之后得到答案。基本上,這意味著你會(huì)在所有數(shù)據(jù)的末尾找到你的答案。
平均情景:在2 ^ 128/2 = 2 ^ 127次之后, 你會(huì)在中間的某處找到它。從這個(gè)角度來(lái)看,2 ^ 127 = 1.7 *10 ^ 38。換句話(huà)說(shuō),這是一個(gè)巨大的數(shù)字。
所以,雖然可以通過(guò)暴力方法來(lái)打破單向性,但同時(shí)也要有巨大的算力投入。
特性4:雪崩效應(yīng)。
即使 你對(duì)原始輸入數(shù)據(jù)進(jìn)行了小改動(dòng),哈希的結(jié)果差異也非常大。讓我們使用SHA-256對(duì)其進(jìn)行測(cè)試:
即使你只是改變了輸入的第一個(gè)字母表的大小寫(xiě),看看它對(duì)輸出哈希值有多大影響。
這個(gè)特性也被稱(chēng)為雪崩效應(yīng)。
性質(zhì)5:防碰撞
給定兩個(gè)不同的輸入A和B,其中H(A)和H(B)是它們各自的哈希,H(A)等于H(B)是不可行的。這意味著大多數(shù)情況下,每個(gè)輸入都會(huì)有自己獨(dú)特的哈希。為什么我們說(shuō)“大部分”?為了理解這一點(diǎn),我們需要知道什么是“生日悖論”。
什么是生日悖論?
如果你在街上碰到任何陌生人,那么你們兩個(gè)都有相同的生日的可能性非常低。事實(shí)上,假設(shè)一年中的所有日子都有生日的可能性,另一個(gè)人分享你的生日的機(jī)會(huì)是1/365,這是0.27%:概率非常低。
不過(guò),如果你在一個(gè)房間里聚集20-30人,那么兩個(gè)分享完全相同生日的人的幾率會(huì)大幅度上升。
生日悖論
這是基于一個(gè)簡(jiǎn)單的概率原理:
假設(shè)你有一個(gè)事件發(fā)生N種不同的可能性,那么你需要N個(gè)隨機(jī)項(xiàng)的平方根,以使它們有50%的碰撞幾率。
因此,將這個(gè)理論應(yīng)用于生日時(shí), 你有365種不同的生日可能性,所以 你只需要Sqrt(365),即約23%,隨機(jī)選擇兩個(gè)人分享生日的可能性為50%。
假設(shè)你有一個(gè)128位哈希,有2 ^ 128種不同的可能性。通過(guò)使用生日悖論,你有50%的幾率在sqrt(2 ^ 128)= 2 ^ 64的情況下打破防碰撞機(jī)制。
正如你所看到的,打破防碰撞要比打破單向性容易得多。所以,如果你使用的是SHA-256這樣的函數(shù),假設(shè)如果H(A)= H(B),那么A = B是可以認(rèn)為成立。
那么,你如何創(chuàng)建一個(gè)抗碰撞的哈希函數(shù)?為此,我們使用一種稱(chēng)為Merkle-Damgard的結(jié)構(gòu)。
什么是Merkle-Damgard結(jié)構(gòu)?
該結(jié)構(gòu)非常簡(jiǎn)單,并且遵循以下原則:給定短消息的防碰撞哈希函數(shù),我們可以為長(zhǎng)消息構(gòu)造防碰撞哈希函數(shù)。
圖片來(lái)源:youtube
記住上面的圖表,注意以下幾點(diǎn):
較大的消息M被分解為m [i]的較小塊。
哈希函數(shù)H由許多較小的哈希函數(shù)“h”組成。
“h”是一個(gè)較小的哈希函數(shù),又稱(chēng)壓縮函數(shù),它接收一小塊消息并返回一個(gè)哈希。
第一個(gè)哈希函數(shù)“h”(在上圖中圈出)接收第一個(gè)消息塊(m [0]),并添加一個(gè)固定值IV并返回哈希值。
哈?,F(xiàn)在被添加到第二個(gè)消息塊并通過(guò)另一個(gè)哈希
函數(shù)h,并且這一直持續(xù)到最后的消息塊,其中填充塊PB也被添加到消息中。
每個(gè)壓縮函數(shù)h的輸出被稱(chēng)為鏈接變量。
填充塊是一系列1和0。在SHA-256算法中,PB長(zhǎng)64位。
哈希壓縮函數(shù)h的輸出是大消息M的輸出。
既然已經(jīng)了解了哈希方法以及加密哈希函數(shù)的特性,讓我們熟悉一些加密貨幣中最常用的加密哈希函數(shù)。
先把幾種加密哈希算法列出來(lái):
MD 5:它產(chǎn)生一個(gè)128位哈希。在~2 ^ 21哈希后,防碰撞機(jī)制被打破。
SHA 1:生成一個(gè)160位哈希。經(jīng)過(guò)2 ^ 61次哈希后,防碰撞機(jī)制被打破。
SHA 256:產(chǎn)生一個(gè)256位哈希。這是目前比特幣正在使用的。
Keccak-256:產(chǎn)生256位哈希,目前由Ethereum使用。
RIPEMD-160:產(chǎn)生160個(gè)輸出,由比特幣腳本(和SHA-256)使用。
CryptoNight:Monero使用的哈希函數(shù)。
安全哈希算法(SHA)
安全哈希算法是由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)發(fā)布的美國(guó)聯(lián)邦信息處理標(biāo)準(zhǔn)(FIPS)的一系列加密哈希函數(shù)。SHA由以下算法組成:
SHA-0:指1993年發(fā)布的名為“SHA”的原始160位哈希函數(shù)。由于未公開(kāi)的“重大缺陷”,并在稍后修訂的版本SHA-1中取而代之,它在出版后不久被撤回。
SHA-1:當(dāng)SHA-0傳送失敗時(shí)被引入。這是一個(gè)160位哈希函數(shù),類(lèi)似于早期的MD5算法。這是由國(guó)家安全局(NSA)設(shè)計(jì)的數(shù)字簽名算法的一部分。然而,人們注意到加密圖形的弱點(diǎn)之后不久就被拋棄了。
SHA-2:現(xiàn)在我們來(lái)看一下哈希函數(shù)中最受歡迎的類(lèi)別之一。它是由NSA使用Merkle-Damgard范例設(shè)計(jì)的。它們是具有不同字長(zhǎng)的兩種哈希函數(shù)族:SHA-256和SHA-512。比特幣使用SHA-256
SHA-3:之前被稱(chēng)為keccak,它在2012年被非NSA設(shè)計(jì)師的公開(kāi)競(jìng)爭(zhēng)之后選中。它支持與SHA-2相同的哈希長(zhǎng)度,其內(nèi)部結(jié)構(gòu)與SHA系列的其他部分有很大不同。以太坊使用這個(gè)哈希函數(shù)。
圖片來(lái)源:維基百科
讓我們仔細(xì)看看SHA-256和SHA-3。
SHA-256
SHA-256是一個(gè)SHA-2函數(shù),它使用32個(gè)單詞,而不是使用64位單詞的SHA-512。比特幣在以下兩種情況下使用SHA-256:
采礦。
創(chuàng)建地址。
采礦:
比特幣采礦涉及礦工解決復(fù)雜的計(jì)算難題,以找到一個(gè)塊,然后將其附加到比特幣區(qū)塊鏈。就是我們經(jīng)常稱(chēng)的工作量證明(proof-of-work),它涉及SHA-256哈希函數(shù)的計(jì)算。
創(chuàng)建比特幣地址、;
SHA-256哈希函數(shù)用于哈希比特幣公鑰以生成公共地址。哈希密鑰為身份認(rèn)證增加了一層額外的保護(hù)。此外,哈希地址的長(zhǎng)度僅比存儲(chǔ)更好的比特幣公鑰更短。
SHA-256運(yùn)行實(shí)例:
輸入:Hi
輸出:98EA6E4F216F2FB4B69FFF9B3A44842C38686CA685F3F55DC48C5D3FB1107BE4
SHA-3
如上所述,這種算法以前被稱(chēng)為keccak,并被以太坊使用。它是在non-NSA設(shè)計(jì)師的公開(kāi)競(jìng)賽之后創(chuàng)建的。SHA-3使用“海綿(sponge)機(jī)制”。
什么是海綿機(jī)制?
圖片來(lái)源:維基百科
海綿功能是具有有限內(nèi)部狀態(tài)的一類(lèi)算法,其獲取任意長(zhǎng)度的輸入比特流并產(chǎn)生預(yù)定長(zhǎng)度的輸出比特流。
在繼續(xù)之前,我們需要定義一些術(shù)語(yǔ):
我們知道,在海綿功能中,數(shù)據(jù)被“吸收”到海綿中,然后將結(jié)果“擠出”。
所以有一個(gè)“吸收”階段和一個(gè)“擠壓”階段。
SHA-3舉例:
輸入:Hi
輸出:154013cb8140c753f0ac358da6110fe237481b26c75c3ddc1b59eaf9dd7b46a0a3aeb2cef164b3c82d65b38a4e26ea9930b7b2cb3c01da4ba331c95e62ccb9c3
RIPEMD-160哈希函數(shù)
RIPEMD是由比利時(shí)魯汶的Hans Dobbertin,Antoon Bosselaers和Bart Preneel在魯汶Katholieke大學(xué)的COSIC研究小組開(kāi)發(fā)的一系列加密哈希函數(shù),并于1996年首次發(fā)布。
雖然RIPEMD基于MD4的設(shè)計(jì)原則,但其性能與SHA-1非常相似。RIPEMD-160是這種哈希函數(shù)的160位版本,通常用于生成比特幣地址。
比特幣公鑰首先通過(guò)SHA-256哈希函數(shù)運(yùn)行,然后通過(guò)RIPEMD-160運(yùn)行。這樣做的原因是因?yàn)?60位的輸出比256位小很多,這有助于節(jié)省空間。
除此之外,RIPEMD-160是唯一性哈希函數(shù),可以產(chǎn)生最短哈希,其唯一性仍然得到充分保證。
圖片來(lái)源:維基百科
上面的圖像顯示了RIPEMD-160哈希算法壓縮函數(shù)的子塊快照。
RIPEMD -160實(shí)例:
輸入:Hi
輸出:242485ab6bfd3502bcb3442ea2e211687b8e4d89
CryptoNight哈希函數(shù)
現(xiàn)在我們擁有由Monero使用的CryptoNight哈希函數(shù)。與比特幣不同,Monero希望他們的采礦盡可能地不利于GPU。他們可以做到這一點(diǎn)的唯一方法是讓他們的哈希算法難以記憶。
輸入CryptoNight
CryptoNight是一種內(nèi)存硬件哈希函數(shù)。它被設(shè)計(jì)為在GPU,FPGA和ASIC體系結(jié)構(gòu)上無(wú)法有效計(jì)算。CryptoNight的工作原理如下:
該算法首先用偽隨機(jī)數(shù)據(jù)初始化一個(gè)大暫存器。
之后,大量的讀/寫(xiě)操作發(fā)生在偽隨機(jī)地址上
包含在便簽簿中。
最后,整個(gè)暫存器被哈希以產(chǎn)生最終值。
下圖顯示了CryptoNight哈希算法的示意圖。
CryptoNight哈希算法的示意圖。
圖片來(lái)源:Dave’s Data
CryptoNight實(shí)例:
輸入:This is a test
輸出:a084f01d1437a09c6985401b60d43554ae105802c5f5d8a9b3253649c0be6605
結(jié)論
加密貨幣中最常用的四種哈希算法基本都在這里了。對(duì)他們的工作方式有一個(gè)基本的認(rèn)知將讓我們更好的理解各類(lèi)數(shù)字貨幣的區(qū)別(比如采礦)。
-
哈希函數(shù)
+關(guān)注
關(guān)注
0文章
43瀏覽量
9432 -
比特幣
+關(guān)注
關(guān)注
57文章
7002瀏覽量
140128 -
數(shù)字貨幣
+關(guān)注
關(guān)注
36文章
3135瀏覽量
48810
原文標(biāo)題:全面解析區(qū)塊鏈數(shù)字貨幣4種哈希算法原理與差異
文章出處:【微信號(hào):iotbanks,微信公眾號(hào):iotbanks】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論