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

評論