SHA-3算法满足了哈希函数的三个安全属性,并且和SHA-2的变体达到同样级别的安全性。此外,SHA-3算法不容易受到长度扩展攻击,并可用于计算秘密消息的哈希值。
SHA-3是一种建立在Permutation(置换)之上的密码算法。
置换就是假设有两个数组a和b,a中的任意一个元素可以指向(只能指向一个)b中的任意一个元素,这样元素之间就进行了置换。任何置换都是可逆的,也就是说可以根据输出找到其对应的输入。
海绵结构
在密码学中海绵结构是一种创建函数的操作方法,该函数使用固定长度排列(或变换)和填充规则将可变长度输入映射到可变长度输出。海绵函数接受的元素或任意长度的二进制串作为输入,并返回的元素或用户提供值为n的二进制串。海绵函数是具有固定输入长度的流密码和具有固定输出长度的哈希函数的推广。它通过在输入或检索输出时对有限状态重复应用内部排列来工作。
假设有一个基于8比特置换创建的映射函数
...
一个使用特定置换函数f的海绵结构,通过依次输入所有可能的8比特串,示例中的置换可以创建一个从8比特输入到8比特输出的映射。
容量也可以看作秘密值,容量越大,海绵结构就越安全。
将哈希函数的输入和置换输入的比率进行异或操作来计算消息的哈希值。
如果想要计算更长输入的哈希值:
- 对输入进行填充,然后将输入分成与比率比特串长度相等的分组
- 迭代调用置换函数,比如使用多个置换函数对应多个消息分组。
SHA-3
SHA-3使用的海绵结构允许数据被“吸收”(Abosorbing)到海绵中,然后被“挤压”(Squeezing)。在吸收阶段,消息块被异或为状态的子集,随后使用置换函数f完全改变。在“挤压”阶段,状态转换函数f与从状态的同一子集读取输出块交替,并创建摘要。状态的可写和可读部分的大小被称为“速率”(表示为r),而不受输入/输出影响的部分的大小则称为“容量”(表示c)。系统的安全性由容量决定。
SHA-2、SHA-1、MD5和其他基于Merkle-Damgrd架构的哈希函数在长度扩展攻击中的漏洞通过内部状态S在发送给Z的数据之外还包含c个额外的数据位来消除。
在SHA-3中,状态S由5-5个字阵列组成,每个字长w位(w=64),总共给出1600位。此外,Keccak被指定为小到1位(总状态为25位)的2次方字大小。小状态大小(从w=8200位到w=32800位)可用于评估密码分析攻击,而中等状态大小(来自这些值)可应用于现实世界中的轻量级应用。