哈希的结构-MD系列

本文将介绍哈希函数中的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是常数集已经被定义好、

φ影响后的 f f f如下图所示。
在这里插入图片描述
将输入的值进行乱序打乱。
在这里插入图片描述
然后按照每个顺序输入后的值进行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函数的数据量减半了。。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chahot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值