SHA-3:KECCAK(基于海绵构造的哈希函数)

2023-10-31 03:59

本文主要是介绍SHA-3:KECCAK(基于海绵构造的哈希函数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SHA-3

SHA-3的历史

在这里插入图片描述
2015年通过公募展SHA-3选出了一个名为KECCAK的哈希函数,作为SHA-3的代表。因此这两个名字代表着同一个哈希函数。
在SHA-3面世之前,SHA-1被广泛使用。SHA-1被王小云教授破解后,MD系列的哈希函数不再安全,此后SHA-3被要求使用非MD系列的哈希函数。SHA2虽然目前阶段仍然使用中,但是由于SHA-2和SHA-1是同样的动作原理,都是MD系列的构造,因此基于王教授的研究可能不再安全。即非MD系列的哈希函数需求下创生了SHA-3。
这种新的构造被称为海绵结构,海绵结构不仅使用在哈希函数领域,更在其他多个领域被使用,有效率和安全的保障。

在这里插入图片描述
SHA-3项目开启后,从08年提交的64个哈希中,根据层选,经历了51,14,5的选拔,最终KECCAK被选拔。选择的标准是安全性,可用性和效率。五个final-list的哈希函数还是有必要了解一下名字的。15年基于KECCAK提出了SHA-3算法,可以理解为KECCAK的某些特殊情况下的某些特殊参数的作用形式。
XOF函数:同时公布了两种XOF函数SHAKE128,256, 这种函数是可用让输出值的长度变为任意长度的算法。

那么为什么KECCAK最终获胜了,它的优势有哪些?
在这里插入图片描述

  1. 海绵结构:像海绵一样,能够很好的吸收水分份和很好的挤出水分。具体结构会在后面分析
  2. 性能:软件层面性能表现不错,硬件层面性能远胜于其他优胜候补
  3. 安全性:提供了哈希安全三要素(抗碰撞性,第一、第二原像抗性)的同时,还对侧信道攻击具有抗性。

海绵结构

在这里插入图片描述
像海绵一样有吸水和出水两个过程。因此有吸收和输出两个阶段。
首先最重要的是padding。即为了满足哈希函数 输入条件,需要扩张某些数据的末尾来凑够位数,如1024bit的块处理。
吸收阶段:然后把处理后的数据块分段加入如图所示的步骤中,每次输入的bit数都是相等 ,都是r bit。输入的长度相等,且对于函数f而言,输入和输出的长度也相当。这里区别于MD系列输入的位数大于输出,这里是前后一致的,输入和输出都是r+c bit。这个过程中还有KECCAK-p[1600,24]这个参数参与运算。
输出阶段:每次输出长度等于r bit的数据。

海绵构造中最重要的三个参数是函数f,padding方法pad,和rate r。
在这里插入图片描述
SPONGE(f,pad,r)[N,d]这样的构造下最终输出Z是哈希函数。其中N是任意位数的信息,d是输出的哈希值的长度。
函数F中线性函数和非线性函数需要适当的加入和调整才能保住输入和输出的长度相等。
b=r+c,它被称为f的宽度。r是输入的位数被称为rate,r越大意味着输入的数据位数越来越多。c是b-r,是用来调整输入长度的参数,c越大,如果r是固定的,意味着f函数要求的输入位数变多,此时需要调整输入的长度,主要作用就是用来调整的。

吸收阶段与输出阶段

在这里插入图片描述
从结构上而言,吸收阶段的输入数据的任意比特分成n次,每次以r比特输入。总输入的位数是n*r,然后每次输入的函数会在xor运算后直接输入函数f,然后调节参数c也会输入函数f,最终产生两个输出,位数分别是r和c。经历n轮这样相同的运算后,所以的需要的数据已经全部输入,此时开始准备输出。
在这里插入图片描述
输出也是分轮次输出,每次输出rbit然后在某一时刻将所有的得到输出连接起来,每个输出的长度为r bit。
到此为止海绵结构的运作原理都已经理解了,注意r和c的初始值都是0即可。
接下来理解一下算法。
在这里插入图片描述
f的定义为使用函数 keccak-p[1600,24]
pad使用的算法为Multi-rate
r和c只要定义其中一个就可以求出另一个,因此这里定义c为
l e n ( d i g e s t ) ∗ 2 len(digest)*2 len(digest)2,假设输出的哈希值最终是224,那么这个c=448,那r=1600-448=1152
算法整体的先定义各种参数,P是全体输入,根据N的输入进行padding,然后确定输入轮次n,无非就是最终padding后的程度除以r即可。然后就可以得到c和b。重复步骤7和8进行哈希运算,最终的要一个r的组合体Z,然后将Z剪切到d bit即可。整个过程和之前的图示是相同的。

双工海绵

这是一个吸收和输出阶段同时进行的构造,效率更高。在认证密码和随机数生成时被广发使用,输入和输出的长度是相等的。

在这里插入图片描述
如图所示,输入padding后的数据后进行xor运算并通过函数f,输出值立刻输出成Z。输入与输出的间隔非常短,只有一个f函数的流程。

KECCAK-p

在这里插入图片描述
这个函数内有两个参数,分贝是b和n。其中b的选值从上述数组中任选其一即可。
KECCAK函数是一个块函数,她的整体构造也是呈三维立体状的、总结而言有下图所示的函数步骤。
在这里插入图片描述
其中三维模型中,xy固定为5,只有深度不同,深度被称为lane。这个根据lane 的长度决定这个三维物体的深度。
在这里插入图片描述
在这里插入图片描述
上两个图是在一维和二维的情况下一些形容xyz方向的术语表达。
在这里插入图片描述
其中的函数
θ \theta θ: 将两个列进行XOR运算并获得一个1bit单位
ρ ρ ρ:对一个lane中的某个bit进行旋转
π π π:将一个slice根据lane进行重新排序,可以理解为对slice的重新排序
χ \chi χ:非线性运算,将行的值变为其他值
ι \iota ι: 讲一个立方体里的某个lane根据i这个index进行和与其他数值的xor运算从而变化其值

θ \theta θ

在这里插入图片描述
在这里插入图片描述

这是将两列的数据拿出来然后求XOR到一个值,然后将这个值替换到目标的一个单位bit上,步骤如上。

ρ ρ ρ

在这里插入图片描述
这个函数从图片上理解可能会有些复杂,需要用数式一起理解。w是width的缩写,即lane的长处,t是一个临时变量。ρ[8]的8是指w=8.
此时代入上面的公式进行的计算结果。z是位于区间[0-7]的整数。
在这里插入图片描述
x=1,y=0时,代入公式计算可得offset移动量为1。换言之每个单位比特,图中的最小方块向lane方向移动一格,如果是最后一个位置则移动到最前方的位置。
这个函数运算完毕后,每个sheet的所有单位lane中的单位bit都会发生一定顺序的位移。

π π π

在这里插入图片描述
之前的定义说了这是一个根据slice来旋转lane的方法,为了好理解不妨把slice改为的lane长度设为1,则剩下的所有lane聚合到可视的第一面中。如图所示,本质上是一种旋转
图1表示的是对角线旋转九十度后的到达蓝色对角线的样子,图2表示的是对角线旋转45度后水平的样子,图3表达的是旋转九十度后的样子。图四45度,图5九十度,图6不是旋转,但是是对中心点的中心对称变化,这是一个基于硬件的变化,因此这个函数与其他四种函数不同在硬件上的实现效果要比软件上好得多。

χ \chi χ

在这里插入图片描述
通过图示的方法将一个行的所有数值进行更新。

ι \iota ι

在这里插入图片描述
这是一个更新lane值的函数,具体的过程如下:
在这里插入图片描述
t是一个八位二进制数,而图中的lane也是一个8位数组。令R=1000 0000并用数字零放在R的前面连接他形成一个9位二进制数。这个二进制的某些位数去做一些更新,使用xor运算,更新后再以附加位为基准,将R的多出的位数剪切掉,最终返还R的0号index所指向的数据。

Multi-rate padding

在这里插入图片描述
这是一个很简单的padding方法,在需要padding 的尾部后空出两位,然后追加10…01的组合,中间由n个需要的0组成。
在这里插入图片描述
如上图所示,加入输出长度d=224,c=2d,则c=448。那么r=1600-448=1152。空出来 两位填入01后追加10…01的padding。这就是这个算法的全部内容。这里空出来的两位被称为suffix,在SHA3哈希里的值被定为01,在SHA3XOF中被定义为1111。
在这里插入图片描述

总体而言,本文涉及到的KECCAK函数原理如图所示。
在这里插入图片描述
这里简单提及一下SHA-3XOF,简单来说就是M后追加1111的二进制数后参与的KECCAK运算。和SHA-3区分即可。

这篇关于SHA-3:KECCAK(基于海绵构造的哈希函数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/312684

相关文章

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

29 哈希

目录 unordered系列关联式容器底层结构模拟实现 1. unordered系列关联式容器 在c++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 l o g 2 N log_2N log2​N,即最差情况下需要比较红黑树的高度次,当树中的结点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能将元素找到,因此在c++11中,stl又提供了4个un

SQL Server中,isnull()函数以及null的用法

SQL Serve中的isnull()函数:          isnull(value1,value2)         1、value1与value2的数据类型必须一致。         2、如果value1的值不为null,结果返回value1。         3、如果value1为null,结果返回vaule2的值。vaule2是你设定的值。        如

tf.split()函数解析

API原型(TensorFlow 1.8.0): tf.split(     value,     num_or_size_splits,     axis=0,     num=None,     name='split' ) 这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。  value传入的就是需要切割的张量。  这个函数有两种切割的方式: 以三个维度的张量为例,比如说一

将一维机械振动信号构造为训练集和测试集(Python)

从如下链接中下载轴承数据集。 https://www.sciencedirect.com/science/article/pii/S2352340918314124 import numpy as npimport scipy.io as sioimport matplotlib.pyplot as pltimport statistics as statsimport pandas

神经网络第三篇:输出层及softmax函数

在上一篇专题中,我们以三层神经网络的实现为例,介绍了如何利用Python和Numpy编程实现神经网络的计算。其中,中间(隐藏)层和输出层的激活函数分别选择了 sigmoid函数和恒等函数。此刻,我们心中不难发问:为什么要花一个专题来介绍输出层及其激活函数?它和中间层又有什么区别?softmax函数何来何去?下面我们带着这些疑问进入本专题的知识点: 1 输出层概述 2 回归问题及恒等函数 3

神经网络第一篇:激活函数是连接感知机和神经网络的桥梁

前面发布的文章介绍了感知机,了解了感知机可以通过叠加层表示复杂的函数。遗憾的是,设定合适的、能符合预期的输入与输出的权重,是由人工进行的。从本章开始,将进入神经网络的学习,首先介绍激活函数,因为它是连接感知机和神经网络的桥梁。如果读者认知阅读了本专题知识,相信你必有收获。 感知机数学表达式的简化 前面我们介绍了用感知机接收两个输入信号的数学表示如下:

vscode python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

在vscode中控制台运行python文件出现:无法将"pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 使用vscode开发python,需要安装python开发扩展: 本文已经安装,我们需要找的是python安装所在目录,本文实际路径如下: 如果在本文路径中没有此目录,请尝试在C盘中搜索 python,搜索到相关python目录后,点击Python 3.9进入目录,

C语言入门系列:初识函数

文章目录 一,C语言函数与数学函数的区别1,回忆杀-初中数学2,C语言中的函数 二, 函数的声明1,函数头1.1,函数名称1.2,返回值类型1.3,参数列表 2,函数体2.1,函数体2.2,return语句 三,main函数四,函数的参数与传递方式1,实参和形参1.1,函数定义(含形参)1.2,函数调用(使用实参) 2,参数传递方式2.1,值传递2.2,引用传递 五,函数原型与预声明1,