散列算法是一种用于将任意长度的二进制数据映射到固定长度的“消息摘要”的加密算法,它具有一定的安全性质。例如,散列算法应该是单向的,即给定一个消息摘要,很难找到一个与之对应的原始数据;散列算法也应该是抗碰撞的,即很难找到两个不同的数据,使得它们具有相同的消息摘要。

SHA-3算法(Secure Hash Algorithm 3)是最新的散列算法标准,由美国国家标准与技术研究院(NIST)于2015年8月5日发布。SHA-3算法是基于Keccak加密散列的,由Guido Bertoni, Joan Daemen, Michaël Peeters和Gilles Van Assche设计。SHA-3算法与之前的SHA-1和SHA-2算法在内部结构上有很大的不同,它使用了一种称为海绵构造(sponge construction)的新颖方法。

海绵构造是基于一个广义的随机函数或随机置换,它允许输入(在海绵术语中称为“吸收”)任意长度的数据,并输出(称为“挤压”)任意长度的数据,同时表现为一个伪随机函数,对于所有之前的输入。这带来了很大的灵活性。NIST规定了SHA-3算法的四种输出长度,分别为224位、256位、384位和512位,分别对应于SHA-3-224、SHA-3-256、SHA-3-384和SHA-3-512。此外,NIST还规定了两种可扩展输出函数(extendable-output function),分别为SHAKE128和SHAKE256,它们可以输出任意长度的数据。

SHA-3算法的工作原理如下:首先,需要选择一个海绵函数或置换函数,以及一些参数,包括一个有限域、一个方程、一个基点和一个素数阶。然后,将输入数据分割成固定长度的块,并按顺序处理每个块。对于每个块,将其与海绵函数的内部状态进行异或运算,并应用置换函数得到新的内部状态。当所有块都处理完毕后,开始输出数据。每次输出一定长度的数据,并应用置换函数更新内部状态。直到输出所需长度的数据为止。

SHA-3算法是作为SHA-2算法的备用而开发的,并不是要取代它。目前,SHA-2算法仍然没有发现明显的安全弱点,并且仍然被广泛使用。SHA-3算法的目的是在必要时可以直接替换SHA-2算法,并且显著提高NIST的散列算法工具箱的鲁棒性。对于小消息大小,Keccak算法和SHA-3函数的设计者建议使用更快速的函数KangarooTwelve,并使用调整过的参数和一种新的树哈希模式来提高效率。