MD5算法.docx

上传人:b****6 文档编号:5772825 上传时间:2023-01-01 格式:DOCX 页数:19 大小:32.13KB
下载 相关 举报
MD5算法.docx_第1页
第1页 / 共19页
MD5算法.docx_第2页
第2页 / 共19页
MD5算法.docx_第3页
第3页 / 共19页
MD5算法.docx_第4页
第4页 / 共19页
MD5算法.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

MD5算法.docx

《MD5算法.docx》由会员分享,可在线阅读,更多相关《MD5算法.docx(19页珍藏版)》请在冰豆网上搜索。

MD5算法.docx

MD5算法

MD5算法

在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。

算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。

首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。

填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。

这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。

四个32位变量初始化为:

A=0x01234567

B=0x89abcdef

C=0xfedcba98

D=0x76543210

它们称为链接变量(chainingvariable)

接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。

将上面四个变量复制到别外的变量中:

A到a,B到b,C到c,D到d。

主循环有四轮(MD4只有三轮),每轮很相拟。

第一轮进行16次操作。

每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。

再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。

最后用该结果取代a,b,c或d中之一。

以一下是每次操作中用到的四个非线性函数(每轮一个)。

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))

(&是与,|是或,~是非,^是异或)

这些函数是这样设计的:

如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。

函数F是按逐位方式操作:

如果X,那么Y,否则Z。

函数H是逐位奇偶操作符。

设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)<<

这四轮(64步)是:

第一轮

FF(a,b,c,d,M0,7,0xd76aa478)

FF(d,a,b,c,M1,12,0xe8c7b756)

FF(c,d,a,b,M2,17,0x242070db)

FF(b,c,d,a,M3,22,0xc1bdceee)

FF(a,b,c,d,M4,7,0xf57c0faf)

FF(d,a,b,c,M5,12,0x4787c62a)

FF(c,d,a,b,M6,17,0xa8304613)

FF(b,c,d,a,M7,22,0xfd469501)

FF(a,b,c,d,M8,7,0x698098d8)

FF(d,a,b,c,M9,12,0x8b44f7af)

FF(c,d,a,b,M10,17,0xffff5bb1)

FF(b,c,d,a,M11,22,0x895cd7be)

FF(a,b,c,d,M12,7,0x6b901122)

FF(d,a,b,c,M13,12,0xfd987193)

FF(c,d,a,b,M14,17,0xa679438e)

FF(b,c,d,a,M15,22,0x49b40821)

第二轮

GG(a,b,c,d,M1,5,0xf61e2562)

GG(d,a,b,c,M6,9,0xc040b340)

GG(c,d,a,b,M11,14,0x265e5a51)

GG(b,c,d,a,M0,20,0xe9b6c7aa)

GG(a,b,c,d,M5,5,0xd62f105d)

GG(d,a,b,c,M10,9,0x02441453)

GG(c,d,a,b,M15,14,0xd8a1e681)

GG(b,c,d,a,M4,20,0xe7d3fbc8)

GG(a,b,c,d,M9,5,0x21e1cde6)

GG(d,a,b,c,M14,9,0xc33707d6)

GG(c,d,a,b,M3,14,0xf4d50d87)

GG(b,c,d,a,M8,20,0x455a14ed)

GG(a,b,c,d,M13,5,0xa9e3e905)

GG(d,a,b,c,M2,9,0xfcefa3f8)

GG(c,d,a,b,M7,14,0x676f02d9)

GG(b,c,d,a,M12,20,0x8d2a4c8a)

第三轮

HH(a,b,c,d,M5,4,0xfffa3942)

HH(d,a,b,c,M8,11,0x8771f681)

HH(c,d,a,b,M11,16,0x6d9d6122)

HH(b,c,d,a,M14,23,0xfde5380c)

HH(a,b,c,d,M1,4,0xa4beea44)

HH(d,a,b,c,M4,11,0x4bdecfa9)

HH(c,d,a,b,M7,16,0xf6bb4b60)

HH(b,c,d,a,M10,23,0xbebfbc70)

HH(a,b,c,d,M13,4,0x289b7ec6)

HH(d,a,b,c,M0,11,0xeaa127fa)

HH(c,d,a,b,M3,16,0xd4ef3085)

HH(b,c,d,a,M6,23,0x04881d05)

HH(a,b,c,d,M9,4,0xd9d4d039)

HH(d,a,b,c,M12,11,0xe6db99e5)

HH(c,d,a,b,M15,16,0x1fa27cf8)

HH(b,c,d,a,M2,23,0xc4ac5665)

第四轮

II(a,b,c,d,M0,6,0xf4292244)

II(d,a,b,c,M7,10,0x432aff97)

II(c,d,a,b,M14,15,0xab9423a7)

II(b,c,d,a,M5,21,0xfc93a039)

II(a,b,c,d,M12,6,0x655b59c3)

II(d,a,b,c,M3,10,0x8f0ccc92)

II(c,d,a,b,M10,15,0xffeff47d)

II(b,c,d,a,M1,21,0x85845dd1)

II(a,b,c,d,M8,6,0x6fa87e4f)

II(d,a,b,c,M15,10,0xfe2ce6e0)

II(c,d,a,b,M6,15,0xa3014314)

II(b,c,d,a,M13,21,0x4e0811a1)

II(a,b,c,d,M4,6,0xf7537e82)

II(d,a,b,c,M11,10,0xbd3af235)

II(c,d,a,b,M2,15,0x2ad7d2bb)

II(b,c,d,a,M9,21,0xeb86d391)

常数ti可以如下选择:

在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。

(2的32次方)

所有这些完成之后,将A,B,C,D分别加上a,b,c,d。

然后用下一分组数据继续运行算法,最后的输出是A,B,C和D的级联。

MD5的安全性

MD5相对MD4所作的改进:

1.增加了第四轮.

2.每一步均有唯一的加法常数.

3.为减弱第二轮中函数G的对称性从(X&Y)|(X&Z)|(Y&Z)变为(X&Z)|(Y&(~Z))

4.第一步加上了上一步的结果,这将引起更快的雪崩效应.

5.改变了第二轮和第三轮中访问消息子分组的次序,使其更不相似.

6.近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应.各轮的位移量互不相同.

 [转载]MD5算法之C#程序MD5算法描述

MD5算法描述

作者:

rufi2004.06.22

当我要写一个MD5算法的程序时,发现中英文的语言描述都有一些不确切的地方,某些个细节

讲得不清楚,或者说很费解。

最后不得不拿出C语言的源程序来调试,这对于理解算法是很不

利的。

于是就总结了一下我摸索到的一些要点。

1.来历

MD5的全称是message-digestalgorithm5(信息-摘要算法,在90年代初由mitlaboratory

forcomputerscience和rsadatasecurityinc的ronaldl.rivest开发出来,

经md2、md3和md4发展而来。

http:

//www.ietf.org/rfc/rfc1321.txt,是一份最权威的文档,

由ronaldl.rivest在1992年8月向ieft提交。

2.用途

MD5的作用是对一段信息(message)生成信息摘要(message-digest),该摘要对该信息具有

唯一性,可以作为数字签名。

用于验证文件的有效性(是否有丢失或损坏的数据),对用户

密码的加密,在哈希函数中计算散列值。

3.特点

输入一个任意长度的字节串,生成一个128位的整数。

由于算法的某些不可逆特征,在加密应用

上有较好的安全性。

并且,MD5算法的使用不需要支付任何版权费用。

4.说明

唯一性和不可逆性都不是绝对的,从理论上分析是一种多对一的关系,但两个不同的信息产生

相同摘要的概率很小。

不可逆是指从输出反推输入所需的运算量和计算时间太大,使用穷搜字

典的方法又需要太多的存储空间。

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])<<

/*Dothefollowing16operations.*/

[ABCD 0 7 1] [DABC 112 2] [CDAB 217 3] [BCDA 322 4]

[ABCD 4 7 5] [DABC 512 6] [CDAB 617 7] [BCDA 722 8]

[ABCD 8 7 9] [DABC 91210] [CDAB101711] [BCDA112212]

[ABCD12 713] [DABC131214] [CDAB141715] [BCDA152216]

/*第2轮**/

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

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

/*Dothefollowing16operations.*/

[ABCD 1 517] [DABC 6 918] [CDAB111419] [BCDA 02020]

[ABCD 5 521] [DABC10 922] [CDAB151423] [BCDA 42024]

[ABCD 9 525] [DABC14 926] [CDAB 31427] [BCDA 82028]

[ABCD13 529] [DABC 2 930] [CDAB 71431] [BCDA122032]

/*第3轮*/

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

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

/*Dothefollowing16operations.*/

[ABCD 5 433] [DABC 81134] [CDAB111635] [BCDA142336]

[ABCD 1 437] [DABC 41138] [CDAB 71639] [BCDA102340]

[ABCD13 441] [DABC 01142] [CDAB 31643] [BCDA 62344]

[ABCD 9 445] [DABC121146] [CDAB151647] [BCDA 22348]

/*第4轮*/

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

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

/*Dothefollowing16operations.*/

[ABCD 0 649] [DABC 71050] [CDAB141551] [BCDA 52152]

[ABCD12 653] [DABC 31054] [CDAB101555] [BCDA 12156]

[ABCD 8 657] [DABC151058] [CDAB 61559] [BCDA132160]

[ABCD 4 661] [DABC111062] [CDAB 21563] [BCDA 92164]

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

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算法之C#程序

MD5算法比较特别,最适合用汇编语言来写,好多高级语言对之无能无力或效率极低。

比如我最开始尝试用Python和Euphoria编写,发现不太容易。

相比而言,C#作为C家簇

中新兴的一门.net语言,功能比较全面。

花了一晚上的工夫终于用C#最先实现了MD5。

主要是由于对算法的一些细节不太注意,结果输出总是不对,调试了好长时间。

[code]

//源文件:

md5.cs

//MD5Alogrithm

//byrufi2004.6.20

usingSystem;

usingSystem.Collections;

usingSystem.IO;

publicclassMD5{

 //staticstatevariables

 privatestaticUInt32A;

 privatestaticUInt32B;

 privatestaticUInt32C;

 privatestaticUInt32D;

 //numberofbitstorotateintranforming

 privateconstint S11=7;

 privateconstint S12=12;

 privateconstint S13=17;

 privateconstint S14=22;

 privateconstint S21=5;

 privateconstint S22=9;

 privateconstint S23=14;

 privateconstint S24=20;

 privateconstint S31=4;

 privateconstint S32=11;

 privateconstint S33=16;

 privateconstint S34=23;

 privateconstint S41=6;

 privateconstint S42=10;

 privateconstint S43=15;

 privateconstint S44=21;

 /*F,G,HandIarebasicMD5functions.

  *四个非线性函数:

  *

  *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))

  *

  *(&与,|或,~非,^异或)

  */

 privatestaticUInt32F(UInt32x,UInt32y,UInt32z){

   return(x&y)|((~x)&z);

 }

 privatestaticUInt32G(UInt32x,UInt32y,UInt32z){

   return(x&z)|(y&(~z));

 }

 privatestaticUInt32H(UInt32x,UInt32y,UInt32z){

   returnx^y^z;

 }

 privatestaticUInt32I(UInt32x,UInt32y,UInt32z){

   returny^(x|(~z));

 }

 /*FF,GG,HH,andIItransformationsforrounds1,2,3,and4.

  *Rotationisseparatefromadditiontopreventrecomputation.

  */

 privatestaticvoidFF(refUInt32a,UInt32b,UInt32c,UInt32d,UInt32mj,ints,UInt32ti){

   a=a+F(b,c,d)+mj+ti;

   a=a<>(32-s);

   a+=b;

 }

 privatestaticvoidGG(refUInt32a,UInt32b,UInt32c,UInt32d,UInt32mj,ints,UInt32ti){

   a=a+G(b,c,d)+mj+ti;

   a=a<>(32-s);

   a+=b;

 }

 privatestaticvoidHH(refUInt3

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1