密码学05-Hash函数
Hash函数的定义
Hash函数的定义
- Hash函数的定义
- 将任意长的消息 \(M\) 映射为较短的、 固定长度的一个值 \(H(M)\)。
- Hash函数也称为哈希函数、散列函数、压缩函数、杂凑函数、指纹函数等。\(H(M)\) 为哈希值、散列值、杂凑码、指纹、消息摘要等。
- Hash函数 \(H\) 一般是公开的。
例
\(M\) 是一个长消息,设 \(M=(M_{1},M_{2},\dots,M_{k})\),其中 \(M_{i}\) 为 \(l\) 长的比特串,定义函数 \(H\) 如下:
Hash函数满足的条件
- Hash函数的目的是为需认证的数据产生一个“指纹”
- Hash函数应满足以下条件:
- Hash函数函数的输入可以是任意长
- Hash函数函数的输出是固定长
- 在软件和硬件上易于实现
- Hash函数满足的安全条件
- Hash函数为了实现安全认证,需要满足如下安全条件:
- 单向性: 已知x,求 \(H(x)\) 较为容易;但是,已知 \(h\),求使得 \(H(x)=h\) 的 \(x\) 在计算上是不可行的。
- 抗弱碰撞性: 已知 \(x\),找出 \(y(y≠x)\) 使得 \(H(y)=H(x)\) 在计算上是不可行的。
- 抗强碰撞性: 找出任意两个不同的输入 \(x,y\),使得 \(H(y)=H(x)\) 在计算上是不可行的
- 关系:抗强碰撞性 \(\in\) 抗弱碰撞性 \(\in\) 单向性
迭代型杂凑函数的一般结构
![[迭代型杂凑函数的一般结构.png]]
- \(CV_{0}=IV=n\) 比特长的初值
- \(CV_{i}=f(CV_{i-1},Y_{i-1})\quad 1\leq i\leq L\)
- \(H(M)=CV_{L}\)
生日攻击
问题1---第 \(I\) 类生日攻击问题
已知一杂凑函数 \(H\) 有 \(n\) 个可能的输出, \(H(x)\) 是一个特定的输出,如果对 \(H\) 随机取 \(k\) 个输入,则至少有一个输入 \(y\) 使得 \(H(y)=H(x)\) 的概率为0.5时, \(k\)有多大?
- 为叙述方便,称对杂凑函数H寻找上述y的攻击为第 \(I\) 类生日攻击
因为 \(H\) 有 \(n\) 个可能的输出,所以输入 \(y\) 产生的输出 \(H(y)\) 等于特定输出 \(H(x)\) 的概率是 \(\frac{1}{n}\) ,反过来说 \(H(y)≠H(x)\) 的概率是 \(1-\frac{1}{n}\)。
\(y\) 取 \(k\) 个随机值而函数的 \(k\) 个输出中没有一个等于 \(H(x)\),其概率等于每个输出都不等于 \(H(x)\) 的概率之积,为 \(\left[ 1-\frac{1}{n} \right]k\),所以y取k个随机值得到函数的 \(k\) 个输出中至少有一个等于 \(H(x)\) 的概率为 \(1-[1-1/n]k\)。
由当\(|x|\ll1\), \((1+x)^k≈1+kx\),可得\(1-\left[ 1-\frac{1}{n} \right]k≈1-\left[ 1-\frac{k}{n} \right]=\frac{k}{n}\)
若使上述概率等于 \(0.5\),则 \(k=\frac{n}{2}\)。特别地,如果 \(H\) 的输出为 \(m\) 比特长,即可能的输出个数 \(n=2^m\),则
- \(k=2^{m-1}\)
问题2---生日悖论
-
[?] 在 \(k\) 个人中至少有两个人的生日相同的概率大于0.5时, \(k\) 至少多大?
-
设有 \(k\) 个整数项,每一项都在 1 到 \(n\) 之间等可能地取值。
- \(P(n, k)\):\(k\)个整数项中至少有两个取值相同的概率
-
生日悖论就是求使得 \(P(365,k)≥0.5\)的最小 \(k\)。
- \(Q(365, k)\) : \(k\) 个数据项中任意两个取值都不同的概率
如果 \(k>365\),则不可能使得任意两个数据都不相同,因此假定\(k≤365\)。 \(k\) 个数据项中任意两个都不相同的所有取值方式数为
\(365\times 364\times\dots \times (365-k+1)=\frac{365!}{365-k}!\)
如果去掉任意两个都不相同这一限制条件,可得k个数据项中所有取值方式数为365k。所以可得
\(Q(365,k)=\frac{365!}{(365-k)365^{k}}\)
\(P(365,k)=1-Q(365,k)=1-\frac{365!}{(365-k)!365^{k}}\)
- 当 \(k=23\) 时, \(P(365,23)=0.5073\),即上述问题只需23人,人数如此之少。
- 若 \(k=100\),则 \(P(365,100)=0.9999997\),即获得如此大的概率。
- 之所以称这一问题是悖论是因为当人数k给定时,得到的至少有两个人的生日相同的概率比想象的要大得多。
生日悖论推广问题
-
[?] 已知一个在 \(1\) 到 \(n\) 之间均匀分布的整数型随机变量,若该变量的 \(k\) 个取值中至少有两个取值相同的概率大于0.5,则 \(k\) 至少多大?
-
\(P(n,k)=1-\frac{n!}{(n-k)!n^{k}}\),令 \(P(n,k)>0.5\),可得 \(k=1.18\sqrt{ n }\approx \sqrt{ n }\)
-
若取 \(n=365\),则 \(1.18\sqrt{ 365 }=22.54\)
生日攻击
设杂凑函数 \(H\) 有 \(2^m\) 个可能的输出(即输出长 \(m\) 比特),如果 \(H\) 的 \(k\) 个随机输入中至少有两个产生相同输出的概率大于0.5,则
第 \(II\) 类生日攻击
-
[?] 寻找函数 \(H\) 的具有相同输出的两个任意输入的攻击方式
-
输出长度与碰撞
- 这种生日攻击给出了消息摘要长度的下界,一个40比特的消息摘要是非常不安全的。
- 因为在大约220个(大约100万)个随机值中就能以1/2的概率找到一个碰撞。
- 通常建议消息摘要的最小可接受的长度为128比特,在DSS签名标准中使用160比特的消息摘要就是基于这个考虑
SHA-1 算法
安全杂凑算法SHA‐1
安全杂凑算法(Secure Hash Algorithm, SHA)由美国NIST设计,于1993年作为联邦信息处理标准公布。SHA是基于MD4的算法,其结构与MD4非常类似
算法描述
- 算法的输入: 小于\(2^{64}\)比特长的任意消息,分为 512 比特长的分组。
- 算法的输出: 160 比特长的消息摘要。
- 算法的框图与MD5一样,但杂凑值的长度和链接变量的长度为160比特
![[SHA-1算法的框图.png]]
算法处理步骤
①对消息填充
- 对消息填充,使得其比特长在模512下为448,即填充后消息的长度为512的某一倍数减64,留出的64比特备第 ② 步使用。
- 步骤 ① 是必需的,即使消息长度已满足要求,仍需填充。例如,消息长为448比特,则需填充512比特,使其长度变为960,因此填充的比特数大于等于1而小于等于512。
- 填充方式是: 第1位为1,其后各位皆为0
②附加消息的长度
- 留出的64比特以来表示消息被填充前的长度。如果消息长度大于264,则以264为模数取模。
- big-endian模式是指数据的高字节保存在内存的低地址中,反之为little-endian模式
③对MD缓冲区初始化
使用160比特长的缓冲区存储中间结果和最终杂凑值。缓冲区为5个32比特以big-endian方式存储数据的寄存器(A, B, C, D, E)
初始值分别为 A=67452301, B=EFCDAB89, C=98BADCFB, D=10325476, E=C3D2E1F0
④ 以分组为单位对消息进行处理
每一分组 \(Y_q\) 都经一压缩函数处理,压缩函数由4轮处理过程(如图所示)构成,每一轮又由20步迭代组成。
第4轮的输出(即第80步迭代的输出)再与第1轮的输入 \(CV_q\) 相加,以产生 \(CV_{q+1}\),其中加法是缓冲区5个字中的每一个字与 \(CV_q\) 中相应的字模 \(2^{32}\) 相加
![[SHA的分组处理框图.png]]
⑤ 输出消息
- 输出消息的L个分组都被处理完后,最后一个分组的输出即为160比特的消息摘要。
总结——③到⑤的处理过程
- \(IV\): 缓冲区ABCDE的初值。
- \(ABCDE_q\): 第q个消息分组经最后一轮处理过程处 理后的输出
- \(L\): 消息(包括填充位和长度字段)的分组数
- \(SUM_{32}\): 对应字的模\(2^{32}\) 加法
- \(MD\): 最终的摘要值。
SHA的压缩函数
SHA的压缩函数由4轮处理过程组成,每轮处理过程20步迭代运算组成,每一步迭代运算的形式为
- \(A,B,C,D,E\): 缓冲区的5个字
- \(t\): 迭代的步数(0≤t≤79)
- \(f_t(B,C,D)\): 第 \(t\) 步迭代使用的基本逻辑函数
- \(CLSs\): 左循环移 \(s\) 位
- \(W_t\): 由当前512比特长的分组导出的一个 32 比特长的字
- \(K_t\): 加法常量
- \(+\): 模 \(2^{32}\) 加法。
![[一步迭代示意图.png]]
基本逻辑函数 \(f_t\)
迭代的步数 | 函数名 | 定义 |
---|---|---|
\(0\leq t\leq 19\) | \(f_{1}=f_{t}(B,C,D)\) | \((B\wedge C)\vee(\bar{B}\wedge D)\) |
\(20\leq t\leq 39\) | \(f_{2}=f_{t}(B,C,D)\) | \(B\oplus C\oplus D\) |
\(40\leq t\leq 59\) | \(f_{3}=f_{t}(B,C,D)\) | \((B\wedge C)\vee(B\wedge D)\vee(C\wedge D)\) |
\(60\leq t\leq 79\) | \(f_{4}=f_{t}(B,C,D)\) | \(B\oplus C\oplus D\) |
本逻辑函数的输入为3个32比特的字,输出是一个32比特的字。表中\(\wedge,\vee,\bar{a},\oplus\) 分别是与、或、非、异或4个逻辑运算。 |
字 \(W_t\)
下面说明如何由当前的输入分组(512比特长)导出 \(W_{0},W_{1},\dots,W_{15},W_{16},W_{17},\dots,W_{79}\)
![[SHA分组处理所需的80个字的产生过程.png]]
常量字 \(K_t\)
常量字 \(K_{0},K_{1},\dots,K_{79}\),如果以16进制给出。它们如下
SM3密码杂凑算法
SM3密码杂凑算法简介
SM3是中国国家密码管理局颁布的中国商用密码标准算法,它是一类密码杂凑函数,可用于数字签名及验证、消息认证码生成及验证、随机数生成。
标准起草人:王小云、李峥、于红波、张超、罗鹏、吕述望
2012年3月,成为中国商用密码标准(GM/T 0004-2012)
2016年8月,成为中国国家密码标准(GB/T 32905-2016)
2018年11月22日, 含有我国SM3杂凑密码算法的ISO/IEC 10118 – 3 : 2018《信息安全技术杂凑函数第3部分:专用杂凑函数》 最新一版(第4版)由国际标准化组织(ISO)发布, SM3算法正式成为国际标准。
SM3密码杂凑算法的描述
算法的输入数据长度为 \(l\) 比特,\(l< 2^{64}\) 输出哈希值长度为256比特
常数与函数
- 常数
- 初始值 \(IV=7380166F4914B2B9\quad 172442D7DA8A0600\quad A96F30BC163138AA\quad E 38DEE4DB0FB0E4E\)
- 常量
- 函数
- [i] 式中 \(X,Y,Z\) 为32位字,\(\wedge,\vee,\bar{a},\oplus\) 分别是逻辑与、逻辑或、逻辑非和逐比特异或运算
布尔函数(混淆):
置换函数(扩散):
- [i] 式中X为32位字,符号 \(a\lll n\) 表示把 \(a\) 循环左移 \(n\) 位。
算法描述
算法对数据首先进行填充,再进行迭代压缩后生成哈希值。
填充并附加消息的长度
- 对消息填充的目的是使填充后的数据长度为512的整数倍。
- 设消息 \(m\) 的长度为 \(l\) 比特。首先将比特“1”添加到 \(m\) 的末尾,再添加 \(k\) 个“0”,其中 \(k\) 满足:\(l+1+k=448\mod{512}\)
- 然后再添加一个64位比特串,该比特串是长度l的二进制表示。
- 举例:消息为
011000010110001001100011
,其长度为 \(l=24\),填充后的比特串为 \(011000010110001001100011{\color{red}1}\overbrace{ 00\cdots00 }^{ 423个0 }\overbrace{ 00\cdots011000 }^{ 64bit }\)
迭代压缩
将填充后的消息 \(m\) 按512比特进行分组得 \(m^{'}=B^{(0)}B^{(1)}\dots B^{(L-1)}\) 对 \(m^{'}\) 按下列方式迭代压缩:
其中 \(CF\)是压缩函数,\(V^{(0)}\) 为256比特初始值 ,\(B^{(i)}\) 为填充后的消息分组,迭代压缩的结果为 \(V^{(L)}\),\(V^{(L)}\) 即为消息 \(m\) 的哈希值。
![[SM3迭代压缩.png]]
SM3消息扩展过程
![[SM3消息扩展过程.png]]
- 消息分组 \(B^{(i)}\) 划分为16个字 \(W_{0},W_{1},\dots,W_{15}\)。
- FOR \((j=16\;to\;67):W_{j}=P_{1}(W_{j-16}\oplus W_{j-9}\oplus(W_{j-3}\lll15))\oplus(W_{j-13\lll{7}})\oplus W_{j-6}\)
- FOR \((j=0\;to\;63):W^{'}_{j}=W_{j}\oplus W_{j+4}\)
\(B^{i}\)经消息扩展后得到132个字 \(W_{0},W_{1},\dots,W_{67},W^{'}_{0},W^{'}_{1},\dots,W^{'}_{63}\)。
压缩函数
设 \(A B C D E F G H\) 为字寄存器,\(SS_{1},SS_{2},TT_{1},TT_{2}\) 为中间变量,压缩函数 \(V^{i+1}=CF(V^{(i)},B^{(i)})(0\leq i\leq n-1)\) 的计算过程如下:
![[SM3算法第j轮迭代压缩流程图.png]]
输出哈希值
\(ABCDEFGH = V^{L}\)
输出 256 比特的哈希值 \(y = ABCDEFGH\)
![[SM3 产生消息哈希值的处理过程.png]]
SM3哈希算法的安全性
- 压缩函数是哈希函数安全的关键
- SM3的压缩函数 \(CF\) 中的布尔函数 \(FF_{j}(X,Y,Z)\) 和 \(GG_{j}=(X,Y,Z)\) 是非线性函数,经过循环迭代后提供混淆作用。
- 置换函数 \(P_{0}(X)\) 和 \(P_{1}(X)\) 是线性函数,经过循环迭代后提供扩散作用。
- 再加上 \(CF\) 中的其他运算的共同作用,压缩函数 \(CF\) 具有很高的安全性,从而确保SM3具有很高的安全性。
![[比较1.png]][1]
![[比较2.png]][1:1]
本文来自博客园,作者:seveN1foR,转载请注明原文链接:https://www.cnblogs.com/seveN1foR/p/18735893