寫在前面:
本文思路及部分圖片來自《密碼編碼學(xué)與網(wǎng)絡(luò)安全——原理與實踐(第七版)》
零、基本概念
SHA3:一種HASH函數(shù)標準铅协。
輸入可變長度n bits消息數(shù)據(jù),輸出固定長度 bits 數(shù)據(jù)
一、算法步驟
輸入n bits數(shù)據(jù) 填充(padding)分組吸水(absorbing)(分組丟進函數(shù)里后得出的結(jié)果與下一分組運算以此迭代)擠壓(squeezing)輸出 bits數(shù)據(jù)
注:以上過程亦稱為海綿結(jié)構(gòu)
二、具體過程
0.填充+分組
(0). 首先定好分組長度(一般取)
(1). 對數(shù)據(jù)向后填充割坠,使填充后的數(shù)據(jù)長度可整除;填充的位數(shù)
注意區(qū)間開閉:即若原先,也應(yīng)填充位數(shù)據(jù)
(2). 填充后得到數(shù)據(jù)妒牙,且彼哼。分為個分組,每個分組有bits 數(shù)據(jù)
其中填充的方法:
- 簡單填充:n+"10...0"
- 多重位速率填充:n+"10..1"
(其實就是最后一位不同)
1.吸水
(0). 每個分組內(nèi)湘今,bits數(shù)據(jù)向后擴充bits (填充“0”即可)敢朱,一般,得位的數(shù)據(jù)
(1). 第一個分組與全零運算后函數(shù)得到
(2). 第二個分組與運算函數(shù)迭代
以此迭代
(3). 得到 (b bits)
2.擠壓
- 若 ,取前 bits 作為輸出數(shù)據(jù)
- 若 時
(0). 取 前bits 數(shù)據(jù)
(1). 將 丟進函數(shù)迭代以更新
(2). 重復(fù)步驟(1)(2),產(chǎn)生數(shù)據(jù)
直到數(shù)據(jù) 長度大于或等于 ,取前 bits 數(shù)據(jù)作為輸出結(jié)果
這個圖不科學(xué):, 應(yīng)該畫比長(不要被誤解)。
三、吸水擠壓過程中的函數(shù)
作用:輸入 bits數(shù)據(jù)拴签,輸出 bits數(shù)據(jù)
過程:共有五個過程孝常;執(zhí)行順序依次是 。以此循環(huán)24輪蚓哩,輸出构灸。
0. 執(zhí)行前
執(zhí)行算法前,將 1600bits數(shù)據(jù)構(gòu)建成一個 的三維矩陣 , 其中 稱為行和列岸梨,64個位合起來稱為一縱喜颁。用記為列,為行曹阔,為縱里的bit坐標洛巢,
用標記為一個bit的坐標號,且以左下角為0向上向右坐標標號遞增
看以下以魔方為例子:
黃紅綠+紅綠+紅綠白構(gòu)成一列
黃紅藍+黃紅+黃紅綠構(gòu)成一行
黃紅綠+黃綠+黃橙綠構(gòu)成一縱
記紅藍白(左下角)為坐標 [0,0,0],向上行數(shù)增加,向右列數(shù)增加芥炭,從里向外縱內(nèi) 值增加漓库;例如:紅綠塊記為 a[2,1,0],即第二列第一行第零塊。同理:純綠塊記為 a[2,1,1]...以此類推园蝠。
此步驟的思路可借鑒魔方盲擰構(gòu)建坐標的方法
注意:計算時所有值應(yīng)該5渺蒿,加法也是運算
1. 過程(基于列的位代換)
公式:
以魔方為例:
純黃塊=純黃塊(黃藍+純藍+藍白)(黃紅綠+紅綠+紅綠白)
2. 過程(縱內(nèi)循環(huán)位移)
公式:
t表如下:
3.過程(縱間混淆)
公式:
此步與縱內(nèi)無關(guān)茂装,僅是行和列的計算,可當成二維的運算善延。計算后結(jié)果:
4.過程(基于行的位代換)
公式:
以魔方為例:
黃紅藍=黃紅藍XOR非黃紅XOR黃紅綠
5. 過程(第一縱變換)
公式:
其中RC為輪常量易遣,查表可得; 為輪序數(shù)彼妻。
即每一輪計算時,用該輪次的 值與該輪第一縱計算豆茫。
5個步驟侨歉,循環(huán)24次(24輪)后輸出