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

2.3 區(qū)塊鏈常用密碼學知識

2.3.1 Hash(哈希)算法

基礎知識

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

2.字節(jié)序

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

3.循環(huán)移位

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

什么是Hash算法

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

Hash算法有什么特點

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

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

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

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

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

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

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

加鹽防碰撞

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

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

算法實現(xiàn)介紹

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

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

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

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

準備四個邏輯運算函數(shù):

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))

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

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

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

主站蜘蛛池模板: 秦皇岛市| 同心县| 密云县| 饶河县| 高安市| 灵宝市| 河源市| 桐城市| 大丰市| 铁岭县| 宁晋县| 马关县| 福清市| 柏乡县| 龙川县| 康平县| 华坪县| 阜阳市| 马龙县| 尚志市| 年辖:市辖区| 彭州市| 灵台县| 沅陵县| 元朗区| 桐乡市| 苍梧县| 黄大仙区| 青田县| 平原县| 阳新县| 久治县| 大名县| 嘉兴市| 分宜县| 修水县| 绥滨县| 白玉县| 西安市| 若羌县| 兰坪|