MD5算法

发布时间:2024-06-09 21:56:27 作者:汉语成语

MD5算法即Message-DigestAlgorithm5(信息-摘要算法5),是一种用于产生数字签名的单项散列算法。它的作用是让大容量信息在用数字签名软件签私人密匙前被"压缩"成一种保密的格式。

执行步骤

算法输入是一个字节串,每个字节是8个bit.

算法的执行分为以下几个步骤:

步,补位:

MD5算法先对输入的数据进行补位,使得数据的长度(以byte为单位)对64求余的结果是56。

即数据扩展至LEN=K*64+56个字节,K为整数。

补位方法:补一个1,然后补0至满足上述要求。相当于补一个0x80的字节,再补值

为0的字节。这一步里总共补充的字节数为0~63个。

第二步,附加数据长度:

用一个64位的整数表示数据的原始长度(以bit为单位),将这个数字的8个字节按低位的在前,

高位在后的顺序附加在补位后的数据后面。这时,数据被填补后的总长度为:

LEN=K*64+56+8=(K+1)*64Bytes。

※注意那个64位整数是输入数据的原始长度而不是填充字节后的长度,我就在这里栽了跟头.

第三步,初始化MD5参数:

有四个32位整数变量(A,B,C,D)用来计算信息摘要,每一个变量被初始化成以下

以十六进制数表示的数值,低位的字节在前面。

wordA:01234567

wordB:89abcdef

wordC:fedcba98

wordD:76543210

※注意低位的字节在前面指的是LittleEndian平台上内存中字节的排列方式,

而在程序中书写时,要写成:

A=0x67452301

B=0xefcdab89

C=0x98badcfe

D=0x10325476

第四步,定义四个MD5基本的按位操作函数:

X,Y,Z为32位整数。

F(X,Y,Z)=(XandY)or(not(X)andZ)

G(X,Y,Z)=(XandZ)or(Yandnot(Z))

H(X,Y,Z)=XxorYxorZ

I(X,Y,Z)=Yxor(Xornot(Z))

再定义四个分别用于四轮变换的函数。

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

FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<

GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<

HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<

II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<

第五步,对输入数据作变换:

处理数据,N是总的字节数,以64个字节为一组,每组作一次循环,每次循环进行四轮操作。

要变换的64个字节用16个32位的整数数组M[0...15]表示。而数组T[1...64]表示一组常数,

T[i]为4294967296*abs(sin(i))的32位整数部分,i的单位是弧度,i的取值从1到64。

具体过程如下:

/*设置主循环变量*/

Fori=0toN/16-1do

/*每循环一次,把数据原文存放在16个元素的数组X中.*/

Forj=0to15do

SetX[j]toM[i*16+j].

end/结束对J的循环

/*SaveAasAA,BasBB,CasCC,andDasDD.

*/

AA=A

BB=B

CC=C

DD=D

/*第1轮*/

/*以[abcdksi]表示如下操作

a=b+((a+F(b,c,d)+X[k]+T[i])<<<s).*/

/*Dothefollowing16operations.*/

[ABCD071][DABC1122][CDAB2173][BCDA3224]

[ABCD475][DABC5126][CDAB6177][BCDA7228]

[ABCD879][DABC91210][CDAB101711][BCDA112212]

[ABCD12713][DABC131214][CDAB141715][BCDA152216]

/*第2轮**/

/*以[abcdksi]表示如下操作

a=b+((a+G(b,c,d)+X[k]+T[i])<<<s).*/

/*Dothefollowing16operations.*/

[ABCD1517][DABC6918][CDAB111419][BCDA02020]

[ABCD5521][DABC10922][CDAB151423][BCDA42024]

[ABCD9525][DABC14926][CDAB31427][BCDA82028]

[ABCD13529][DABC2930][CDAB71431][BCDA122032]

/*第3轮*/

/*以[abcdksi]表示如下操作

a=b+((a+H(b,c,d)+X[k]+T[i])<<<s).*/

/*Dothefollowing16operations.*/

[ABCD5433][DABC81134][CDAB111635][BCDA142336]

[ABCD1437][DABC41138][CDAB71639][BCDA102340]

[ABCD13441][DABC01142][CDAB31643][BCDA62344]

[ABCD9445][DABC121146][CDAB151647][BCDA22348]

/*第4轮*/

/*以[abcdksi]表示如下操作

a=b+((a+I(b,c,d)+X[k]+T[i])<<<s).*/

/*Dothefollowing16operations.*/

[ABCD0649][DABC71050][CDAB141551][BCDA52152]

[ABCD12653][DABC31054][CDAB101555][BCDA12156]

[ABCD8657][DABC151058][CDAB61559][BCDA132160]

[ABCD4661][DABC111062][CDAB21563][BCDA92164]

/*然后进行如下操作*/

A=A+AA

B=B+BB

C=C+CC

D=D+DD

Nexti/*结束对I的循环*/

第六步,输出结果。

A,B,C,D连续存放,共16个字节,128位。按十六进制依次输出这个16个字节。

,用程序语言实现算法后,可以输入以下几个信息对程序作一个简单的测试,

看看程序有没有错误。

MD5("")=d41d8cd98f00b204e9800998ecf8427e

MD5("a")=0cc175b9c0f1b6a831c399e269772661

MD5("abc")=900150983cd24fb0d6963f7d28e17f72

MD5("messagedigest")=f96b697d7cb7938d525a2f31aaf161d0

MD5("abcdefghijklmnopqrstuvwxyz")=c3fcd3d76192e4007dfb496cca67e13b

MD5("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")=

d174ab98d277d9f5a5611c2c9f419d9f

MD5("123456789012345678901234567890123456789012345678901234567890123456789

01234567890")=57edf4a22be3c955ac49da2e2107b67a

应用

MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:

MD5(tanajiya.tar.gz)=0ca175b9c0f726a831d895e269332461

这就是tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个的MD5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算MD5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的"抵赖",这就是所谓的数字签名应用。

MD5也常常在某些软件下载站点的软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如WindowsMD5Check等)做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件、安全等方面。

MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方面。如在UNIX系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。

工具

WinMD5v2.05(需要.NET运行库):https://www.blisstonia.com/software/WinMD5/WinMD5v2.05.zip

WinMD5v1.1(无需.NET支持):https://www.blisstonia.com/software/WinMD5/WinMD5v1.1.zip

HashCalcv2.01:https://www.slavasoft.com/zip/hashcalc.zip

HashTabWindowsShellExtensionv1.9:https://beeblebrox.org/hashtab/hashtab_setup.exe