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

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错