MD5算法实现解读_第1页
MD5算法实现解读_第2页
MD5算法实现解读_第3页
MD5算法实现解读_第4页
MD5算法实现解读_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、md5加密算法c实现md5的介绍的文章网上很多,关于md5的来历,用途什么的这里就不再介绍了。这里主要介绍代码。代码明白了就什么都明白了。/*md5.h*/#ifndef_MD5_H_#defi ne_MD5_H_#defi neR_memset(x,y,z)memset(x,y,z)#defi neR_memcpy(x,y,z)memcpy(x,y,z)#defi neR_memcmp(x,y,z)memcmp(x,y,z)typedefu nsig nedl on gUINT4;typedefu nsig nedchar*POINTER;/*MD5co ntext.*/typedefstr

2、uct/*state(ABCD)*/*四个32bits数,用于存放最终计算得到的消息摘要。当消息长度512bits时,也用于存放每个512bits的中间结果*/UINT4state4;/*n umberofbits,modulo2A64(lsbfirst)*/*存储原始信息的bits数长度,不包括填充的bits,最长为2A64bits,因为2A64是一个64位 数的最大值*/UINT4cou nt2;/*in putbuffer*/*存放输入的信息的缓冲区,512bits*/un sig nedcharbuffer64;MD5_CTX;voidMD5I ni t(MD5_CTX*);voidM

3、D5Update(MD5_CTX*,u nsig nedchar*,u nsig nedi nt);voidMD5Fi nal(u nsig nedchar16,MD5_CTX*);#e ndif/*_MD5_H_*/*md5.cpp*/#i ncludestdafx.h/*Con sta ntsforMD5Tra nsformrouti ne.*/*md5转换用到的常量,算法本身规定的*/#defi neS117#defi neS1212#defi neS1317#defi neS1422#defi neS215#defi neS229#defi neS2314#defi neS2420#d

4、efi neS314#defi neS3211#defi neS3316#defi neS3423#defi neS416#defi neS4210#defi neS4315#defi neS4421staticvoidMD5Tra nsform(UINT44,u nsig nedchar64);staticvoidE ncode( un sig nedchar*,UINT4*, un sig nedi nt);staticvoidDecode(UINT4*, un sig nedchar* ,un sig nedin t);/*用于bits填充的缓冲区,为什么要64个字节呢?因为当欲加密的信

5、息的bits数被512除其余数为448时,需要填充的bits的最大值为512=64*8。*/staticu nsig nedcharPADDING64=0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;/*接下来的这几个宏定义是md5算法规定的,就是对信息进行md5加密都要做的运算。据说有经验的高手跟踪程序时根据这几个特殊的操作就可以断定是不是用的md5*/*F,G,Ha ndlare

6、basicMD5fu nctio ns.*/#defi neF(x,y,z)(x)&( y)|(x )&(z)#defi neG(x,y,z)(x )&(z)|(y)&(z)#defi neH(x,y,z)(x)A(y)A(z)#defi nel(x,y,z)(y)A(x)|(z)/*ROTA TE_LEFTrotatesxleft nbits.*/#defi neROTATE_LEFT(x, n)(x)(32-( n)/*FF,GG,HH,a ndlltra nsformatio nsforrou nds1,2,3,a nd4.Rotati oni sseparatefromadditi o

7、n topreve ntrecomputati on.*/#defi neFF(a,b,c,d,x,s,ac)/+=F(b),(c),(d)+(x)+(UINT4)(ac);/(a)=ROTATE_LEFT(a),(s);/(a)+=(b);/#defi neGG(a,b,c,d,x,s,ac)/(a)+=G(b),(c),(d)+(x)+(UINT4)(ac);/(a)=ROTATE_LEFT(a),(s);/(a)+=(b);/#defi neHH(a,b,c,d,x,s,ac)/+=H(b),(c),(d)+(x)+(UINT4)(ac);/(a)=ROTATE_LEFT(a),(s);

8、/(a)+=(b);/#defi nell(a,b,c,d,x,s,ac)/+=I(b),(c),(d)+(x)+(UINT4)(ac);/(a)=ROTATE_LEFT(a),(s);/(a)+=(b);/*MD5i nitializatio n.Begi nsan MD5operati on ,writi ngan ewc on text.*/*初始化md5的结构*/voidMD5I ni t(MD5_CTX*co ntext)/*将当前的有效信息的长度设成0,这个很简单,还没有有效信息,长度当然是0 了*/con text-co un t0=c on text-co un t1=0;*/

9、*Loadmagi cin itializatio neon sta nts.*/*初始化链接变量,算法要求这样,这个没法解释了con text-state0=0x67452301;con text-state1=0xefcdab89;con text-state2=0x98badcfe;con text-state3=0x10325476;/*MD5blockupdateoperatio n.Co nti nu esa nMD5message-digestoperati on, process ingano thermessageblock,a ndupdat in gthecon text

10、.*/*将与加密的信息传递给 md5结构,可以多次调用con text:初始化过了的 md5结构in put:欲加密的信息,可以任意长in putLe n :指定in put的长度*/voidMD5Update(MD5_CTX*co ntext,u nsig nedchar*i nput,u nsig nedi ntin putLe n)un sig nedi nti,i ndex,partLe n;/*Compute nu mberofbytesmod64*/*计算已有信息的bits长度的字节数的模 64,64bytes=512bits。用于判断已有信息加上当前传过来的信息的总长度能不能达到

11、512bits,如果能够达到则对凑够的512bits进行一次处理*/in dex=(u nsig nedi nt)(co ntext-cou nt03)&0x3F);/*Updatenumberofbits*/* 更新已有信息的bits 长度*/if(co ntext-cou nt0+=(UINT4)i nputLe n 3)(UINT4)i nputLe n co un t1+;con text-cou nt1+=(UINT4)i nputLe n29);/*计算已有的字节数长度还差多少字节可以凑成64的整倍数*/partLe n=64-i ndex;/*Tra nsformasma ny

12、timesaspossible.*/*如果当前输入的字节数大于已有字节数长度补足64字节整倍数所差的字节数*/if(in putLe n=partLe n)/*用当前输入的内容把context-buffer的内容补足 512bits*/R_memcpy(POINTER )&con text-bufferi ndex,(POINTER)i nput,partLe n);/*用基本函数对填充满的 512bits (已经保存到context-buffer中)做一次转换,转换结果保存到 context-state 中 */MD5Tra nsform(c on text-state,c on text-

13、buffer);/*对当前输入的剩余字节做转换(如果剩余的字节 大于512bits的 话),转换结果保存到 context-state中 */for(i=partLen;i+63inputLen;i+=64)/* 把 i+63inputlen 改为 i+64state,&in puti);in dex=0;elsei=0;/*Bufferremai ningin put*/*将输入缓冲区中的不足填充满512bits的剩余内容填充到context-buffer中,留待以后再作处理*/R_memcpy(POINTER)&con text-bufferi ndex,(POINTER )&in put

14、i,i nputLe n-i);/*MD5fi nalizati on.En dsa nMD5message-digestoperati on, writi ngthethemessagedigesta ndzeroiz in gthec on text.*/*获取加密的最终结果digest :保存最终的加密串con text :你前面初始化并填入了信息的 md5结构*/voidMD5Fi nal(u nsig nedchardigest16,MD5_CTX*co ntext)un sig nedcharbits8;un sig nedi nti ndex,padLe n;/*Save nu

15、mberofbits*/*将要被转换的信息(所有的)的bits长度拷贝到bits中*/En code(bits,c on text-co un t,8);/*Padoutto56mod64.*/*计算所有的bits长度的字节数的模 64,64bytes=512bits*/in dex=(u nsig ned in t)(co ntext-cou nt03)&0x3f);/*计算需要填充的字节数, padLen的取值范围在1-64之间*/padLe n=(i ndexstate,16);/*Zeroizese nsitivei nformatio n.*/R_memset(POINTER)co

16、ntext,0,sizeof(*co ntext);/*MD5basictra nsformatio n.Tra nsformsstatebasedo nblock.*/*对512bits信息(即block缓冲区)进行一次处理,每次处理包括四轮state4: md5结构中的state4,用于保存对512bits信息加密的中间结果或者最终结果 block64:欲加密的 512bits信息*/staticvoidMD5Tra nsform(UINT4state4,u nsig nedcharblock64)UINT4a=state0,b=state1,c=state2,d=state3,x16;D

17、ecode(x,block,64);/*Rou nd1*/FF(a,b,c,d,x0,S11,0xd76aa478);/*1*/FF(d,a,b,c,x1,S12,0xe8c7b756);/*2*/FF(c,d,a,b,x2,S13,0x242070db);/*3*/FF(b,c,d,a,x3,S14,0xc1bdceee);/*4*/FF(a,b,c,d,x4,S11,0xf57c0faf);/*5*/FF(d,a,b,c,x5,S12,0x4787c62a);/*6*/FF(c,d,a,b,x6,S13,0xa8304613);/*7*/FF(b,c,d,a,x7,S14,0xfd4695

18、01);/*8*/FF(a,b,c,d,x8,S11,0x698098d8);/*9*/FF(d,a,b,c,x9,S12,0x8b44f7af);/*10*/FF(c,d,a,b,x10,S13,0xffff5bb1);/*11*/FF(b,c,d,a,x11,S14,0x895cd7be);/*12*/FF(a,b,c,d,x12,S11,0x6b901122);/*13*/FF(d,a,b,c,x13,S12,0xfd987193);/*14*/FF(c,d,a,b,x14,S13,0xa679438e);/*15*/FF(b,c,d,a,x15,S14,0x49b40821);/*16

19、*/*Rou nd2*/GG(a,b,c,d,x1,S21,0xf61e2562);/*17*/GG(d,a,b,c,x 6,S22,0xc040b340);/*18*/GG(c,d,a,b,x11,S23,0x265e5a51);/*19*/GG(b,c,d,a,x0,S24,0xe9b6c7aa);/*20*/ GG(a,b,c,d,x5,S21,0xd62f105d);/*21*/ GG(d,a,b,c,x10,S22,0x2441453);/*22*/ GG(c,d,a,b,x15,S23,0xd8a1e681);/*23*/ GG(b,c,d,a,x4,S24,0xe7d3fbc8)

20、;/*24*/ GG(a,b,c,d,x9,S21,0x21e1cde6);/*25*/ GG(d,a,b,c,x14,S22,0xc33707d6);/*26*/ GG(c,d,a,b,x3,S23,0xf4d50d87);/*27*/ GG(b,c,d,a,x8,S24,0x455a14ed);/*28*/ GG(a,b,c,d,x13,S21,0xa9e3e905);/*29*/ GG(d,a,b,c,x2,S22,0xfcefa3f8);/*30*/ GG(c,d,a,b,x7,S23,0x676f02d9);/*31*/ GG(b,c,d,a,x12,S24,0x8d2a4c8a);

21、/*32*/*Rou nd3*/HH(a,b,c,d,x5,S31,0xfffa3942);/*33*/ HH(d,a,b,c,x8,S32,0x8771f681);/*34*/ HH(c,d,a,b,x11,S33,0x6d9d6122);/*35*/ HH(b,c,d,a,x14,S34,0xfde5380c);/*36*/ HH(a,b,c,d,x1,S31,0xa4beea44);/*37*/ HH(d,a,b,c,x4,S32,0x4bdecfa9);/*38*/ HH(c,d,a,b,x7,S33,0xf6bb4b60);/*39*/ HH(b,c,d,a,x10,S34,0xbe

22、bfbc70);/*40*/ HH(a,b,c,d,x13,S31,0x289b7ec6);/*41*/ HH(d,a,b,c,x0,S32,0xeaa127fa);/*42*/ HH(c,d,a,b,x3,S33,0xd4ef3085);/*43*/ HH(b,c,d,a,x6,S34,0x4881d05);/*44*/ HH(a,b,c,d,x9,S31,0xd9d4d039);/*45*/ HH(d,a,b,c,x12,S32,0xe6db99e5);/*46*/ HH(c,d,a,b,x15,S33,0x1fa27cf8);/*47*/ HH(b,c,d,a,x2,S34,0xc4ac

23、5665);/*48*/*Rou nd4*/ ll(a,b,c,d,x0,S41,0xf4292244);/*49*/ ll(d,a,b,c,x7,S42,0x432aff97);/*50*/ II(c,d,a,b,x14,S43,0xab9423a7);/*51*/ ll(b,c,d,a,x5,S44,0xfc93a039);/*52*/ ll(a,b,c,d,x12,S41,0x655b59c3);/*53*/ ll(d,a,b,c,x3,S42,0x8f0ccc92);/*54*/ II(c,d,a,b,x10,S43,0xffeff47d);/*55*/ II(b,c,d,a,x1,S

24、44,0x85845dd1);/*56*/ II(a,b,c,d,x8,S41,0x6fa87e4f);/*57*/ II(d,a,b,c,x15,S42,0xfe2ce6e0);/*58*/ ll(c,d,a,b,x6,S43,0xa3014314);/*59*/ll(b,c,d,a,x13,S44,0x4e0811a1);/*60*/ll(a,b,c,d,x4,S41,0xf7537e82);/*61*/ll(d,a,b,c,x11,S42,0xbd3af235);/*62*/ll(c,d,a,b,x2,S43,0x2ad7d2bb);/*63*/ll(b,c,d,a,x9,S44,0xe

25、b86d391);/*64*/stateO+=a;state1+=b;state2+=c;state3+=d;/*Zeroizese nsitivei nformatio n.*/R_memset(POINTER)x,0,sizeof(x);/*En codes in put(UINT4)i ntooutput( un sig nedchar).Assumesle nisamultipleof4.*/*将4字节的整数copy到字符形式的缓冲区中output :用于输出的字符缓冲区in put:欲转换的四字节的整数形式的数组len: output缓冲区的长度,要求是4的整数倍*/staticvoidE ncode( un sig nedchar*output,UINT4* in put,u nsig nedi ntle n)un sig nedi nti,j;for(i=0,j=0;j8)&0 xff);outputj+2=(u nsig nedchar)(i nputi16)&0 xff);outputj+3=(u nsig nedchar)(i nputi 24)&0 xff);/*Decodesi nput(u nsig

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论