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

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.hqwc.cn/news/28064.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式07-责任链模式

责任链模式属于行为设计模式,常见的过滤器链就是使用责任链模式设计的。 文章目录 1、真实开发场景的问题引入2、责任链模式讲解2.1 核心类及类图2.2 基本代码 3、利用构建者模式解决问题4、责任链模式的应用实例5、总结5.1 解决的问题5.2 使用场景5.3 优缺点 1、真…

Docker基础(二)

1、Docker工作原理 Docker是一个Clinet-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说的…

编程小白的自学笔记十(python爬虫入门二+实例代码详解)

系列文章目录 编程小白的自学笔记九(python爬虫入门代码详解) 编程小白的自学笔记八(python中的多线程) 编程小白的自学笔记七(python中类的继承) 编程小白的自学笔记六(python中类的静态方法…

Servlet的监听器

Servlet常用的监听器 ServletContextAttributeListener 用来感知ServlerContext对象属性变化,比如添加或删除属性变化 ServletContextListener 用来感知ServlerContext对象的创建和销毁的 ServletRequestListener 可以用来监听感知ServletRequest对象的创建和销毁的…

QT:问题、解决与原因

在这里记录一些自己遇到的在QT开发上面的小问题和tips 目录 QComboBox 设置qss样式不生效qt按钮设置点击释放效果实现效果 QComboBox 设置qss样式不生效 我设置的样式是: box->setStyleSheet("QComboBox {""border: none;""padding:…

spring boot 多模块项目搭建Knife4j文档,swagger-ui x2

介绍: knife4j jeecg-boot用的就是这个,我之前要搭过swagger-ui,但外观,体验都没有knife4j好,我没记错的话已经停止发布版本了,所以我的多模块项目就用到了这个,还搭建了jwt token获取我也是在网上找的…

Java - 集合

开篇 数组和集合对比 数组的不足: 1、长度开始时必须指定,而且一旦指定,不能修改,灵活性不够 2、保存的必须为同一类型的元素 3、使用数组进行增删元素的方法比较麻烦 集合 1、可以动态的保存任意多个对象 2、提供一系列操作对象的方法…

C# OpenCvSharp+DlibDotNet 人脸替换 换脸

效果 Demo下载 项目 VS2022.net4.8OpenCvSharp4DlibDotNet 相关介绍参考 代码 using DlibDotNet; using OpenCvSharp.Extensions; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Dra…

二叉树--C语言实现数据结构

本期带大家一起用C语言实现二叉树🌈🌈🌈 1、二叉树的定义 二叉树是一种特殊的树状数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点 二叉树的链式存储结构是指用 链表 来表示…

【数据结构】二叉树详解(1)

⭐️ 前言 ✨ 二叉树的概念性质 ⭐️ 二叉树链式结构的实现 结构定义&#xff1a; #include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int BinaryTreeDataType;typedef struct BinaryTreeNode {BinaryTreeDataType value;struct Binary…

【Python统计与数据分析实战_01】位置与分散程度的度量

数据描述性分析 1.描述统计量1.1 位置与分散程度的度量1.1.1 例子一 单维数组1.1.2 例子二 多维数组 1.2 关系度量1.3 分布形状的度量1.3.1 统计量&#xff1a;偏度和峰度 1.4 数据特性的总括 1.描述统计量 数据的统计分析分为统计描述和统计推断两部分。前者通过绘制统计图、…

港联证券-尾盘集合竞价拉升意味着什么意思?

在股票市场中&#xff0c;尾盘集合竞价是指每个交易日的最后几分钟&#xff0c;即下午14:57到3:00之间的交易。在这段时间内&#xff0c;所有股票的买卖都将以竞价的方式进行&#xff0c;最终价格以最高买价与最低卖价的平均值确定&#xff0c;成交量也将作为当日的收盘价和成交…