MD5散列算法原理及实现

该文章已生成可运行项目,

目录

 

一、什么是MD5

二、MD5的功能

三、抗膨胀性

四、可逆性

五、MD5是 加密算法吗?

六、MD5用途

1、防止被篡改

2、防止明文读取。

3、防止抵赖

七、MD5算法过程

主要过程描述

第一步:填充

第二步:记录信息长度

第三步:装入标准的幻数(四个整数)

第四步:四轮循环运算

八、java代码如下


 

一、什么是MD5

MD5信息简要是一种散列算法,可以对任意长度的输入,产生128位的输出,是一种被广泛应用的密码杂凑算法。

二、MD5的功能

输入任意长度的信息,输出128位的散列值(数字密码)

唯一性:不同的输入产生不同的输出

三、抗膨胀性

理论上MD5是不具备抗碰撞性的,因为输入是任意的 , 是无限的 , 但是输出是128位 , 也就是2^128,是有限的。以有限映射无限,必然出现碰撞。但是在实际应用中,我们的输入也是有限的,所以出现碰撞的几率是非常小的。

四、可逆性

MD5是散列哈希,是一种有损强压缩算法,在压缩过程中是会丢失信息,所以是不可逆的。

五、MD5是 加密算法吗?

一部分人认为MD5,是不可逆的,只有加密过程,没有解密过程,不能通过密文还原明文,不属于加密算法。

而另一部分人认为原明文信息经过MD5后生成了密文,已经进行了加密,MD5应该是归于加密算法。

个人观点:MD5用作生成数字码,和BASE64一样,属于是编码算法范畴。

六、MD5用途

1、防止被篡改

比如发送一个电子邮件,我们先生成MD5密文 a , 等对方收到邮件后,根据邮件内容生成密文b , 如果a=b ,则邮件未被篡改。

比如网站提供下载功能,可以预先生成MD5散列,并公布在网站上,客户下载后可以通过验证MD5散列,查看下载的数据是否被更改过。

2、防止明文读取。

比如我们系统里关于用户密码的问题 , 一般是不允许被明文入库的,这样会有丢失风险。常规的做法是MD5(password + salt) 生成密文后入库存档,这样即使数据被泄露 , 也无法通过密文反推用户密码。

3、防止抵赖

比如我做出了某项承诺:“过年给大家发3个月的年终奖” ,并预先生成MD5数字指纹 , 到了年底上,我不能私自将3个月改称1个月,因为MD5输入的微小变化,将引起MD5数字指纹的巨大变化。

七、MD5算法过程

我们可以把MD5算法简要的概述如下:将输入信息分组 , 每组512位 ,而每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

主要过程描述

第一步:填充

如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit);

第二步:记录信息长度

用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N512+448+64=(N+1)512位。

第三步:装入标准的幻数(四个整数)

标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是: (A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。有点晕哈,其实想一想就明白了。

第四步:四轮循环运算

循环的次数是分组的个数(N+1)

1)将每一512字节细分成16个小组,每个小组64位(8个字节)

2)先认识四个线性函数(&是与,|是或,~是非,^是异或)

     F(X,Y,Z)=(X&Y)|((~X)&Z) 
     G(X,Y,Z)=(X&Z)|(Y&(~Z)) 
     H(X,Y,Z)=X^Y^Z 
     I(X,Y,Z)=Y^(X|(~Z))

3)设Mj表示消息的第j个子分组(从0到15),<<

    FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s)
    GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<<<s)
    HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<<<s)
    II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<<<s)

4)四轮运算

 第一轮
 

    a=FF(a,b,c,d,M0,7,0xd76aa478)
    b=FF(d,a,b,c,M1,12,0xe8c7b756)
    c=FF(c,d,a,b,M2,17,0x242070db)
    d=FF(b,c,d,a,M3,22,0xc1bdceee)
    a=FF(a,b,c,d,M4,7,0xf57c0faf)
    b=FF(d,a,b,c,M5,12,0x4787c62a)
    c=FF(c,d,a,b,M6,17,0xa8304613)
    d=FF(b,c,d,a,M7,22,0xfd469501)
    a=FF(a,b,c,d,M8,7,0x698098d8)
    b=FF(d,a,b,c,M9,12,0x8b44f7af)
    c=FF(c,d,a,b,M10,17,0xffff5bb1)
    d=FF(b,c,d,a,M11,22,0x895cd7be)
    a=FF(a,b,c,d,M12,7,0x6b901122)
    b=FF(d,a,b,c,M13,12,0xfd987193)
    c=FF(c,d,a,b,M14,17,0xa679438e)
    d=FF(b,c,d,a,M15,22,0x49b40821)
​
    第二轮
    a=GG(a,b,c,d,M1,5,0xf61e2562)
    b=GG(d,a,b,c,M6,9,0xc040b340)
    c=GG(c,d,a,b,M11,14,0x265e5a51)
    d=GG(b,c,d,a,M0,20,0xe9b6c7aa)
    a=GG(a,b,c,d,M5,5,0x
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值