keccak算法


一 什么是Keccak

Keccak是一種被選定為SHA-3標准的單向散列函數算法。

Keccak可以生成任意長度的散列值,但為了配合SHA-2的散列值長度,SHA-3標准中規定了SHA3-224、SHA3-256、SHA3-384、SHA3-512這4種版本。在輸入數據的長度上限方面,SHA-1為2的64次方-1比特,SHA-2為2的128次方-1比特,而SHA-3則沒有長度限制。

此為,FIPS 202還規定了兩個可輸出任意長度散列值的函數,分別為SHAKE128和SHAKE256。據說SHAKE這個名字取自Secure Hash Algorithm與Keccak這幾個單詞。

順便一提,Keccak的設計者之一Billes Van Assche在Github上發布了一款名為KeccakTools的軟件。地址如下:https://github.com/KeccakTeam/KeccakTools

二 海綿結構

Keccak采用了與SHA-1、SHA-2完全不同的海綿結構,如下圖:

 

Keccak的海綿結構中,輸入的數據在進行填充之后,要經過吸收階段和擠出階段,最終生成輸出的散列值。

“海綿結構”這個名字聽上去有點奇怪,可以想象以下將一塊海綿泡在水里吸水,然后再將里面的水擠出來的情形。同樣地,Keccak的海綿結構是先將輸入的消息吸收到內部狀態,然后再根據內部狀態擠出相應的散列值。

1 吸收階段流程

將經過填充的輸入消息按照每r比特為一組分割成若干個輸入分組

首先,將“內部狀態的r比特”與“輸入分組1”進行XOR,將其結果作為“函數f的輸入值”

然后,將“函數f的輸出值r個比特”與“輸入分組2”進行XOR,將其結果再次作為“函數f的輸入值”

反復執行上述步驟,直到達到最后一個輸入分組

等所有的輸入分組處理完成后,結束吸收階段,進入擠出階段

函數f的作用是將輸入的數據進行復雜的攪拌操作並輸出結果(輸入和輸出的長度均為b=r+c個比特),其操作對象是長度為b=r+c個比特的內部狀態,內部狀態的初始值為0.也就是說,通過反復將輸入分組的內容攪拌進來,整個消息就會被一點一點地“吸收”到海綿結構的內部狀態中,就好像水分被一點點吸進海綿內部一樣,每次被吸收的輸入分組長度為r個比特,因此r被稱為比特率。

通過上圖可以看出,函數f的輸入長度不是r個比特,而是r+c個比特,這意味着內部狀態中有c個比特時不受輸入分組內容直接影響的(但會通過函數f受到間接影響)。這里的c被稱為容量。

2 擠出階段流程

首先,將“函數f的輸出值中的r個比特”保存為“輸出分組1”,並將整個輸出值(r+c個比特)再次輸入到函數f中

然后,將“函數f的樹池值中的r個比特”保存為“輸出分組2”,並將整個輸出值(r+c個比特)再次輸入到函數f中

反復執行上面的步驟,直到獲得所需長度的輸出數據

無論是吸收階段還是擠出階段,函數f的邏輯本身是完全一樣的,每執行一次函數f,海綿結構的內部狀態都會被攪拌一次。

擠出階段中實際上執行的是“對內部狀態進行攪拌並產生輸出分組(r比特)”的操作,也就是以比特率(r個比特)為單位,將海綿結構內部狀態中的數據一點一點擠出來,就像從海綿里面把水擠出來一樣。

在擠出階段,內部狀態r+c個比特中的容量(c個比特)部分是不會直接進入輸出分組的,這部分數據值會通過函數f間接影響輸出內容。因此,容量c的意義在於防止將輸入消息中的一些特征泄露出去。

三 雙工結構

作為海綿結構的變形,Keccak中還提出了一種雙工結構,如下圖:

 

 

在海綿結構中,只有將輸入的消息全部吸收完畢之后才能開始輸出,但在雙工結構中,輸入和輸出是以相同的速率進行的。在雙向通信中,發送和接收同時進行的方式稱為全雙工,Keccak的雙工結構也代表同樣的含義。

通過采用雙工結構,Keccak不僅可用於計算散列值,還可以覆蓋密碼學家工具箱中的其他多種用途,如偽隨機數生成器、流密碼、認證加密、消息認證碼等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM