MD5算法

MD5是一种广泛使用的128位散列函数,用于确保信息传输的完整性。它通过填充、分块、初始化变量和压缩函数四个步骤进行计算。尽管存在安全性问题,但其特点如压缩性、易计算性和抗修改性使其在很多场景中仍然被应用。本文还提供了C++的MD5算法实现和实验测试样例。
摘要由CSDN通过智能技术生成

MD5算法

MD5算法简介

MD5

MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

MD5即Message Digest Algorithm (信息-摘要算法5),一种被广泛使用的密码散列函数, 使用 little-endian,输入任意不定长度信息,以512位长进行分组,生成四个32位数据,最后联合起来输出固定128位长的信息摘要可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5 不是足够安全的,因为Hans Dobbertin 在1996年找到了两个不同的 512-bit 块,它们在 MD5 计算下产生相同的 hash 值。

MD5算法特点:

1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5基本实现

输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。

MD5算法实现

算法过程

1. 填充padding

在原始消息数据尾部填充标识 100…0,填充后的消息位数 L≡ 448 (mod 512)。至少要填充1个位,所以标识长度 1~512位。 再向上述填充好的消息尾部附加原始消息的位数的低64位,最后得到一个长度 L 是512位整数倍的消息。
填充的方法如下:

  1. 在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。
  2. 在这个结果后面附加一个以64位二进制表示的填充前信息长度(单位为Bit),如果二进制表示的填充前信息长度超过64位,则取低64位。经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
2. 分块

把填充后的消息结果分割为 L 个512位的分组:Y0, Y1, …, YL-1。
结果也表示成 N 个32位长的字 M0, M1, …, MN-1,N = L ×16。

3. 初始化变量

初始化一个128位的 MD 缓冲区,记为 CVq,也表示为4个32位
寄存器 (A, B, C, D);CV0 = IV。迭代在 MD 缓冲区进行,最后一
步的128位输出即为算法结果

寄存器 (A, B, C, D) 置16进制初值作为初始向量 IV,并采用小端
存储 (little-endian) 的存储结构:

A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476

Little-Endian 将低位字节排放在内存的低地址端,高位字节排放在
内存的高地址端。相反 Big-Endian 将高位字节排放在内存的低地
址端,低位字节排放在内存的高地址端。存储结构与 CPU 体系结
构和语言编译器有关。PowerPC 系列采用 big endian 方式存储数据
,而 Intel x86系列则采用 little endian 方式存储。

4. 压缩函数
  1. MD5 压缩函数 H(M
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值