SHA3浅记

写在前面:
本文思路及部分图片来自《密码编码学与网络安全——原理与实践(第七版)》

零、基本概念

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轮,输出。

f函数框架

0. 执行前

执行算法前,将 1600bits数据构建成一个 的三维矩阵 , 其中 称为行和列,64个位合起来称为一纵。用记为列,为行,为纵里的bit坐标
用标记为一个bit的坐标号,且以左下角为0向上向右坐标标号递增

看以下以魔方为例子:

绿色对面蓝色,红色对面橙色,黄色对面白色

黄红绿+红绿+红绿白构成一列
黄红蓝+黄红+黄红绿构成一行
黄红绿+黄绿+黄橙绿构成一纵
记红蓝白(左下角)为坐标 [0,0,0],向上行数增加,向右列数增加,从里向外纵内 值增加;例如:红绿块记为 a[2,1,0],即第二列第一行第零块。同理:纯绿块记为 a[2,1,1]...以此类推。

此步骤的思路可借鉴魔方盲拧构建坐标的方法

注意:计算时所有值应该5,加法也是运算

1. 过程(基于列的位代换)

公式:

以魔方为例:


绿色对面蓝色,红色对面橙色,黄色对面白色

纯黄块=纯黄块(黄蓝+纯蓝+蓝白)(黄红绿+红绿+红绿白)

2. 过程(纵内循环位移)

公式:

t\in [0,24)$在$GF(5)^{2*2}上有 \begin{bmatrix} 0 & 1\\ 2 & 3 \\ \end{bmatrix}^t \begin{bmatrix} 1\\ 0\\ \end{bmatrix} = \begin{bmatrix} x\\ y\\ \end{bmatrix}(实际上查表可得)
t表如下:

t表

3.过程(纵间混淆)

公式:

此步与纵内无关,仅是行和列的计算,可当成二维的运算。计算后结果:


结果

4.过程(基于行的位代换)

公式:

以魔方为例:

绿色对面蓝色,红色对面橙色,黄色对面白色

黄红蓝=黄红蓝XOR黄红XOR黄红绿

5. 过程(第一纵变换)

公式:

其中RC为轮常量,查表可得; 为轮序数。
即每一轮计算时,用该轮次的 值与该轮第一纵计算。

轮常量RC表

5个步骤,循环24次(24轮)后输出

你可能感兴趣的:(SHA3浅记)