【密码学】一文读懂Whirlpool
Whirlpool
首先呢,祝大家今晚节日快乐,Whirlpool是由Vincent Rijmen(高级加密标准的联合创始人)和Paulo S.L.M.Barreto设计的,后者于2000年首次提出了它。
算法结构
下面我们来看一下Whirlpool算法的结构,图片参考自(https://www2.seas.gwu.edu/~poorvi/Classes/CS381_2007/Whirlpool.pdf)当中的结构图。
消息填充
这一步和之前我们提到过的其他的哈希算法类似,我们需要把原始的消息内容填充到512的整数倍,这里至少要填充1个字节,也就是说,如果说原始的消息恰好是512的整数倍的话,那么我们需要额外多填充一个分块,也就是填充10...0
这里填充长度为256bit。
长度填充
这里在结尾需要填充256bit的消息长度,从这里可以看出,whirlpool算法最大的处理消息的长度为 的消息。
初始化矩阵
对于这里的状态,采用了一个 的一个矩阵来处理消息,初始化的值为0。
消息处理
这里是整个哈希算法的核心,我们需要根据之前填充完成的数据,按照512bit一组进行分块,分块完成之后,根据每一块执行W算法进行处理,最终得到结果。
W函数
这个W函数,和我们之前所讲到过的AES算法有一些类似的地方,我们先来介绍W算法的具体过程,然后再来对比一下他和AES的异同。
轮密钥加
这里和AES实际上是基本一样的,同样的是在 上面的加法运算,只不过所选择的不可约多项式不同,不过这个不可约多项式对于加法运算是没有影响的,在乘法运算当中才会有差异。
字节替代
这里也是通过去查询SBOX来获取最终的值,不熟悉的读者可以自行回顾一下AES当中有关字节替代的计算方法。
列移位
这里为什么变成了列移位呢,因为这里最开始生成初始化矩阵的时候,我们用的是行矩阵,这里和AES有一些不同,在AES当中,我们初始化矩阵用的是列矩阵,从这个角度来说,这里实际上和AES的应该也不大。
行混淆
这一步是和AES加密算法相差比较大的一步,因为前面提到过,这里在有限域计算上面的不可约多项式改变了,因此呢对于乘法运算还是有蛮大的影响的,结果就是我们不能用之前AES当中的方法进行计算了,这里行混淆依然用的是一个矩阵的乘法,具体的变换矩阵如下:
这里采用的不可约多项式为 。
密钥扩展算法
这里的密钥扩展算法并不和AES一样,需要预计算出来,而是在算法的运行过程当中,利用上一步的输出作为新的密钥扩展的值,在最上面的图当中展示了这一步的过程。
总结
最后,今天521,我这里就不给出代码了,祝大家今天节日快乐,逃~~。