block hash區塊雜湊遊戲玩法規則開發原理(下)

nice1022發表於2022-03-31

上篇文章,我們講解了關於雜湊的原理以及舉例,這篇文章我們繼續講解:

常見的雜湊演算法

1SHA-1演算法SHA-1的輸入是最大長度小於264位的訊息,輸入訊息以512位的分組為單位進行處理,輸出是160位的訊息摘要。SHA-1具有實現速度高、容易實現、應用範圍廣等優點,其演算法描述如下。


區塊雜湊遊戲系統開發,開發薇芯:hkkf5566,規則定製,模式定製,鏈上雜湊dapp遊戲開發搭建


對輸入的訊息進行填充:經過填充後,訊息的長度模512應與448同餘。填充的方式為第一位是1,餘下各位都為0。再將訊息被填充前的長度以big-endian的方式附加在上一步留下的最後64位中。該步驟是必須的,即使訊息的長度已經是所希望的長度。填充的長度範圍是1到512。

初始化緩衝區:可以用160位來存放Hash函式的初始變數、中間摘要及最終摘要,但首先必須進行初始化,對每個32位的初始變數賦值,即:

進入訊息處理主迴圈,處理訊息塊:一次處理512位的訊息塊,總共進行4輪處理,每輪進行20次操作,如圖所示。這4輪處理具有類似的結構,但每輪所使用的輔助函式和常數都各不相同。每輪的輸入均為當前處理的訊息分組和緩衝區的當前值A、B、C、D、E,輸出仍放在緩衝區以替代舊的A、B、C、D、E的值。第四輪的輸出再與第一輪的輸入CVq相加,以產生CVq+1,其中加法是緩衝區5個字CVq中的每個字與中相應的字模232相加。

圖 單個512位訊息塊的處理流程

輸出:所有的訊息分組都被處理完之後,最後一個分組的輸出即為得到的訊息摘要值。

SHA-1的步函式如圖所示,它是SHA-1最為重要的函式,也是SHA-1中最關鍵的部件。

圖 SHA-1的步函式

SHA-1每執行一次步函式,A、B、C、D的值就會依次賦值給B、C、D、E這幾個暫存器。同時,A、B、C、D、E的輸入值、常數和子訊息塊在經過步函式運算後就會賦值給A。

其中,t是步數,0≤t≤79,Wt是由當前512位長的分組匯出的一個32位的字,Kt是加法常量。

基本邏輯函式f的輸入是3個32位的字,輸出是一個32位的字,其函式表示如下。

對於每個輸入分組匯出的訊息分組wt,前16個訊息字wt(0≤t≤15)即為訊息輸入分組對應的16個32位字,其餘wt(0≤t≤79)可按如下公式得到:

其中,ROTLs表示左迴圈移位s位,如圖所示。

圖 SHA-1的80個訊息字的產生過程

2SHA-2演算法SHA-2系列Hash演算法,其輸出長度可取SHA-2系列雜湊演算法的輸出長度可取224位、256位、384位、512位,分別對應SHA-224、SHA-256、SHA-384、SHA-512。它還包含另外兩個演算法:SHA-512/224、SHA-512/256。比之前的Hash演算法具有更強的安全強度和更靈活的輸出長度,其中SHA-256是常用的演算法。下面將對前四種演算法進行簡單描述。

SHA-256演算法SHA-256演算法的輸入是最大長度小於264位的訊息,輸出是256位的訊息摘要,輸入訊息以512位的分組為單位進行處理。演算法描述如下。

(1)訊息的填充新增一個“1”和若干個“0”使其長度模512與448同餘。在訊息後附加64位的長度塊,其值為填充前訊息的長度。從而產生長度為512整數倍的訊息分組,填充後訊息的長度最多為264位。

(2)初始化連結變數連結變數的中間結果和最終結果儲存於256位的緩衝區中,緩衝區用8個32位的暫存器A、B、C、D、E、F、G和H表示,輸出仍放在緩衝區以代替舊的A、B、C、D、E、F、G、H。首先要對連結變數進行初始化,初始連結變數儲存於8個暫存器A、B、C、D、E、F、G和H中:

初始連結變數是取自前8個素數(2、3、5、7、11、13、17、19)的平方根的小數部分其二進位制表示的前32位。

(3)處理主迴圈模組訊息塊是以512位分組為單位進行處理的,要進行64步迴圈操作(如圖所示)。每一輪的輸入均為當前處理的訊息分組和得到的上一輪輸出的256位緩衝區A、B、C、D、E、F、G、H的值。每一步中均採用了不同的訊息字和常數,下面將給出它們的獲取方法。

圖 SHA-256的壓縮函式

(4)得出最終的Hash值所有512位的訊息塊分組都處理完以後,最後一個分組處理後得到的結果即為最終輸出的256位的訊息摘要。

步函式是SHA-256中最為重要的函式,也是SHA-256中最關鍵的部件。其運算過程如圖所示。

圖 SHA-256的步函式

根據T1、T2的值,對暫存器A、E進行更新。A、B、C、E、F、G的輸入值則依次賦值給B、C、D、F、G、H。

Kt的獲取方法是取前64個素數(2,3,5,7,……)立方根的小數部分,將其轉換為二進位制,然後取這64個數的前64位作為Kt。其作用是提供了64位隨機串集合以消除輸入資料裡的任何規則性。

對於每個輸入分組匯出的訊息分組Wt,前16個訊息字Wt(0≤t≤15)直接按照訊息輸入分組對應的16個32位字,其他的則按照如下公式來計算得出:

圖 SHA-256的64個訊息字的生成過程

SHA-512演算法SHA-512是SHA-2中安全效能較高的演算法,主要由明文填充、訊息擴充套件函式變換和隨機數變換等部分組成,初始值和中間計算結果由8個64位的移位暫存器組成。該演算法允許輸入的最大長度是2128位,併產生一個512位的訊息摘要,輸入訊息被分成若干個1024位的塊進行處理,具體引數為:訊息摘要長度為512位;訊息長度小於2128位;訊息塊大小為1024位;訊息字大小為64位;步驟數為80步。下圖顯示了處理訊息、輸出訊息摘要的整個過程,該過程的具體步驟如下。

圖 SHA-512的整體結構

訊息填充:填充一個“1”和若干個“0”,使其長度模1024與896同餘,填充位數為0-1023,填充前訊息的長度以一個128位的欄位附加到填充訊息的後面,其值為填充前訊息的長度。

連結變數初始化:連結變數的中間結果和最終結果都儲存於512位的緩衝區中,緩衝區用8個64位的暫存器A、B、C、D、E、F、G、H表示。初始連結變數也儲存於8個暫存器A、B、C、D、E、F、G、H中,其值為:

初始連結變數採用big-endian方式儲存,即字的最高有效位元組儲存於低地址位置。初始連結變數取自前8個素數的平方根的小數部分其二進位制表示的前64位。

主迴圈操作:以1024位的分組為單位對訊息進行處理,要進行80步迴圈操作。每一次迭代都把512位緩衝區的值A、B、C、D、E、F、G、H作為輸入,其值取自上一次迭代壓縮的計算結果,每一步計算中均採用了不同的訊息字和常數。

計算最終的Hash值:訊息的所有N個1024位的分組都處理完畢之後,第N次迭代壓縮輸出的512位連結變數即為最終的Hash值。

步函式是SHA-512中最關鍵的部件,其運算過程類似SHA-256。每一步的計算方程如下所示,B、C、D、F、G、H的更新值分別是A、B、C、E、F、G的輸入狀態值,同時生成兩個臨時變數用於更新A、E暫存器。

對於80步操作中的每一步t,使用一個64位的訊息字Wt,其值由當前被處理的1024位訊息分組Mi匯出,匯出方法如圖所示。前16個訊息字Wt(0≤t≤15)分別對應訊息輸入分組之後的16個32位字,其他的則按照如下公式來計算得出:

圖 SHA-512的80個訊息字生成的過程

其中,

式中,ROTRn(X)表示對64位的變數x迴圈右移n位,SHRn(X)表示對64位的變數x右移n位。

從圖可以看出,在前16步處理中,Wt的值等於訊息分組中相對應的64位字,而餘下的64步操作中,其值是由前面的4個值計算得到的,4個值中的兩個要進行移位和迴圈移位操作。

Kt的獲取方法是取前80個素數(2,3,5,7,……)立方根的小數部分,將其轉換為二進位制,然後取這80個數的前64位作為Kt,其作用是提供了64位隨機串集合以消除輸入資料裡的任何規則性。

SHA-224與SHA-384SHA-256和SHA-512是很新的Hash函式,前者定義一個字為32位,後者則定義一個字為64位。實際上二者的結構是相同的,只是在迴圈執行的次數、使用常數上有所差異。SHA-224及SHA-384則是前述兩種Hash函式的截短型,它們利用不同的初始值做計算。

SHA-224的輸入訊息長度跟SHA-256的也相同,也是小於264位,其分組的大小也是512位,其處理流程跟SHA-256也基本一致,但是存在如下兩個不同的地方。

SHA-224的訊息摘要取自A、B、C、D、E、F、G共7個暫存器的位元字,而SHA-256的訊息摘要取自A、B、C、D、E、F、G、H共8個暫存器的32位元字。

SHA-224的初始連結變數與SHA-256的初始連結變數不同,它採用高階格式儲存,但其初始連結變數的獲取方法是取前第9至16個素數(23、29、31、37、41、43、47、53)的平方根的小數部分其二進位制表示的第二個32位,SHA-224的初始連結變數如下:

SHA-224的詳細計算步驟與SHA-256一致。

SHA-384的輸入訊息長度跟SHA-512相同,也是小於2128位,而且其分組的大小也是1024位,處理流程跟SHA-512也基本一致,但是也有如下兩處不同的地方。

SHA-384的384位的訊息摘要取自A、B、C、D、E、F共6個64位元字,而SHA-512的訊息摘要取自A、B、C、D、E、F、G、H共8個64位元字。

SHA-384的初始連結變數與SHA-512的初始連結變數不同,它也採用高階格式儲存,但其初始連結變數的獲取方法是取前9至16個素數(23、29、31、37、41、43、47、53)的平方根的小數部分其二進位制表示的前64位,SHA-384的初始連結變數如下:

SHA-384的詳細計算步驟與SHA-512的相同。

3SHA-3演算法SHA-3演算法整體採用Sponge結構,分為吸收和榨取兩個階段。SHA-3的核心置換f作用在5×5×64的三維矩陣上。整個f共有24輪,每輪包括5個環節θ、ρ、π、χ、τ。演算法的5個環節分別作用於三維矩陣的不同維度之上。θ環節是作用在列上的線性運算;ρ環節是作用在每一道上的線性運算,將每一道上的64位元進行迴圈移位操作;π環節是將每道上的元素整體移到另一道上的線性運算;χ環節是作用在每一行上的非線性運算,相當於將每一行上的5位元替換為另一個5位元;τ環節是加常數環節。

目前,公開文獻對SHA-3演算法的安全性分析主要是從以下幾個方面來展開的。

對SHA-3演算法的碰撞攻擊、原像攻擊和第二原像攻擊。

對SHA-3演算法核心置換的分析,這類分析主要針對演算法置換與隨機置換的區分來展開。

對SHA-3演算法的差分特性進行展開,主要研究的是SHA-3置換的高概率差分鏈,並構築差分割槽分器。

Keccak演算法的立體加密思想和海綿結構,使SHA-3優於SHA-2,甚至AES。Sponge函式可建立從任意長度輸入到任意長度輸出的對映。

4RIPEMD160演算法RIPEMD(RACE Integrity Primitives Evaluation Message Digest),即RACE原始完整性校驗訊息摘要。RIPEMD使用MD4的設計原理,並針對MD4的演算法缺陷進行改進,1996年首次釋出RIPEMD-128版本,它在效能上與SHA-1相類似。

RIPEMD-160是對RIPEMD-128的改進,並且是RIPEMD中最常見的版本。RIPEMD-160輸出160位的Hash值,對160位Hash函式的暴力碰撞搜尋攻擊需要280次計算,其計算強度大大提高。RIPEMD-160的設計充分吸取了MD4、MD5、RIPEMD-128的一些效能,使其具有更好的抗強碰撞能力。它旨在替代128位Hash函式MD4、MD5和RIPEMD。

RIPEMD-160使用160位的快取區來存放演算法的中間結果和最終的Hash值。這個快取區由5個32位的暫存器A、B、C、D、E構成。暫存器的初始值如下所示:

資料儲存時採用低位位元組存放在低地址上的形式。

處理演算法的核心是一個有10個迴圈的壓縮函式模組,其中每個迴圈由16個處理步驟組成。在每個迴圈中使用不同的原始邏輯函式,演算法的處理分為兩種不同的情況,在這兩種情況下,分別以相反的順序使用5個原始邏輯函式。每一個迴圈都以當前分組的訊息字和160位的快取值A、B、C、D、E為輸入得到新的值。每個迴圈使用一個額外的常數,在最後一個迴圈結束後,兩種情況的計算結果A、B、C、D、E和A′、B′、C′、D′、E′及連結變數的初始值經過一次相加運算產生最終的輸出。對所有的512位的分組處理完成之後,最終產生的160位輸出即為訊息摘要。

除了128位和160位的版本之外,RIPEMD演算法也存在256位和320位的版本,它們共同構成RIPEMD家族的四個成員:RIPEMD-128、RIPEMD-160、RIPEMD-256、RIPEMD-320。其中128位版本的安全性已經受到質疑,256位和320位版本減少了意外碰撞的可能性,但是相比於RIPEMD-128和RIPEMD-160,它們不具有較高水平的安全性,因為他們只是在128位和160位的基礎上,修改了初始引數和s-box來達到輸出為256位和320位的目的。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011332/viewspace-2885239/,如需轉載,請註明出處,否則將追究法律責任。

相關文章