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

news2024/11/25 22:44:37

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.coloradmin.cn/o/760380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp 土法 瀑布流 - vue3

效果图 代码 <template><view><!-- 瀑布流展示 --><!-- 标签页 --><view class="rowStart flexNoLineBreaking paddingCol10 innerDomPaddingRow5 tinyShadow marginBottom10"><view @click="tabsCurrent = 0; run_waterfa…

计算机网络基础第六章

一、应用层概述 1.1 网络应用模型 1.1.1 客户/服务器(C/S)模型 1.1.2 P2P模型 二、域名解析系统——DNS系统 2.1 域名 2.2 域名服务器 2.3 域名解析过程 三、文件传输协议——FTP 3.1 FTP服务器和用户端 3.2 FTP工作原理 四、电子邮件 4.1 电子邮件系统概述 4.2 简单邮件传送…

C# Modbus通信从入门到精通(1)——Modbus RTU(虚拟串口调试工具的使用)

前言: 订阅本专栏后,加入vip专属的qq群,在群资料里面就能找到虚拟串口工具 1、安装虚拟串口工具 第1步、双击vspd.exe安装 第2步、 打开“Cracked”的文件夹,里面有一个vspdct.dll,如下图:把这个dll粘贴到C:\Program Files (x86)\Eltima Software\Virtual Serial Po…

Python垃圾回收

Python垃圾回收 文章目录 Python垃圾回收引用计数标记清除分代回收 GC作为现代编程语言的自动内存管理机制&#xff0c;专注于两件事&#xff1a; 找到内存中无用的垃圾资源清除这些垃圾并把内存让出来给其他对象使用。 GC彻底把程序员从资源管理的重担中解放出来&#xff0c;让…

MySQL-DML-添加数据insert

目录 添加数据&#xff1a;insert insert语法 注意事项 修改数据&#xff1a;update update语法 注意事项&#xff1a; 删除数据&#xff1a;delete 删除语法 注意事项 总结 DML英文全称Data Manipulation Language&#xff08;数据操作语言&#xff09;&#xff0c;…

数据结构---B+Tree

文章目录 BTree简单了解一下BTree MySQL表数据文件MyISAM存储引擎和InnoDB存储引擎的区别&#xff1f; BTree 在我没了解BTree之前&#xff0c;听别人提到这个词时&#xff0c;脑子一片空白&#xff0c;懵懵的&#xff0c;今天利用空闲时间&#xff0c;简单了解了一下BTree&am…

去掉浮夸,空杯心态重新面对测试

刚开始一头扎进软件测试行业&#xff0c;从踏踏实实的机械化功能测试&#xff0c;到学会和甲方扯皮&#xff0c;到被鄙视的五体投地后抓紧修炼表面功夫来忽悠人&#xff0c;学的最多的反而是怎么与人交流。第一次面对跳槽的机会&#xff0c;我竟然发现自己的测试能力不升反降。…

微服务系统面经

微服务架构 秒杀微服务架构图 项目地址可以参考&#xff1a;秒杀系统 1 一个java的微服务系统中有几个网关&#xff1f; 在一个Java的微服务系统中&#xff0c;网关的数量并不固定&#xff0c;这完全取决于系统的设计和需求。网关服务是微服务架构中的重要组件&#xff0c;它…

架构训练营学习笔记:4-4如何设计存储架构?

存储架构设计的三个步骤 分为&#xff1a;1 估算性能需求 2、选择存储系统 3 设计存储方案 性能估算步骤 一 用户量预估 2B的业务&#xff0c;数据量需要预估&#xff0c;2C的需要决策。 方法&#xff1a; 规划&#xff1a;根据成本、预算、目标等确定 推算&#xff1a;基于…

SRA数据下载的一个坑

前两天协助处理GEO数据上的一个单细胞数据&#xff0c;发现了一个巨坑&#xff0c;这里分享下&#xff0c;希望大家能避开。 需要下载的数据集是&#xff0c;GSE119562&#xff0c;查询SRA Run Selector&#xff0c;找到它对应的SRR编号。 于是&#xff0c;我非常熟练的用pref…

【接口自动化测试】HTTP协议详解

协议 简单理解&#xff0c;计算机与计算机之间的通讯语言就叫做协议&#xff0c;不同的计算机之间只有使用相同的协议才能通信。所以网络协议就是为计算机网络中进行数据交换而建立的规则&#xff0c;标准或约定的集合。 OSI模型 1978年国际化标准组织提出了“开放系统互联网…

java实现敏感词过滤,简单实例,dfa算法

java实现敏感词过滤&#xff0c;简单实例&#xff0c;dfa算法 最近在看黑马的视频学习的时候&#xff0c;看到了&#xff0c;自定义敏感词过滤的&#xff0c;感觉蛮有意思的&#xff0c;记录一下。 直接上实例 第一步初始化敏感词&#xff08;可以写死&#xff0c;当然在开发…

Ceres Solver简介及使用

Ceres Solver是一个开源的C库&#xff0c;用于建模和解决大型、复杂的优化问题。它是一个成熟、功能丰富且高性能的库&#xff0c;自2010年以来一直在Google生产中使用。最新发布版本为2.1.0,license为BSD,它支持在Windows、Linux、Mac、Android、iOS上编译&#xff0c;源码地址…

D. Black Cells

Problem - 1821D - Codeforces 思路&#xff1a;我们能够发现题意的区间是不重叠的&#xff0c;并且任意两个区间之间的间隔至少是2&#xff0c;我们会发现一个性质&#xff0c;它一定是从前缀中进行选择的&#xff0c;但是前缀中长度为1的区间可以不选择&#xff0c;因为如果长…

STM32单片机示例:使用定时器触发DMA

文章目录 前言基础说明关键配置与代码示例链接 前言 单片机中使用定时器触发DMA是比较好用的一种操作&#xff0c;这里将对此做个示例说明。 基础说明 ST官方的例程中有一个 TIM_DMA 的例程&#xff0c;其功能是启用一个定时器&#xff0c;设置其中一路通道输出PWM&#xff…

【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring的核心注解开发和实现指南(Spring5的常见的注解)

360全方位渗透和探究Spring的核心注解开发和实现指南 Spring的注解介绍核心基础注解核心注解分析xml文件的配置configuration的配置 Lazy && ScopeComponentScan添加Controller、Service、Repository注入到spring容器ComponentScan多包扫描的属性排除某些包或者类的扫描…

SpringBoot读取配置的6种方式

1. 概述 通过了解springboot加载配置&#xff0c;可以更方便地封装自定义Starter。 在SpringBoot中&#xff0c;可以使用以下6种方式读取 yml、properties配置&#xff1a; 使用Value注解&#xff1a;读取springboot全局配置文件单个配置。使用Environment接口&#xff1a;通过…

详解c++---异常

目录标题 c语言传统处理错误的方式c异常的使用异常的规则服务器常用的异常继承体系异常安全异常的规范异常的优缺点&#xff1a; c语言传统处理错误的方式 第一种&#xff1a; 程序在运行过程中终止了程序&#xff0c;比如说assert int main() {int i 0;scanf("%d"…

5.5 python函数式编程之--返回函数、匿名函数、偏函数(暂时稍微了解即可)

1、 先回归历史&#xff1a;什么是函数函数就是通过将局部【目标】实现并封装起来&#xff0c; 后续可直接拿来用2、 函数式编程&#xff1a; 是把运算过程尽量写成一系列嵌套的函数调用一、返回函数 返回函数&#xff1a; 函数作为返回值闭包&#xff1a; 函数内部定义函…