第二十个知识点:Merkle-Damgaard hash函数如何构造

这里讲的是MD变换,MD变换的全称为Merkle-Damgaard变换.我们平时接触的hash函数都是先构造出一个防碰撞的压缩函数.然后先证明这个小的,固定长度的压缩函数是安全的,然后再用它构造一个任意长度的哈希算法.虽然存在很多其它的构造方法,MD是迄今为止最常用的(至少是被用到最多的),例如MD5,SHA1,SHA2.因此是时候来了解一下它了.

安全的哈希函数?

一般来说,一个安全的哈希函数\(h\)应该是:

  • 抗原象攻击(Pre-image Resistant).给定\(h(x)\)很难计算出\(x\)
  • 第二抗原象攻击(Second Pre-image Resistant).给定\(x\),很难找出\(y\),使得\(h(x) = h(y)\).
  • 抗碰撞:很难找出\(x,y\)使得\(h(x) = h(y)\)

如果一个哈希函数是防碰撞的.它一定是第二抗原象攻击的.因此,这就是我们集中的碰撞一致性.

压缩函数

一个压缩函数\(f:\{0,1\}^n * \{0,1\}^r \rightarrow \{0,1\}^n\)是函数.就像名字一样"压缩",它会将\(n+r\)bit宽的输入压缩成\(n\)bit的输出.正如您可能期望的那样,抗冲突压缩函数是一种抗冲突的压缩函数.因此它可能是一个固定长度的hash函数,但是如果我们想让这个函数变成长度可变的,我们应该怎么办.

MD哈希函数的构造

MD构造函数提供一个方法扩展一个固定长度的压缩函数变成一个可变长度的压缩函数.使用一个压缩函数\(f\),我们会用\(n\)bit的值作为我们的内部状态,同时每次迭代给定\(r\)bit的值.为了做这件事,我们首先使用一个初始的值(IV),然后分割消息\(M\)成每块\(r\)bit,\(M= M_0M_1...M_m\).然后简单的迭代构造:

\[S_0 := IV,i = 0,...,m-1:S_{i+1} = f(S_i,M_i),h(M) := S_m
\]

MD构造方法中最重要的就是如果压缩函数抗碰撞的,因此整个构造就是抗碰撞的(已经被Merkle证明了).这给了我们一个安全的方法从一个小的简单的密钥原语构造hash函数.

长度扩展

你可能注意到这个图有一个我没有描述的阶段:这个Finalisation阶段.这就是组织长度扩展攻击.例如,如果\(N\)是一个单一的块(ie,\(N \in \{0,1\}^r\)).如果攻击者知道\(h(M) = x\),然后我们很容易计算\(h(M||N)\).因为\(h(M||N) = f(M,N)\).因此一些finalisation函数能被用于打破这个关系.

实际上这里说的啥我没懂,但是我翻看了别的书

look!这里就是真正的过程,如果它的倍数不对,就是用PB,即padding.

padding的格式是:

\[PB = 100...000||<s>
\]

s是块的数量,s是64bit长,也就是说最多有\(2^{64}\)个块.如果不够s那么就在后面再补一个块.

安全证明可以搜一搜,网上都能搜到.

第二十个知识点:Merkle-Damgaard hash函数如何构造的更多相关文章

  1. 文本去重之MinHash算法——就是多个hash函数对items计算特征值,然后取最小的计算相似度

    来源:http://my.oschina.net/pathenon/blog/65210 1.概述     跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度.Mi ...

  2. hash算法和常见的hash函数 [转]

       Hash,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值. 这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能 会散列成相同的输出,而不 ...

  3. 第五十个知识点:什么是BLS基于对的签名方案?

    第五十个知识点:什么是BLS基于对的签名方案? BLS签名方案使用了椭圆曲线上了Weil对,本质上是一个在曲线上除n划分的双线性形式,使用 \(n^{th}\) 个单位根. 假设我们有一个椭圆曲线\( ...

  4. Hash 函数及其重要性

    不时会爆出网站的服务器和数据库被盗取,考虑到这点,就要确保用户一些敏感数据(例如密码)的安全性.今天,我们要学的是 hash 背后的基础知识,以及如何用它来保护你的 web 应用的密码. 申明 密码学 ...

  5. 理解php Hash函数,增强密码安全

    1.声明 密码学是一个复杂的话题,我也不是这方面的专家.许多高校和研究机构在这方面都有长期的研究.在这篇文章里,我希望尽量使用简单易懂的方式向你展示一种安全存储Web程序密码的方法. 2.“Hash” ...

  6. 密码学Hash函数

    定义: Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h = H(M). 称M是h的原像.因为H是多对一的映射,所以对于任意给定的Hash值h,对应有多个原像.如果满足x≠y且H ...

  7. 28.密码学知识-hash函数-5——2019年12月19日

    5. 单向散列函数 "单向散列函数 --- 获取消息的指纹" 在刑事侦查中,侦查员会用到指纹.通过将某个特定人物的指纹与犯罪现场遗留的指纹进行对比,就能够知道该人物与案件是否存在关 ...

  8. 使用模拟退火算法优化 Hash 函数

    背景 现有个处理股票行情消息的系统,其架构如下: 由于数据量巨大,系统中启动了 15 个线程来消费行情消息.消息分配的策略较为简单:对 symbol 的 hashCode 取模,将消息分配给其中一个线 ...

  9. 第十个知识点:RSA和强RSA问题有什么区别?

    第十个知识点:RSA和强RSA问题有什么区别 这个密码学52件事数学知识的第一篇,也是整个系列的第10篇.这篇介绍了RSA问题和Strong-RSA问题,指出了这两种问题的不同之处. 密码学严重依赖于 ...

随机推荐

  1. idea安装插件 JClassLib Bytecode viewer

    目录 idea安装插件 JClassLib Bytecode viewer 安装过程 使用 idea安装插件 JClassLib Bytecode viewer IDEA 中安装 jClassLib ...

  2. API 管理在云原生场景下的机遇与挑战

    作者 | 张添翼 来源 | 尔达Erda公众号 ​ 云原生下的机遇和挑战 标准和生态的意义 自从 Kubernetes v1.0 于 2015 年 7 月 21 日发布,CNCF 组织随后建立以来,其 ...

  3. 「译」 .NET 6 中 gRPC 的新功能

    gRPC是一个现代的.跨平台的.高性能的 RPC 框架.gRPC for .NET 构建在 ASP.NET Core 之上,是我们推荐的在 .NET 中构建 RPC 服务的方法. .NET 6 进一步 ...

  4. Shell学习(二)——变量和基本数据类型

    参考博客: [1]LinuxShell脚本--变量和数据类型 [2]shell只读变量删除 一.变量 定义变量的语法 定义变量时,变量名和变量值之间使用"="分隔,并且等号两边不能 ...

  5. Android Loader异步装载

    一.Loader简介: (一).Loader的概念: 装载器从android3.0开始引进.它使得在activity或fragment中异步加载数据变得简单. 当成批显示数据的时候,为了使用户体验更好 ...

  6. java标识接口

    标识接口是没有任何方法和属性的接口,标识接口不对实现类有任何语义上的要求,仅仅表明它的实现类属于一个特定的类型.它非常类似于Web 2.0中的TAG的概念,Java使用它标识某一类对象.主要有两个用途 ...

  7. js格式化合计金额

    var summoney=1040.010400000000000001; var totalMoney=parseFloat(summoney).toFixed(2); var arry=total ...

  8. 观察者模式之spring事件机制

    ddsspring中的事件机制使用到设计模式中的观察者模式 ,观察者模式有两个概念,1.观察者.被观察者.2.被观察者做出相应得动作,观察者能接收到.不分析设计模式,学习下spring中的事件机制实际 ...

  9. IOS学习路径

    iOS Developer Roadmap Start your journey today! Where Do I Start? Becoming an iOS developer is a lot ...

  10. <转>Java NIO API

    Java NIO API详解 NIO API 主要集中在 java.nio 和它的 subpackages 中: java.nio 定义了 Buffer 及其数据类型相关的子类.其中被 java.ni ...