滕飛, 李永珍
( 延邊大學(xué) 工學(xué)院, 吉林 延吉 133002 )
區(qū)塊鏈技術(shù)由于具有能保障避數(shù)據(jù)安全、提高協(xié)同效率和控制風(fēng)險(xiǎn)等優(yōu)點(diǎn),因此其在數(shù)字貨幣、智能合約、供應(yīng)鏈管理、物聯(lián)網(wǎng)金融等方面得到應(yīng)用[1-2].但隨著區(qū)塊鏈技術(shù)的廣泛應(yīng)用,現(xiàn)有的區(qū)塊鏈技術(shù)在處理數(shù)據(jù)的效率方面逐漸難以滿足人們的要求,因此提高區(qū)塊鏈技術(shù)處理數(shù)據(jù)的效能具有重要意義.針對區(qū)塊鏈中的哈希函數(shù)計(jì)算效率較低進(jìn)而影響區(qū)塊鏈整體計(jì)算效率的問題,文獻(xiàn)[3]提出了一種基于FPGA的區(qū)塊鏈哈希加速優(yōu)化算法,但文獻(xiàn)的作者并未對該優(yōu)化算法的安全性方面進(jìn)行說明.文獻(xiàn)[4]對SHA - 2系列算法進(jìn)行了改進(jìn),改進(jìn)后的算法的安全性雖然比原算法有所提高,但其效率與原算法基本相同.基于上述研究,本文針對SHA - 256的迭代結(jié)構(gòu)進(jìn)行改進(jìn),并通過效率測試實(shí)驗(yàn)和雪崩效應(yīng)實(shí)驗(yàn)驗(yàn)證了改進(jìn)后的SHA - 256算法可有效提高區(qū)塊鏈的效率和安全性.
區(qū)塊鏈中的數(shù)據(jù)結(jié)構(gòu)通常由區(qū)塊頭(塊頭)和區(qū)塊體(塊身)組成,如圖1所示[5].區(qū)塊頭一般包括版本號(hào)、前一區(qū)塊的Hash值(Hash指針)、隨機(jī)數(shù)、目標(biāo)Hash值(本區(qū)塊的Hash值)、Merkle根等.區(qū)塊體保存的是若干條記錄以及由每條記錄的Hash值構(gòu)成的二叉Merkle樹[6].由于哈希函數(shù)具有單向性、抗碰撞性等特點(diǎn),因此其目前被廣泛應(yīng)用于區(qū)塊鏈技術(shù)中.哈希算法在區(qū)塊鏈技術(shù)中的主要作用是將一個(gè)交易區(qū)塊中的交易信息轉(zhuǎn)換成一個(gè)哈希值(區(qū)塊鏈通過比對交易信息的哈希值來確定信息有無被篡改),以及用于數(shù)據(jù)加密、共識(shí)計(jì)算的工作量證明、區(qū)塊之間的鏈接等[7-9].
圖1 區(qū)塊數(shù)據(jù)結(jié)構(gòu)圖
傳統(tǒng)的SHA-256算法是將任意長度的字符串壓縮成固定長度的字符串的一種算法.該算法的壓縮過程為:首先利用一種不可逆的方式將接收到的一段明文轉(zhuǎn)化為一段長度較短、位數(shù)固定的散列值,然后通過處理明文生成一個(gè)256 bit長的哈希值(消息摘要),最后通過比對哈希值確定信息是否被篡改[10].
SHA-256算法的加密過程如下:
第1步 初始化常量.初始化常量包括8個(gè)哈希初值(如表1所示)和64個(gè)哈希常量.
表1 SHA - 256算法的哈希初值
第2步 信息處理.信息處理的方式是在報(bào)文末尾對數(shù)據(jù)進(jìn)行填充.填充方法是:補(bǔ)充第1個(gè)比特,為數(shù)字1; 剩余的比特?cái)?shù)補(bǔ)充數(shù)字0.填充的結(jié)果是報(bào)文長度對512取模以后的余數(shù)為448.
第3步 計(jì)算消息摘要.本文采用函數(shù)迭代的方式計(jì)算消息摘要,由此共生成64個(gè)字.其中前16個(gè)字(記為w[0],…,w[15])由塊分解(將消息分解成512 bit大小的塊,每個(gè)字的大小為32 bit[11])產(chǎn)生,其余48個(gè)字由迭代公式得到.迭代公式[12]為:
Wt=σ1(Wt -2)+Wt -7+σ0(Wt -15)+Wt -16.
SHA - 256算法中的映射函數(shù)一共包含64次加密循環(huán)次數(shù),如圖2所示.在圖2中:ABCDEFGH這8個(gè)字(word)按照一定的規(guī)則進(jìn)行更新,其初始值分別為h0、h1、h2、h3、h4、h5、h6、h7;Kt對應(yīng)的是64個(gè)常量;Wt是本區(qū)塊產(chǎn)生的第t個(gè)字.對ABCDEFGH這8個(gè)字進(jìn)行循環(huán)加密的過程中,最后一次循環(huán)所產(chǎn)生的8個(gè)字合起來即是第i個(gè)塊對應(yīng)到的散列字符串.SHA - 256算法中的邏輯運(yùn)算如表2所示.
圖2 映射函數(shù)的加密循環(huán)示意圖
表2 SHA - 256算法中的邏輯運(yùn)算
針對傳統(tǒng)的SHA - 256算法無法滿足區(qū)塊鏈對大數(shù)據(jù)的快速處理,本文對傳統(tǒng)的SHA - 256算法做如下改進(jìn):首先將SHA - 256算法按512位進(jìn)行分組劃分,并且將每一個(gè)分組再劃分為8個(gè)64位子分組;其次對報(bào)文進(jìn)行處理后,算法的輸出由原來的8個(gè)32位分組變?yōu)?個(gè)64位分組;最后將上述4個(gè)64位分組級(jí)聯(lián)生成一個(gè)256位的散列值.
改進(jìn)的SHA - 256算法的執(zhí)行過程如下:
第1步 在報(bào)文末尾處進(jìn)行數(shù)據(jù)填充,填充后的報(bào)文長度對512取模后其余數(shù)為448.填充的方法是首先在原報(bào)文末尾處添加1個(gè)比特(用數(shù)字1表示),然后補(bǔ)充剩余的比特?cái)?shù)(用數(shù)字0表示).
第2步 用64位比特?cái)?shù)記錄填充前的信息長度.
第3步 在改進(jìn)的SHA - 256算法中裝入標(biāo)準(zhǔn)的幻數(shù),標(biāo)準(zhǔn)的幻數(shù)為:
A為0x36d219f41e0342b5,
B為0xf807493c33fac611,
C為0x1479c317abbfce09,
D為0x4dbabfa350149e5c.
第4步 對改進(jìn)的SHA - 256算法進(jìn)行4輪循環(huán)運(yùn)算(每輪16個(gè)步驟),各輪所使用的線性函數(shù)如表3.
表3 每輪循環(huán)運(yùn)算中的線性函數(shù)
圖3 改進(jìn)的SHA - 256算法中的單次循環(huán)示意圖
表4 名文字順序
圖4 改進(jìn)的SHA - 256算法的運(yùn)算流程
為了降低傳統(tǒng)SHA - 256算法的復(fù)雜度,對上述改進(jìn)的SHA - 256算法進(jìn)行優(yōu)化,即將算法中主循環(huán)的每輪16次迭代變?yōu)?次迭代,由此4輪迭代可共減少32次迭代.減少迭代次數(shù)(32次)后,明文字Mj的數(shù)量和順序如表5所示.對比表4可知,算法減少32次迭代后,每輪所需要的明文字?jǐn)?shù)量比之前減少了一半,由此表明減少迭代次數(shù)可有效提高算法的效率.
表5 名文字順序
1)窮舉攻擊.本文采用天河二號(hào)超級(jí)計(jì)算機(jī)(計(jì)算速度為每秒3.39×1016次)對改進(jìn)的SHA - 256算法進(jìn)行抗窮舉攻擊驗(yàn)證.經(jīng)計(jì)算知,采用天河二號(hào)超級(jí)計(jì)算機(jī)進(jìn)行窮舉攻擊破解時(shí)平均需要運(yùn)行1.22×1053a,由此說明改進(jìn)的SHA - 256算法對抗窮舉攻擊具有良好的安全性.
2)生日攻擊.由生日攻擊原理可知,對改進(jìn)后的SHA - 256算法進(jìn)行生日攻擊時(shí)大概需要嘗試2128次哈希,若使用天河二號(hào)超級(jí)計(jì)算機(jī)對改進(jìn)后的SHA - 256算法進(jìn)行生日攻擊破解時(shí)平均需要運(yùn)行3.6×1014a,這說明改進(jìn)后的SHA - 256算法對生日攻擊具有良好的安全性.
3)差分攻擊.由于改進(jìn)的SHA - 256算法與傳統(tǒng)的SHA - 256算法具有相同的迭代次數(shù)(64次),因此改進(jìn)的SHA - 256算法也可以有效抵抗現(xiàn)有的差分攻擊.
4)雪崩效應(yīng).選取100對報(bào)文進(jìn)行雪崩效應(yīng)實(shí)驗(yàn).改進(jìn)后的SHA - 256算法和傳統(tǒng)的SHA - 256算法的雪崩效應(yīng)實(shí)驗(yàn)結(jié)果見圖5—圖7.由圖可以看出,改進(jìn)的64次迭代的SHA - 256算法和改進(jìn)的32次迭代的SHA - 256算法的壞點(diǎn)出現(xiàn)概率分別為3%和5%,而傳統(tǒng)的SHA - 256算法的壞點(diǎn)出現(xiàn)概率為5%.這表明改進(jìn)的64次迭代的SHA - 256算法的雪崩效果優(yōu)于傳統(tǒng)的SHA - 256算法.
圖5 改進(jìn)后的SHA - 256(32 steps)算法的雪崩實(shí)驗(yàn)結(jié)果
圖6 改進(jìn)后的SHA - 256(64 steps)算法的雪崩實(shí)驗(yàn)結(jié)果
圖7 傳統(tǒng)的SHA - 256(64 steps)算法的雪崩實(shí)驗(yàn)結(jié)果
為了驗(yàn)證方法的有效性,將改進(jìn)的SHA - 256算法的處理速率分別與傳統(tǒng)的SHA - 256算法和MD5算法的處理速率進(jìn)行了比較.實(shí)驗(yàn)利用Python語言編程實(shí)現(xiàn).計(jì)算機(jī)的配置為: Interl(R) Core(TM) i 5 - 5200U CPU@2.2 GHZ處理器, 64位win7操作系統(tǒng).實(shí)驗(yàn)數(shù)據(jù)選取6個(gè)不同字節(jié)的數(shù)據(jù),加密次數(shù)為10 000次.實(shí)驗(yàn)結(jié)果如圖8—圖10所示.由圖可以看出,改進(jìn)的64次迭代的SHA - 256算法和32次迭代的SHA - 256算法的計(jì)算效率比傳統(tǒng)的SHA - 256算法平均分別提高了24%和140%, 改進(jìn)的32次迭代的SHA - 256算法平均計(jì)算效率比MD5算法提高了32%.
圖8 改進(jìn)的SHA - 256(32 steps)算法和MD5算法的處理速率
圖9 改進(jìn)的SHA - 256(32 steps)算法和傳統(tǒng)的SHA - 256算法的處理速率
圖10 改進(jìn)的SHA - 256(64 steps)算法和傳統(tǒng)的SHA - 256算法的處理速率
研究表明,在保證算法安全性的基礎(chǔ)上,本文改進(jìn)的SHA - 256算法(64 steps和32 steps)的計(jì)算效率比傳統(tǒng)的SHA - 256算法分別提高了24%和140%,改進(jìn)的32 次迭代的SHA - 256算法的平均計(jì)算效率比MD5算法提高了32%,因此本文研究方法可為區(qū)塊鏈技術(shù)提高數(shù)據(jù)處理效率提供參考.在今后的研究中,我們將在哈希函數(shù)中引入隨機(jī)組合結(jié)構(gòu),以此進(jìn)一步提高本文改進(jìn)算法的安全性和適用性.