如果要评选出一个最出名的哈希算法,那一定是SHA系列算法,其中SHA-2更是目前使用场景最多的哈希算法。这时就有小伙伴要问了,有SHA-1和SHA-2,那么有没有SHA-3呢?当然有,下面我们就来了解一下当选SHA-3标准的Keccak算法。

Keccak算法简介

2007年起,NIST开始向全球公开征集SHA-3标准,要求新的算法在保持SHA-2的在线处理能力之外,还必须能够处理小数据块。最终在2012年,经过层层筛选,Keccak在64种算法中脱颖而出,最终当选SHA-3标准。

Keccak的结构仍然属于Merkle提出的迭代哈希函数节点。最大的创新是采用了一种新的迭代结构,称为海绵结构。海绵结构也叫海绵功能。在海绵函数中,输入数据被分成固定长度的数据包。每一组作为迭代的输入逐一进行,上一次迭代的输出也反馈给下一次迭代,最终生成输出哈希值。

海绵函数允许输入长度和输出长度都是可变的,可以用来设计哈希函数(固定输出长度)、伪随机数生成器和其他密码函数。

Keccak算法描述

Keccak算法采用海绵结构,在预处理(padding并分成大小相同的块)后,海绵结构主要分成两部分:

  • 吸入阶段(absorbing phase):将块x_i传入算法并处理。
  • 挤出阶段(squeezing phase):产生一个固定长度的输出。

Keccak算法

在这两个阶段要是使用同一个压缩函数Keccak-f,下图展示了算法“吸入”一个块x_i并处理,最后挤出输出的过程:

Keccak算法

流程如下:

  1. 对输入串x做padding,使其长度能被r整除,将padding后分割成长度为r的块,即x=x_0||x_1||x_2||...||x_t-1。
  2. 初始化一个长度为r+c bit的全零向量。
  3. 输入块x_i,将x_i和向量的前r个bit亦或,然后输入到Keccak-f函数中处理。
  4. 重复上一步,直至处理完x中的每个块。
  5. 输出长为r的块作为y_0,并将向量输入到Keccak-f函数中处理,输出y_1,以此类推。得到的Hash序列即为y=y_0||y_1||y_2||...||y_u。在Keccak-224/256/384/512中,只需要在y_0中取出对应长度的前缀即可。

压缩函数

压缩函数Keccak-f是Keccak算法的核心,Keccak-f包含n_r轮。n_r的取值与我们之前计算b时用到的指数l有关,具体地,n_r=12+2*l。Keccak-224/256/384/512中,取l=6,因此n_r=24。在每一轮中,要以此执行五步,即θ(theta)、ρ(rho)、π(pi)、χ(chi)、ι(iota)。在处理过程中,我们把b=1600个比特排列成一个5*5*w的矩阵,其中w=2^l=64比特。

Keccak算法

Keccak算法的优点

  • 安全性:可以抵御对哈希函数的所有现有攻击。
  • 灵活性:可选参数配置,能够适应哈希函数的各种应用。
  • 高效性:设计简单,软硬件实现方便高效。

免责声明:素材源于网络,如有侵权,请联系删稿。