密码学学习笔记(十一):哈希函数 - Merkle–Damgård结构

news/2024/11/6 5:03:22/

Merkle–Damgård是一种算法,由Ralph Merkle和Ivan Damgård提出。它通过迭代调用压缩函数来计算消息的哈希值。

应用

拿SHA-2举例,首先我们需要对需要进行哈希运算的输入做填充,然后将填充后的输入划分为等长的分组,每个分组的长度等于压缩函数的输入长度。填充的意思就是在输入中添加特定的字节,使输入的长度变成分组大小的整数倍。

第一步:对输入消息进行填充,填充后的消息应该是压缩函数长度的倍数
​​​​​

 然后,将压缩函数应用于消息的所有分组,在每次迭代过程中,都将上一轮的输出作为压缩函数的第二个输入参数,而将消息的某个分组作为它的第一个输入参数。将压缩函数最终的输出作为消息的摘要。

第二步:将一个压缩函数迭代地应用到消息分组,每次迭代都将以前一个压缩函数的输出以及消息的一个分组作为压缩函数的输入。将最后一次调用压缩函数产生的输出作为摘要。

如果压缩函数本身是抗碰撞的,那么就可以证明Merkle–Damgård结构是抗碰撞的。这样一来,输入长度不固定的哈希函数的安全性就简化为输入长度固定的压缩函数的安全性。

构造

Merkle–Damgård结构的目标是从压缩函数f构造一个哈希函数h

f: \left \{ 0,1 \right \}^{m+t+1}\rightarrow \left \{ 0,1 \right \}^{m}

h: \left \{ 0,1 \right \}^{*}\rightarrow \left \{ 0,1 \right \}^{m}

给定任意长度的消息x,使得:

例子:

给定一个压缩函数f:

f: \left \{ 0,1 \right \}^{128+512+1}\rightarrow \left \{ 0,1 \right \}^{128}

消息x有1000bits:

  • y_{1}是x的前512bits
  • y_{2}x\left | \right |0^{24}的后488bits
  • y_{3}是24的0^{480}\left | \right |32-bit二进制表示
  • z_{1} = f\left ( 0^{129}\left | \right |y_{1} \right ), z_{1}有128bits
  • z_{2} = f\left ( z_{1}\left | \right |1\left | \right |y_{2} \right )
  • z_{3} = f\left ( z_{2}\left | \right |1\left | \right |y_{3} \right )z_{3}是h(x)的消息摘要

抗碰撞性

为什么如果压缩函数本身是抗碰撞的,Merkle–Damgård结构就是抗碰撞的呢?

给定压缩函数f和Merkle–Damgård结构h

f: \left \{ 0,1 \right \}^{m+t+1}\rightarrow \left \{ 0,1 \right \}^{m}

h: \left \{ 0,1 \right \}^{*}\rightarrow \left \{ 0,1 \right \}^{m}

  • 假设我们找到x\neq x'所以h(x)\neqh(x'),所以f可以找到碰撞。
  • y(x) = y_{1}\left | \right |y_{2}\left | \right |...\left | \right |y_{k+1}
  • 让h(x)的中间结果等于z_{1},z_{2},...,z_{k+1},然后h(x) = z_{k+1} = f(z_{k}\left | \right |1\left | \right |y_{k+1})
  • 让h(x')的中间结果等于z'_{1},z'_{2},...,z'_{n+1}y(x') = y'_{1}\left | \right |y'_{2}\left | \right |...\left | \right |y'_{n+1}然后,h(x') = z'_{n+1} = f(z_{k}\left | \right |1\left | \right |y_{k+1}) = f(z'_{n}\left | \right |1\left | \right |y'_{n+1})
  • f(z_{k}\left | \right |1\left | \right |y_{k+1}) = f(z'_{n}\left | \right |1\left | \right |y'_{n+1})
  • 情况1:
  • |x| \neq |x'|\: mod \; t(填充位的数量不同),然后y_{k+1}\neq y'_{n+1},发现碰撞
  • 情况2:
  • |x| = |x'| 然后k=n,要么z_{k} \neq z'_{k}发现碰撞;要么z_{k} = z'_{k}z_{k} = z'_{k} = f(z_{k-1}\left | \right |1\left | \right |y_{k}) = f(z'_{k-1}\left | \right |1\left | \right |y'_{k}),如果y_{k} \neq y'_{k},发现碰撞;如果z_{k-1}\neq z'_{k-1},则发现碰撞,否则返回。一定有一个数字j使得y_{j}\neq y'_{j}
  • 情况3:
  • |x| \neq |x'|,跟情况1相似,除了我们可以一直回到其中一个字符串的开头并且有f(0^{m+1}\left | \right |y_{1}) = f(z'_{j}\left | \right |1\left | \right |y'_{j+1}),碰撞被发现。


http://www.ppmy.cn/news/884500.html

相关文章

[VRFC 10-529]concurrent assignment to a non-net fir_out_data is not permitted.

问题原因:例化模块时,模块的输出信号设为reg. 解决方法:将模块输出信号改为wire.

服务器日志显示好多错误,我的一台Web应用服务的安全日志出现好多ID是529和680的审核失败的日志,奇怪的是登陆名是数据库服务器计算机的名称+$...

说明: 1、我的WEB服务器和数据服务器都是windows server 2003 R2 sp2,数据库用的是SQLServer 2005 &#xff…

5月热梗“ 520爱他人529爱自己”一夜火遍网络!

网络从不缺热梗!5月的尾声微博又一热梗上了热搜!微博网友富而喜悦的投稿:他在某超市买了1袋零食给老婆过节,谁能想到零食盒子中塞着纸条写着“520爱他人,529爱自己!”此微博一出,数万暖心网友“…

UVA 529 - Addition Chains

题目大意:给一个数字n, 然后输出一个元素个数最少的从1到n的序列(可能有多种方案,输出其中一种即可)。 其中对于第k个数Ak, 它的值等于AiAj( ) 解题思路:迭代深搜的方法,先确定数的…

nyoj-529-flip

#include<stdio.h> int main() { int s,n,m; scanf("%d",&s); while(s--) { int sum0; scanf("%d",&n); mn1; while(m) { if((n&1)!(m&1)) sum; n>>1; m>>1; } printf("%d\n",sum); } return 0; }

uva 529 Addition Chains

题目地址&#xff1a; http://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem470 题目描述&#xff1a; Addition Chains An addition chain for n is an integer sequence with the following four properties: a0…

leetcode 529. Minesweeper 扫雷游戏 + 经典的DFS深度优先遍历

Let’s play the minesweeper game (Wikipedia, online game)! You are given a 2D char matrix representing the game board. ‘M’ represents an unrevealed mine, ‘E’ represents an unrevealed empty square, ‘B’ represents a revealed blank square that has no a…

ZTE Q529C root成功方法

ZTE Q529C root成功方法 本人是Android开发工程师&#xff0c;由于公司买了一个中兴ZTE Q529C的手机&#xff0c;一直找相应的root教程。但是网上几乎没有相应的说明&#xff0c;有的方法也是不可行的。今天早上进行再次root&#xff0c;结果成功了。 root的结果如下 Root工具…