写在前面:
本文思路及部分图片来自《密码编码学与网络安全——原理与实践(第七版)》
零、基本概念
SHA3:一种HASH函数标准。
输入可变长度n bits消息数据,输出固定长度 bits 数据
一、算法步骤
输入n bits数据 填充(padding)分组吸水(absorbing)(分组丢进函数里后得出的结果与下一分组运算以此迭代)挤压(squeezing)输出 bits数据
注:以上过程亦称为海绵结构
二、具体过程
0.填充+分组
(0). 首先定好分组长度(一般取)
(1). 对数据向后填充,使填充后的数据长度可整除;填充的位数
注意区间开闭:即若原先,也应填充位数据
(2). 填充后得到数据,且。分为个分组,每个分组有bits 数据
其中填充的方法:
- 简单填充:n+"10...0"
- 多重位速率填充:n+"10..1"
(其实就是最后一位不同)
1.吸水
(0). 每个分组内,bits数据向后扩充bits (填充“0”即可),一般,得位的数据
(1). 第一个分组与全零运算后函数得到
(2). 第二个分组与运算函数迭代
以此迭代
(3). 得到 (b bits)
2.挤压
- 若 ,取前 bits 作为输出数据
- 若 时
(0). 取 前bits 数据
(1). 将 丢进函数迭代以更新
(2). 重复步骤(1)(2),产生数据
直到数据 长度大于或等于 ,取前 bits 数据作为输出结果
这个图不科学:, 应该画比长(不要被误解)。
三、吸水挤压过程中的函数
作用:输入 bits数据,输出 bits数据
过程:共有五个过程;执行顺序依次是 。以此循环24轮,输出。
0. 执行前
执行算法前,将 1600bits数据构建成一个 的三维矩阵 , 其中 称为行和列,64个位合起来称为一纵。用记为列,为行,为纵里的bit坐标,
用标记为一个bit的坐标号,且以左下角为0向上向右坐标标号递增
看以下以魔方为例子:
黄红绿+红绿+红绿白构成一列
黄红蓝+黄红+黄红绿构成一行
黄红绿+黄绿+黄橙绿构成一纵
记红蓝白(左下角)为坐标 [0,0,0],向上行数增加,向右列数增加,从里向外纵内 值增加;例如:红绿块记为 a[2,1,0],即第二列第一行第零块。同理:纯绿块记为 a[2,1,1]...以此类推。
此步骤的思路可借鉴魔方盲拧构建坐标的方法
注意:计算时所有值应该5,加法也是运算
1. 过程(基于列的位代换)
公式:
以魔方为例:
纯黄块=纯黄块(黄蓝+纯蓝+蓝白)(黄红绿+红绿+红绿白)
2. 过程(纵内循环位移)
公式:
t表如下:
3.过程(纵间混淆)
公式:
此步与纵内无关,仅是行和列的计算,可当成二维的运算。计算后结果:
4.过程(基于行的位代换)
公式:
以魔方为例:
黄红蓝=黄红蓝XOR非黄红XOR黄红绿
5. 过程(第一纵变换)
公式:
其中RC为轮常量,查表可得; 为轮序数。
即每一轮计算时,用该轮次的 值与该轮第一纵计算。
5个步骤,循环24次(24轮)后输出