MD系列哈希

  • 针对MD系列的攻击
  • MD5
  • SHA-512
  • HAVAL
  • 攻击原理
  • Wide Pipe Construction

本文将介绍哈希函数中的MD系列,简单提一下历史,重点是介绍MD系列的结构。

Merkle-Damgård Construction是迭代哈希函数的代表性设计方法。

MD系列哈希函数又称为压缩函数,虽然有如图所示的很多种类。但是它们的核心区别就在于压缩函数f的不同。它们的构造机制上是一样的,通过输入一个初始向量和一个信息段,然后根据不同算法设计的步数(step)反复通过f,然后输出最后的哈希值。

工作过程如图所示,将一个完整的输入M分段,以块为单位作为f函数的输入,其中f函数的输入中还需要有初始化向量和其他常数的介入,这些常数都是根据不同算法制作的具有规定步骤和输入的集合。其中分段时,可能会出现位数不一致的情况,此时我们在最后一块后增加一系列比特,作为padding。从而保证最后一个块有足够的长度进入f函数。padding也有很多种方法和方式去调节调整来增加安全性,但是本文重点在于哈希函数而非padding,所以不在此提及。

不只是哈希,所有密码学的加密用函数都应该具有安全性。在此重新定义一下密码学中的安全性:
公布加密算法与机制并经过各专业机构验证且认可的安全才能被称为安全。而因为只有我知道所以安全的安全,并不能满足安全需求。一个盾牌坚固与否,需要用矛来做测试,必须经受已知的各种攻击且能防御住才是一个安全的盾。因为这个盾从来没有被攻击过所以安全这种话是不合理的,这并不能代表它的抗攻击能力强。

针对MD系列的攻击

Freestart攻击:假设攻击者可以完全自由操控初始向量IV的值,则找到一个碰撞将非常简单。她的原理就是对于这种循环结构而言,只要找到其中一个块的输出碰撞后,不需要修改之后的所有数据,本身也会产生自然的同值输出。因此,攻击MD系列的哈希值需要做的就是从某一个节点开始插入异常值,尽可能制作一个同值输出,此后不需要干涉就能输出一个不同明文但是同哈希的值。

MD5


MD系列的代表性哈希就是SHA1,SHA2和MD5。以MD5为例,MD5的结构如下,前面已经讨论了细节,图的讲解就从简了

上图是整体过程

上图是padding过程。

如图所示,MD5的流程如上。每次输入4个块,每个块被标记为ABCD进行图示计算。通过函数F后,再与W(输入信息的块)进行模32加法运算,然后与常数K求和,然后移位运算s。其中所有的参数如下所示

图中所示F的有三个输入,对应这边的自上到下的XYZ,它们会根据如图所示的方法进行计算。

然后是常数表,其中包括单纯常数k,来自输入数据M的索引g,以及移动位数的s。
这样只要按照如上图所示的方式,就可以重现MD5。

SHA-512


SHA2其实有挺多的。以SHA-512为例
SHA512的输出是固定512bits的。他会将输入以1024字节为一个块,然后把它分成十六份,其中每份64bits。最终会输出8个64bits的。

整个流程如图所示,第一轮的初始输入也会在最后一轮结束后与最后一轮的输出相加然后获得最终的输出。

每一轮的细节如图所示。

其中函数结构如下

HAVAL

HAVAL和其他的MD系列函数相同,具有相同的构造机制。它的工作流程如下所示。


HAVAL的数据报文也和其他的哈希函数不同,主要是添加了版本号以及具体的输出长度,可以指定输出等长度的哈希值。

HAVAL 分为3PASS和5PASS,每个PASS代表经过几轮运算,每一轮的内部机制并不相同, 但是整体框架是相同的,哈希函数能够处理的数据长度是1024bit,每次输入轮次的是切分成32bit的word,每个word作为输入进行具体计算。最后把一个word产生的输出块连接起来就能成为一个完整的哈希值。



具体的运算过程如图所示,8个word进入后会按照逆序(76543210)的顺序从左到右排列,然后其中0~6这七个块会进行φ的换位操作后参加F计算。然后与块7的位移后的结果进行模加,此后再与W和K进行模加。其中W是被切分的word,而K是常数集已经被定义好、

φ影响后的fff如下图所示。

将输入的值进行乱序打乱。

然后按照每个顺序输入后的值进行F计算

这个表是记录的32个word是索引号

常数集如图所示。


D是一个8words组合的256bits的字符串。最终HAVAL输出之前,通过将256bit的输出做一个裁剪,所谓的裁剪就是去掉32bit为单位的块,去掉的块的个数不同,输出的最长度不同,从而生成了128,160,192,224,256的哈希值。
由于HAVAL的最终输出还要与初始输入的块进行模加运算,所以在裁剪时会有这样的操作。根据我们想要保留的位数进行对保留位的模加计算,且随着保留位数的增加,模加的数量会减少。
规律如图所示:

攻击原理


针对一个块进行攻击,攻击后只有需要自然维持接下来的所有步骤就可以保证输出一个冲突的哈希值。
具体的方法有很多,这里介绍一种名为差分攻击,或者差分分析的方法,简单来说就是分析输入与输出,希望通过对输入的一些改变从而影响输出的一些定向的变化,从而去预测如何随心所欲的改变输入的同时获得既定输出。对于HAVAL的差分攻击,王小云教授发表了一篇论文,该论文详细的介绍了如何使用差分攻击去攻破HAVAL。论文名是HAVAL-128的碰撞攻击。

长度扩展问题来自于一个结构问题,即最后一轮哈希函数的工作方式与其他轮相同。假设存在一个哈希函数,这个哈希函数的输入是难以逆推的,最后一个数据块之前的哈希值是容易找到碰撞的。因此可以通过扩展padding来去寻找一个碰撞的哈希函数,这被称为前置碰撞法,在Github上有相关MD5碰撞程序,可以很明显的看到通过向后追加padding来获取哈希值的方法。
使用的解决方法有两种,被称为Wide Pipe Construction。

Wide Pipe Construction

Wide pipe construction

如图所示,除了最终输出是nbit之外,之前的每轮输出都是2nbit,即使用扩张padding的方法来寻找哈希碰撞的方法变得更加困难了,因为它们的位数就不相同。

Fast Wide pipe construction

而这个版本是在上个班的基础上进行改进,每一次使用上一轮的输出的一半导入F,另一半与本轮的输出的一半进行XOR运算,这个运算过程更快。因为实际输入f函数的数据量减半了。。

哈希的结构-MD系列相关推荐

  1. MD5 SHA1 哈希 签名 碰撞 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. 【数据结构】哈希底层结构

    目录 一.哈希概念 二.哈希实现 1.闭散列 1.1.线性探测 1.2.二次探测 2.开散列 2.1.开散列的概念 2.2.开散列的结构 2.3.开散列的查找 2.4.开散列的插入 2.5.开散列的删 ...

  3. 散列算法和哈希表结构

    散列算法和哈希表结构 散列算法和哈希表结构 算法概述 Hash ,一般翻译做" 散列" ,也有直接音译为" 哈希" 的,就是把任意长度的输入(又叫做预映射, p ...

  4. PHP内核中的哈希表结构

    https://github.com/HonestQiao/tipi/commit/17ca680289e490763a6a402f79afa2a13802bb36 下载:https://github ...

  5. Linux环境编程 哈希链表结构 hlist 介绍与用例

    hlist原本是定义在内核list.h里面的结构体,主要用在解决哈希表冲突时使用链接(chaining)方法时候用到的结构体.结构体定义简单.相关的接口也比较丰富,可以直接拿到用户层使用.最常见的一种 ...

  6. 哈希存储 java_Java容器系列之HashMap的存储

    Java容器系列之HashMap 概要 本文将结合Java源码总结HashMap的存储结构及其扩容策略,并根据这些特点给出使用HashMap的最佳实践. 本文不再介绍HashMap的基本使用,有需要的 ...

  7. 字典哈希表的实现原理_GCC中unordered_(multi)set/map的实现原理 (Part 2 图解哈希表结构)...

    写在前面 (本专栏仅是个人笔记本,有胡言乱语和错漏部分) 本文以图文+代码的形式记录了_Hashtable的结构,如何编排每一个bucket的链表,如何将每个bucket的链表串在一起形成一个长链表, ...

  8. 理解 angular2 基础概念和结构 ----angular2系列(二)

    前言: angular2官方将框架按以下结构划分: Module Component Template Metadata Data Binding Directive Service Dependen ...

  9. 15-数据结构探险系列-图篇

    数据结构探险之图篇 本文及代码收录于个人编程笔记(整理中,欢迎Star): https://github.com/mtianyan/Programming-Notebook 图的简介 什么是图? 如下 ...

  10. delphi tclientsocket接收不到返回数据_RS—485中教你主站发送报文结构、从站返回报文结构?系列11...

    作者:马乐 1.主站发送报文结构 大家可以看到我之前写的文章中的程序都是没有什么具体功能的,都是两个站点之间互相传递数据,这些数据我们只是看看是否可以正常接收发送,数据本身是没有任何含义的.很明显在实 ...

最新文章

  1. Bloom Filter:海量数据的HashSet
  2. spring对JDBC的支持
  3. java高并发(七)发布对象
  4. SpringBoot另一大神器-Actuator
  5. 小白开学Asp.Net Core 《七》
  6. LightOJ 1096 - nth Term 矩阵快速幂
  7. 前端(jQuery)(10)-- jQuery标签切换
  8. 在条件类型中使用 infer 关键字
  9. rtl8188eu无线网卡驱动linux,关于rtl8188eu_Linux的驱动问题想请教一下
  10. 关于虚拟机virtualbox使用无线卡上网的设置
  11. 批评性思维工具第11章 应对自身非理性
  12. HTML字体及文本样式
  13. 制作bin文件.c解读
  14. 从链家爬取北京各区二手房房价进行分析并实现数据可视化
  15. 数据挖掘导论可视化部分总结
  16. 笔记:STM32的ADC参考电压与参照电压(电源监测)
  17. [转载]洛谷日报索引
  18. Matlab用figure;subplot后合并子图
  19. 华人占大半壁江山!CVPR 2021 目标检测论文大盘点(65篇论文)
  20. ST-LINK/V2 + STM8 + STVP 下载程序+Error on Option Bytes

热门文章

  1. ask调制流程图_利用卷积神经网络的自动调制分类算法
  2. leet code 006:ZigZag Conversion
  3. 8、MySQL Workbench导入数据库提示Failed to open required defaults file:xxx.cnf
  4. DP/最短路 URAL 1741 Communication Fiend
  5. 计算机自带拼图程序,电脑上比较好用的拼图软件?
  6. c语言求最小值函数min的用法,C语言--min的宏定义
  7. Classics Sentence Excerpt
  8. php获取图片rgb值,判断图片是否纯黑纯白
  9. ptp4l linux,如何使用PTP4l测试PTPV2协议精度?
  10. 笔记本电脑内外网(无线和本地网络)优先顺序选择