SHA-3
历史
Keccak 是一个加密散列算法,由 Guido Bertoni,Joan Daemen,Michaël Peeters,以及Gilles Van Assche在RadioGatún上设计。
2012年10月2日,Keccak 被选为NIST散列函数竞赛的胜利者。SHA-3并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点。由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的 SHA-3。
2014年,NIST发布了 FIPS 202 的草案 "SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions"。
2015年8月5日,FIPS 202 最终被 NIST 批准。
设计
Keccak 使用海绵函数,此函数会将数据与初始的内部状态做XOR运算,这是无可避免可置换的(inevitably permuted)。在最大的版本,算法使用的内存状态是使用一个5×5的二维数组,数据类型是64位的字节,总计1600比特 。缩版的算法使用比较小的,以2为幂次的字节大小w为1比特,总计使用25比特。除了使用较小的版本来研究加密分析攻击,比较适中的大小(例如从w=4使用100比特,到w=32使用800比特)则提供了比较实际且轻量的替代方案。
Keccak 的置换
置换方法是先定义字的长度为二的某次方,w = 2比特。SHA-3的主要应用使用64位的字长,ℓ = 6。
内存状态可以被视为5×5×w的三维数组。令a[i][j][k]代表内存状态的第(i×5 + j)×w + k个比特(使用小端序,little-endian,参见字节序)。
置换函数是五个子段落(sub-round)作12+2ℓ次的循环,每一个子段落都相当简单:
修改
在整个 NIST 散列函数比赛里面,参赛者允许稍微修改算法解决已经出现的问题。Keccak 的修改有:
循环的数目从12+ℓ变成12+2ℓ,以增加安全度。
填充函数使用比起上述101的方式更加复杂的作法。
吸收比率r增加到安全限制,而非向下舍入到最接近某个2的幂次。
SHA-3 示例
空字符串的散列值:
由于雪崩效应,即使一个很小的改变都会产出几乎完全不同的散列值。举例来说,把 dog 改成 dof:
SHA 家族函数的比较
在下面的表格中,“内部状态”指的是传递到下一个块的位数。
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值