簡(jiǎn)述Keccak算法

如果要評(píng)選出一個(gè)最出名的哈希算法,那一定是SHA系列算法,其中SHA-2更是目前使用場(chǎng)景最多的哈希算法。這時(shí)就有小伙伴要問(wèn)了,有SHA-1和SHA-2,那么有沒(méi)有SHA-3呢?當(dāng)然有,下面我們就來(lái)了解一下當(dāng)選SHA-3標(biāo)準(zhǔn)的Keccak算法。

Keccak算法簡(jiǎn)介

2007年起,NIST開(kāi)始向全球公開(kāi)征集SHA-3標(biāo)準(zhǔn),要求新的算法在保持SHA-2的在線(xiàn)處理能力之外,還必須能夠處理小數(shù)據(jù)塊。最終在2012年,經(jīng)過(guò)層層篩選,Keccak在64種算法中脫穎而出,最終當(dāng)選SHA-3標(biāo)準(zhǔn)。

Keccak的結(jié)構(gòu)仍然屬于Merkle提出的迭代哈希函數(shù)節(jié)點(diǎn)。最大的創(chuàng)新是采用了一種新的迭代結(jié)構(gòu),稱(chēng)為海綿結(jié)構(gòu)。海綿結(jié)構(gòu)也叫海綿功能。在海綿函數(shù)中,輸入數(shù)據(jù)被分成固定長(zhǎng)度的數(shù)據(jù)包。每一組作為迭代的輸入逐一進(jìn)行,上一次迭代的輸出也反饋給下一次迭代,最終生成輸出哈希值。

海綿函數(shù)允許輸入長(zhǎng)度和輸出長(zhǎng)度都是可變的,可以用來(lái)設(shè)計(jì)哈希函數(shù)(固定輸出長(zhǎng)度)、偽隨機(jī)數(shù)生成器和其他密碼函數(shù)。

Keccak算法描述

Keccak算法采用海綿結(jié)構(gòu),在預(yù)處理(padding并分成大小相同的塊)后,海綿結(jié)構(gòu)主要分成兩部分:

  • 吸入階段(absorbing phase):將塊x_i傳入算法并處理。
  • 擠出階段(squeezing phase):產(chǎn)生一個(gè)固定長(zhǎng)度的輸出。

Keccak算法

在這兩個(gè)階段要是使用同一個(gè)壓縮函數(shù)Keccak-f,下圖展示了算法“吸入”一個(gè)塊x_i并處理,最后擠出輸出的過(guò)程:

Keccak算法

流程如下:

  1. 對(duì)輸入串x做padding,使其長(zhǎng)度能被r整除,將padding后分割成長(zhǎng)度為r的塊,即x=x_0||x_1||x_2||...||x_t-1。
  2. 初始化一個(gè)長(zhǎng)度為r+c bit的全零向量。
  3. 輸入塊x_i,將x_i和向量的前r個(gè)bit亦或,然后輸入到Keccak-f函數(shù)中處理。
  4. 重復(fù)上一步,直至處理完x中的每個(gè)塊。
  5. 輸出長(zhǎng)為r的塊作為y_0,并將向量輸入到Keccak-f函數(shù)中處理,輸出y_1,以此類(lèi)推。得到的Hash序列即為y=y_0||y_1||y_2||...||y_u。在Keccak-224/256/384/512中,只需要在y_0中取出對(duì)應(yīng)長(zhǎng)度的前綴即可。

壓縮函數(shù)

壓縮函數(shù)Keccak-f是Keccak算法的核心,Keccak-f包含n_r輪。n_r的取值與我們之前計(jì)算b時(shí)用到的指數(shù)l有關(guān),具體地,n_r=12+2*l。Keccak-224/256/384/512中,取l=6,因此n_r=24。在每一輪中,要以此執(zhí)行五步,即θ(theta)、ρ(rho)、π(pi)、χ(chi)、ι(iota)。在處理過(guò)程中,我們把b=1600個(gè)比特排列成一個(gè)5*5*w的矩陣,其中w=2^l=64比特。

Keccak算法

Keccak算法的優(yōu)點(diǎn)

  • 安全性:可以抵御對(duì)哈希函數(shù)的所有現(xiàn)有攻擊。
  • 靈活性:可選參數(shù)配置,能夠適應(yīng)哈希函數(shù)的各種應(yīng)用。
  • 高效性:設(shè)計(jì)簡(jiǎn)單,軟硬件實(shí)現(xiàn)方便高效。

免責(zé)聲明:素材源于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系刪稿。