一 点睛
Keccak的搅拌函数f实际上应该叫作Keccak-f[b],从这个名字可以看出,这个函数带有一个参数b,即内部状态的比特长度。这里的参数b称为宽度(width)。
根据Keccak的设计规格,宽度b可以取25、50、100、200、400、800、1600共7种值,SHA-3采用的是其中的最大宽度,即b=1600.宽度b的7种取值的排列规律如下:这7个数字都是25的整数倍,即25的1倍、2倍、4倍、8倍、16倍、32倍、64倍。一片slice的大小为5*5=25个比特,因此b/25就相对于slice的片数(即lane的长度)。SHA-3的内部状态大小为b=5*5*64=1600个比特。
由此可见,在Keccak中,通过改变宽度b就可以改变内部状态的比特长度。但无论如何改变,slice的大小依然是5*5,改变的只是lane的长度而已,因此Keccak宽度的变化并不会影响其基本结构。Keccak的这种结构称为套娃结构,这个名字取自著名的俄罗斯套娃,每个娃娃的形状都是相同的,只是大小不同而已。利用套娃结构,可以很容易地制作一个缩水版Keccak模型并尝试对其进行破解,以便对该算法的强度进行研究。
二 Keccak-f[b]步骤
Keccak-f[b]中的每一轮包含5个步骤:西塔、柔、派、凯、伊欧塔。具体到SHA-3中所使用的Keccak-f[1600]函数,共循环24轮。
1 步骤西塔
将位置不同的两个column中各自5个比特通过XOR运算加起来,然后再与置换目标比特求XOR并覆盖掉目标比特。
2 步骤柔
这一步操作是沿z轴(lane方向)进行比特平移。
3 步骤派
下图所示为对其中1片slice应用步骤派时的情形,实际上整条lane上的所有slice都会被执行统一的比特移动操作。
4 步骤凯
下图所示为其中1个row应用步骤凯的情形。这里使用了一些逻辑电路中的符号。
5 步骤伊欧塔
是用一个固定的轮常数对整个state的所有比特进行XOR运算,目的是让内部状态具备非对称性。