第二十个知识点: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. 10 — springboot整合mybatis — 更新完毕

    1.xml版 -- 复杂sql使用xml,简单sql使用注解 1).导入依赖 <!-- mybatis-spring-boot-starter是第三方( mybatis )jar包,不是spri ...

  2. 「Spark从精通到重新入门(一)」Spark 中不可不知的动态优化

    前言 Apache Spark 自 2010 年面世,到现在已经发展为大数据批计算的首选引擎.而在 2020 年 6 月份发布的Spark 3.0 版本也是 Spark 有史以来最大的 Release ...

  3. eclipse上安装 windowBuilder方法

    最近因为需要用java Swing做一些组件设计,但想想以前在大学时候为了布局组件和位置设计花了很多时间.所以再网上查了一些带有可视化的设计插件用来提高工作效率. 其中一个是 windowBuilde ...

  4. Default arguments and virtual function

    Predict the output of following C++ program. 1 #include <iostream> 2 using namespace std; 3 4 ...

  5. Spring Boot中使用Redis

    一.定义工程 创建一个spring boot模块 二.修改pom文件 在pom文件中添加Spring Boot与Redis整合依赖 <dependencies> <!--spring ...

  6. 【Java 基础】Collectors 使用小结

    Collectors 与集合转换 Collectors toList streamArr.collect(Collectors.toList()); List<Integer> colle ...

  7. maven管理本地jar包

    maven作为包管理工具,好处不必多说.但是有些情况,比如需要引入第三方包,如快递鸟,支付宝,微信等jar包(当然有可能直接提供maven依赖),如果直接下载到本地之后,怎么整合到自己的maven工程 ...

  8. 『与善仁』Appium基础 — 24、等待activity出现

    目录 1.什么是等待activity出现 2.wait_activity()方法 3.获取当前页面的activity方法 4.综合练习 1.什么是等待activity出现 在启动APP的时候,要配置包 ...

  9. 如何在子线程中更新UI

    一:报错情况 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that creat ...

  10. XGBoost特征选择

    1. 特征选择的思维导图 2. XGBoost特征选择算法 (1)  XGBoost算法背景 2016年,陈天奇在论文< XGBoost:A Scalable Tree Boosting Sys ...