MD5摘要算法

前言

一、MD5算法简介

麻省理工学院Ron Rivest提出,可将任意长度消息经过变换得到一个128位散列值。

MD5以512位分组来处理输入的信息,每一个分组又被划分为16个32位子分组,经过一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后生成128位散列值。

二、MD5算法特点

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

三、MD5算法原理

简单概括下来,MD5算法的过程分为四步:处理原文、设置初始值、循环加工、拼接结果。

1.处理原文

(1)将输入信息M按顺序每512位一组进行分组:
M=M1,M2,······,Mn-1, Mn
(2)将信息M的Mn长度填充为448位。
当Mn长度L(bi为单位)<448时,在信息M后加一个“1”,然后再填充(447-L)个“0”,使最后的信息M长度为448位。
当Mn长度L>448时,在信息M后加一个“1”,然后再填充(512-L+447)个“0”,使最后的信息Mn长度为512位,Mn+1长度为448位。
(3)用剩余的位置(512-448=64位)记录原文的真正长度,把长度的二进制值补在最后。

2.设置初始值

MD5最后散列结果长度为128位,按每32位分成一组共4组。这4组结果是由4个初始值A、B、C、D经过不断演变得到。MD5的官方实现中,A、B、C、D的初始值如下(16进制):
在这里插入图片描述

3.循环加工

首先需要确定循环次数,假设原文的长度是M,那么主循环次数是M/512,每个主循环包括512/32*4次子循环,为什么要乘4呢?我么首先看一下单次子循环A,B,C,D值演变流程。
在这里插入图片描述
图中绿色的F,代表非线性函数,用到的函数有四种:
在这里插入图片描述
在主循环下面64次子循环中,F、G、H、I 交替使用,第一个16次使用F,第二个16次使用G,第三个16次使用H,第四个16次使用I。
接下来,每次操作对a,b,c,d其中三个做一次非线性函数运算,然后将所得结果加上第四个变量、信息的一个子分组和一个常数,再将所得结果左移一个不定的数,并加上a、b、c或d之一。
所以,每轮操作会是这样的:
FF(a,b,c,Mi,s,Ki) 表示 b=b+((a+F(b,c,d)+Mi+Ki)<<<s)
GG(a,b,c,Mi,s,Ki) 表示 b=b+((a+G(b,c,d)+Mi+Ki)<<<s)
HH(a,b,c,Mi,s,Ki) 表示 b=b+((a+H(b,c,d)+Mi+Ki)<<<s)
II (a,b,c,Mi,s,Ki) 表示 b=b+((a+I(b,c,d)+Mi+Ki)<<<s)
“流水线”的最后,让计算的结果和B相加,取代原先的B。新ABCD的产生可以归纳为:
在这里插入图片描述
总结一下主循环中的64次子循环,可以归纳为下面的四部分:
在这里插入图片描述

4.拼接结果

这一步就很简单了,把循环加工最终产生的A,B,C,D四个值拼接在一起,转换成字符串即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值