官术网_书友最值得收藏!

2.3 區塊鏈常用密碼學知識

2.3.1 Hash(哈希)算法

基礎知識

1.邏輯運算符。&(與):所有的都是真結果才是真;|“或”:至少一個為真結果也為真;~(非):真為假,假為真;^(異或):如果a、b兩個值不相同,則異或結果為1,如果a、b兩個值相同,異或結果為0。

2.字節序

  • 計算機硬件有兩種儲存數據的方式:大端字節序(big endian)和小端字節序(little endian)。
  • 舉例來說,數值0x2211使用兩個字節儲存:高位字節是0x22,低位字節是0x11。
  • 大端字節序:高位字節在前,低位字節在后,這是人類讀寫數值的方法。小端字節序:低位字節在前,高位字節在后,即以0x1122形式儲存。

3.循環移位

  • 循環右移就是當向右移時,把編碼的最后的位移到編碼的最前頭,循環左移正相反。例如,對十進制編碼12345678循環右移1位的結果為81234567,而循環左移1位的結果則為23456781。

什么是Hash算法

Hash算法是一種能將任意長度的二進制明文映射為較短的二進制串的算法,并且不同的明文很難映射為相同的Hash值。我們也可以把它理解為空間映射函數——是從一個非常大的取值空間映射到一個非常小的取值空間,由于不是一對一的映射,Hash函數轉換后不可逆,也就是說,不可能通過逆操作和Hash值還原出原始的值。

Hash算法有什么特點

(1)正向快速:給定明文和Hash算法,在有限時間和有限資源內能計算得到Hash值。

(2)逆向困難:給定Hash值,在有限時間內很難逆推導出明文。

(3)輸入敏感:原始輸入信息發生任何變化,新的Hash值都應該出現很大變化。

(4)沖突避免:很難找到兩段內容不同的明文,使得它們的Hash值一致。

常見Hash算法有哪些 MD5和SHA系列,目前MD5和SHA1已經被破解,而SHA2-256算法比較普遍被使用。

Hash算法碰撞 既然輸入數據長度不固定,而輸出的哈希值卻是固定長度的,這意味著哈希值是一個有限集合,而輸入數據則可以是無窮多個,所以建立一對一關系明顯是不現實的。既然“碰撞”是必然會發生的,那么一個成熟的哈希算法要求具備較好的抗沖突性,同時在實現哈希表的結構時,也要考慮到哈希沖突的問題。

比如“666”經過Hash后,其哈希值是“fae0b27c451c728867a567e8c1bb4e53”,相同Hash算法得到的值是一樣的。比如WiFi密碼如果是8位純數字的話,頂多就是99999999種可能性,破解這個密碼需要做的就是提前生成好0到1億數字的Hash值,然后做1億次布爾運算(就是Bool值判斷,0或者1),而現在普通Intel i5四核CPU(每秒能到達200億次浮點數計算)做1億次布爾運算,也就是秒級別的時間就破解了。因此,密碼盡量不要用純數字,密碼空間有限會導致很難構建高安全性。

加鹽防碰撞

常用的防止“碰撞”的方式,就是加鹽(Salt)。其實現原理,就是在原來的明文,加上一個隨機數之后,再進行運算的Hash值,Hash值和鹽通常會分別保存在兩個不同的地方,同時泄露才可能被破解。

  • MD5算法屬于Hash算法中的一種,它具有以下特性:輸入任意長度的信息,經過處理,輸出為128位的信息(數字指紋)。不同的輸入得到不同的結果(唯一性)。根據128位的輸出結果不可能反推出輸入的信息(不可逆)??梢娖淅^承了Hash算法的優良特點,用處很多,如登錄密碼、數字簽名等。

算法實現介紹

MD5是以512位分組來處理輸入的信息,每一分組又被劃分為16個32位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組拼接后生成一個128位Hash值,具體步驟如下:

填充:假如原始信息長度對512求余的結果不等于448(這里說的單位是bit,就是位,1字節(Byte)= 8位(bit)),就需要填充使得對512求余的結果等于448。填充的方法是填充一個1和m個0。填充完后,信息的長度就為n × 512 + 448(這里n表示的是512的整數倍,注意:n也可以為0)。

記錄長度:用64位來存儲填充前信息長度,這64位加在第一步結果的后面,這樣信息長度就變為n × 512 + 448 + 64 =(n+1)*512位,也就是512的整數倍。

設置初始值:MD5的哈希結果長度為128位,按每32位分成一組共4組,這4組結果是由4個初始值A、B、C、D經過不斷計算得到的,分別為16進制的A =0x67452301,B = 0x0EFCDAB89,C = 0x98BADCFE,D = 0x10325476。

準備四個邏輯運算函數:

F(X,Y,Z)=(X & Y)|((~X)& Z)G(X,Y,Z)=(X & Z)|(Y &(~Z))H(X,Y,Z)= X ^ Y ^Z J(X,Y,Z)= Y ^(X |(~Z))

把原始消息數據分成以512位為一組進行處理,每一組進行4輪變換,每一輪對應上面的邏輯運算函數。

每一輪中會把512位的數據按照每一小塊32位長度分成16塊數據,進行16次計算,每一次計算會把對ABCD中的其中三個作一次邏輯運算,然后將所得結果加上第四個變量,16塊數據其中一塊數據和一個常數。再將所得結果向左環移一個規定的數量,并加上ABCD中之一。最后用該結果取代ABCD中之一。

以上面所說的4個常數ABCD為起始變量進行計算,重新輸出4個變量,以這4個變量再進行下一分組的運算,如果已經是最后一個分組,則這4個變量為最后的結果,即MD 5值。

主站蜘蛛池模板: 五指山市| 湘乡市| 萨迦县| 方正县| 淮北市| 普宁市| 扎鲁特旗| 南宫市| 金湖县| 兴化市| 齐齐哈尔市| 孝感市| 滨海县| 宿迁市| 富蕴县| 富民县| 灵山县| 右玉县| 拉萨市| 张家界市| 林州市| 淳化县| 遂溪县| 陇西县| 浠水县| 乌兰县| 利津县| 冷水江市| 正蓝旗| 兴海县| 泌阳县| 扎囊县| 丰台区| 赣州市| 额济纳旗| 垫江县| 昭平县| 定边县| 祥云县| 广西| 仙游县|