5.Hash函数(MD5)

要求:选择MD5或者其它的Hash函数进行编程实现。
a)简介
Hash函数(杂凑函数/散列函数)是将任意长的消息M变换为较短的、固定长度的值H(M)的不可逆的单向密码体制。Hash函数是密码学的基本工具,在数字签名和消息的完整性检测等方面有着重要的应用。
b)算法流程
MD5算法的流程可以分为:附加填充位、初始化链接变量、分组处理和步函数。
附加填充位:首先需要对明文信息进行填充,使其位长度模512和448同余。因此,信息的位长度被扩展至512×N + 448。然后在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度为512 × N + 448 + 64 = (N + 1) × 512,即长度恰好是512的整数倍。
初始化链接变量:使用4个32位的寄存器A,B,C,D存放4个固定的32位整型参数,
A:0x1234567,B:0x89ABCDEF,C:0xFEDCBA98,D:0x76543210。
分组处理:将填充好的信息进行分组,每组512位 ,共有N组。主循环有四轮,每轮循环包括16个步骤。每步的输入是4个32比特的链接变量和一个32比特的消息子分组,输出为32位值。经过4轮共64步之后,得到的4个寄存器值分别与输入链接变量进行模加,即得到此次分组处理的输出链接变量。
步函数: MD5每轮包含16步,每轮的步函数相同,即使用同一个非线性函数,而不同轮的步函数使用的非线性函数是不同的,即四轮使用4个不同的非线性函数。设X、Y、Z是3个32比特的输入变量,输出是一个32比特变量,则这4个非线性函数F、G、H和I定义为:F(X,Y,Z)=(X&Y)|((X)&Z);(X,Y,Z)=(X&Z)|(Y&(Z));(X,Y,Z)=XYZ;I(X,Y,Z)=Y^(X|(~Z))。
c)算法实现
消息填充:
在这里插入图片描述

图5.1 消息填充
分组处理:

在这里插入图片描述

图5.2 分组处理
主程序:

在这里插入图片描述

图5.3 主程序
d)算法验证
在线网站:

在这里插入图片描述

图5.4 在线网站结果
验证:

在这里插入图片描述

图5.5 MD5验证
e)算法分析
压缩性。无论输入的明文多长,计算出来的MD5值长度固定为128位。
易计算性。由原数据容易计算出MD5值 。
抗碰撞性。知道明文和MD5值,很难找到相同MD5值相同的明文。
抗修改性。即便修改一个字节,计算出来的MD5值也会存在极大差异
MD5是在MD4基础上发展而来的,虽然比MD4稍慢,但更安全,实现了更快的雪崩效应,在实际应用中更受欢迎。
散列函数的安全性主要体现在其良好的单向性和对碰撞的有效避免。由于散列变换是一种压缩变换,输入和输出长度相差极大啊,很难通过输出来确定 输入。但是,散列函数经常被用于数据改动检测,如果一个合法消息和一个非法消息能够碰撞,攻击就可以用合法消息生成散列值,再以非法消息作为该散列值的对应消息进行欺骗,且是他人无法识别。所以,对于Hash函数的攻击,攻击者的主要目标不是恢复原始明文,而是用相同散列值的非法消息来替代合法消息进行伪造和欺骗。
对于MD5的碰撞研究,王小云教授做出了突破性的贡献,她的研究成果可以概括为:对于给定的M1,可以比较快速地找到M2,使得H(M1)=H(M2)。在2004年发表的论文中,她在IBM P690上用了一个小时左右就找了这样的一个碰撞,放到现在的计算机上面,这个时间会更短。所以,如果是要求高度保密的场所,比如说军工之类,MD5已经不安全了,应更换为更安全的Hash算法;但对于民用来说,一般没有人有能承受那么大计算量的设备,在一些不重要的认证上面仍可使用。
f)实现难点
大小端序的处理和转换

猜你喜欢

转载自blog.csdn.net/weixin_43540515/article/details/113329239