密码学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\) 如下:

\[H(M)=M_{1}\oplus M_{2}\oplus \dots \oplus M_{k} \]

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,则

\[k\approx \sqrt{ 2^{m} }=2^{m/2} \]

\(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比特的消息摘要。

总结——③到⑤的处理过程

\[\begin{align} CV_{0} & =IV; \\ CV_{q+1} & =SUM_{32}(CV_{q},ABCDE_{q}); \\ MD & = CV_{L} \end{align} \]

  • \(IV\): 缓冲区ABCDE的初值。
  • \(ABCDE_q\): 第q个消息分组经最后一轮处理过程处 理后的输出
  • \(L\): 消息(包括填充位和长度字段)的分组数
  • \(SUM_{32}\): 对应字的模\(2^{32}\) 加法
  • \(MD\): 最终的摘要值。

SHA的压缩函数

SHA的压缩函数由4轮处理过程组成,每轮处理过程20步迭代运算组成,每一步迭代运算的形式为

\[\begin{align} A & \leftarrow (E+f_{t}(B,C,D)+CLS_{5}(A)+W_{t}+K_{t})\\ B & \leftarrow A\\ C & \leftarrow CLS_{30}(B)\\ D & \leftarrow C\\ E & \leftarrow D\\ \end{align} \]

  • \(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}\)

\[W_{t}=CLS_{1}(W_{t-16}\oplus W_{t-14}\oplus W_{t-8}\oplus W_{t-3}) \]

![[SHA分组处理所需的80个字的产生过程.png]]

常量字 \(K_t\)

常量字 \(K_{0},K_{1},\dots,K_{79}\),如果以16进制给出。它们如下

\[\begin{align} K_t & = \text{0x5A827999} & (0 \leq t \leq 19) \\ K_t & = \text{0x6ED9EBA1} & (20 \leq t \leq 39) \\ K_t & = \text{0x8F1BBCDC} & (40 \leq t \leq 59) \\ K_t & = \text{0xCA62C1D6} & (60 \leq t \leq 79)\\ \end{align} \]

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比特

常数与函数

  1. 常数
    • 初始值 \(IV=7380166F4914B2B9\quad 172442D7DA8A0600\quad A96F30BC163138AA\quad E 38DEE4DB0FB0E4E\)
    1. 常量

\[T_{j}=\begin{cases} 79CC4519 & 0\leq j\leq 15\\ 7A879D8A & 16\leq j\leq 63 \end{cases} \]

  1. 函数
  • [i] 式中 \(X,Y,Z\) 为32位字,\(\wedge,\vee,\bar{a},\oplus\) 分别是逻辑与、逻辑或、逻辑非和逐比特异或运算

布尔函数(混淆):

\[\begin{align} FF_{j}(X,Y,Z) & =\begin{cases} X\oplus Y\oplus Z & 0\leq j\leq 15 \\ (X\wedge Y)\vee(X\wedge Z)\vee(Y\wedge Z) & 16\leq j \leq 63 \end{cases} \\ GG_{j}(X,Y,Z) & =\begin{cases} X\oplus Y\oplus Z &\qquad 0\leq j\leq 15 \\ (X\wedge Y)\vee(\bar{X}\wedge Z) &\qquad 16\leq j \leq 63 \end{cases} \end{align} \]

置换函数(扩散):

\[\begin{align} P_{0}(X) & =X\oplus (x\lll 9)\oplus (X\lll 17) \\ P_{1}(X) & =X\oplus (X\lll {15})\oplus (X\lll 23) \end{align} \]

  • [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^{'}\) 按下列方式迭代压缩:

\[\text{FOR}\quad (i=0\;\text{to}\;L-1):\quad V^{i+1}=CF(V^{(i)},B^{(i)}) \]

其中 \(CF\)是压缩函数,\(V^{(0)}\) 为256比特初始值 ,\(B^{(i)}\) 为填充后的消息分组,迭代压缩的结果为 \(V^{(L)}\)\(V^{(L)}\) 即为消息 \(m\) 的哈希值。

![[SM3迭代压缩.png]]

SM3消息扩展过程

![[SM3消息扩展过程.png]]

  1. 消息分组 \(B^{(i)}\) 划分为16个字 \(W_{0},W_{1},\dots,W_{15}\)
  2. 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}\)
  3. 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)\) 的计算过程如下:

\[\begin{array}{l} \\ V^{(i+1)}=A B C D E F G H \oplus V^{(i)}\\ \text { FOR } j=0 \text { to } 63 \\ \qquad \begin{array}{l} S S_{1} \leftarrow\left((A \ll<12)+E+\left(T_{j} \ll<<j\right)\right) \ll<7 ; \\ S S_{2}=S S_{1} \oplus(A \ll<12) \\ T T_{1}=F F_{j}(A, B, C)+D+S S_{2}+W_{j}^{\prime} \\ T T_{2}=G G_{j}(E, F, G)+H+S S_{1}+W_{j} \\ D=C \\ C=B \\ B=A \\ A =TT_{1};\\ H =G;\\ G =F\lll 19; \\ F =E; \\ E =P_{0}(TT_{2}) \\ \end{array} \\ ENDFOR \\ V^{i+1}=ABCDEFGH\oplus V^{(i)} \end{array} \]

![[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]


  1. 王小云, 于红波. SM3密码杂凑算法[J]. 信息安全研究, 2016(11). ↩︎ ↩︎

posted @ 2025-02-25 11:40  seveN1foR  阅读(127)  评论(0)    收藏  举报