实验四、基于MD5的文件完整性校验程序设计与实现1、实验目的验证MD5的工作原理。编写并调试基于MD5的文件完整性校验程序。2、实验设备与环境连网PC机(至少一台)。计算机硬件要求:IntelPentium5处理器、256MB以上内存,Ethernet网卡,网线若干。计算机软件要求:WindowsXP/win7操作系统,TCP/IP协议,Visualstudio系统。3、实验要求能够以浏览的方式打开指定的文件能够计算指定文件的MD5能够将文件的MD5结果转换为大写文件内容改变后能够判别文件已被篡改4、实验步骤步骤1:使用VC++的应用程序生成向导(MFCAppWizard[exe])创建一个基于对话框的工程,该工程的名称为201200824302MD5步骤2:主界面的设计:同时在类向导里面添加需要的变量:步骤3:添加每一个按钮的响应事件3.1宏定义的添加:#includestdio.h#includestdlib.h#includememory.h#includemath.h#includewindows.h#defineF(x,y,z)(((x)&(y))|((~x)&(z)))#defineG(x,y,z)(((x)&(z))|((y)&(~z)))#defineH(x,y,z)((x)^(y)^(z))#defineI(x,y,z)((y)^((x)|(~z)))#defineRL(x,y)(((x)(y))|((x)(32-(y))))//x向左循环移y位#definePP(x)(x24)|((x8)&0xff0000)|((x8)&0xff00)|(x24)#defineFF(a,b,c,d,x,s,ac)a=b+(RL((a+F(b,c,d)+x+ac),s))#defineGG(a,b,c,d,x,s,ac)a=b+(RL((a+G(b,c,d)+x+ac),s))#defineHH(a,b,c,d,x,s,ac)a=b+(RL((a+H(b,c,d)+x+ac),s))#defineII(a,b,c,d,x,s,ac)a=b+(RL((a+I(b,c,d)+x+ac),s))3.2函数在声明:voidmd5();3.3函数的实现:voidCMy201200824305_MD5Dlg::md5(){a=A,b=B,c=C,d=D;/**//*Round1*/FF(a,b,c,d,x[0],7,0xd76aa478);/**//*1*/FF(d,a,b,c,x[1],12,0xe8c7b756);/**//*2*/FF(c,d,a,b,x[2],17,0x242070db);/**//*3*/FF(b,c,d,a,x[3],22,0xc1bdceee);/**//*4*/FF(a,b,c,d,x[4],7,0xf57c0faf);/**//*5*/FF(d,a,b,c,x[5],12,0x4787c62a);/**//*6*/FF(c,d,a,b,x[6],17,0xa8304613);/**//*7*/FF(b,c,d,a,x[7],22,0xfd469501);/**//*8*/FF(a,b,c,d,x[8],7,0x698098d8);/**//*9*/FF(d,a,b,c,x[9],12,0x8b44f7af);/**//*10*/FF(c,d,a,b,x[10],17,0xffff5bb1);/**//*11*/FF(b,c,d,a,x[11],22,0x895cd7be);/**//*12*/FF(a,b,c,d,x[12],7,0x6b901122);/**//*13*/FF(d,a,b,c,x[13],12,0xfd987193);/**//*14*/FF(c,d,a,b,x[14],17,0xa679438e);/**//*15*/FF(b,c,d,a,x[15],22,0x49b40821);/**//*16*/intnpos;npos=m_progress.GetPos();npos+=25;m_progress.OffsetPos(npos);/**//*Round2*/GG(a,b,c,d,x[1],5,0xf61e2562);/**//*17*/GG(d,a,b,c,x[6],9,0xc040b340);/**//*18*/GG(c,d,a,b,x[11],14,0x265e5a51);/**//*19*/GG(b,c,d,a,x[0],20,0xe9b6c7aa);/**//*20*/GG(a,b,c,d,x[5],5,0xd62f105d);/**//*21*/GG(d,a,b,c,x[10],9,0x02441453);/**//*22*GG(c,d,a,b,x[15],14,0xd8a1e681);/**//*23*/GG(b,c,d,a,x[4],20,0xe7d3fbc8);/**//*24*/GG(a,b,c,d,x[9],5,0x21e1cde6);/**//*25*/GG(d,a,b,c,x[14],9,0xc33707d6);/**//*26*/GG(c,d,a,b,x[3],14,0xf4d50d87);/**//*27*/GG(b,c,d,a,x[8],20,0x455a14ed);/**//*28*/GG(a,b,c,d,x[13],5,0xa9e3e905);/**//*29*/GG(d,a,b,c,x[2],9,0xfcefa3f8);/**//*30*/GG(c,d,a,b,x[7],14,0x676f02d9);/**//*31*/GG(b,c,d,a,x[12],20,0x8d2a4c8a);/**//*32*/npos+=25;m_progress.OffsetPos(npos);/**//*Round3*/HH(a,b,c,d,x[5],4,0xfffa3942);/**//*33*/HH(d,a,b,c,x[8],11,0x8771f681);/**//*34*/HH(c,d,a,b,x[11],16,0x6d9d6122);/**//*35*/HH(b,c,d,a,x[14],23,0xfde5380c);/**//*36*/HH(a,b,c,d,x[1],4,0xa4beea44);/**//*37*/HH(d,a,b,c,x[4],11,0x4bdecfa9);/**//*38*/HH(c,d,a,b,x[7],16,0xf6bb4b60);/**//*39*/HH(b,c,d,a,x[10],23,0xbebfbc70);/**//*40*/HH(a,b,c,d,x[13],4,0x289b7ec6);/**//*41*/HH(d,a,b,c,x[0],11,0xeaa127fa);/**//*42*/HH(c,d,a,b,x[3],16,0xd4ef3085);/**//*43*/HH(b,c,d,a,x[6],23,0x04881d05);/**//*44*/HH(a,b,c,d,x[9],4,0xd9d4d039);/**//*45*/HH(d,a,b,c,x[12],11,0xe6db99e5);/**//*46*/HH(c,d,a,b,x[15],16,0x1fa27cf8);/**//*47*/HH(b,c,d,a,x[2],23,0xc4ac5665);/**//*48*/npos+=25;m_progress.OffsetPos(npos);/**//*Round4*/II(a,b,c,d,x[0],6,0xf4292244);/**//*49*/II(d,a,b,c,x[7],10,0x432aff97);/**//*50*/II(c,d,a,b,x[14],15,0xab9423a7);/**//*51*/II(b,c,d,a,x[5],21,0xfc93a039);/**//*52*/II(a,b,c,d,x[12],6,0x655b59c3);/**//*53*/II(d,a,b,c,x[3],10,0x8f0ccc92);/**//*54*/II(c,d,a,b,x[10],15,0xffeff47d);/**//*55*/II(b,c,d,a,x[1],21,0x85845dd1);/**//*56*/II(a,b,c,d,x[8],6,0x6fa87e4f);/**//*57*/II(d,a,b,c,x[15],10,0xfe2ce6e0);/**//*58*/II(c,d,a,b,x[6],15,0xa3014314);/**//*59*/II(b,c,d,a,x[13],21,0x4e0811a1);/**//*60*/II(a,b,c,d,x[4],6,0xf7537e82);/**//*61*/II(d,a,b,c,x[11],10,0xbd3af235);/**//*62*/II(c,d,a,b,x[2],15,0x2ad7d2bb);/**//*63*/II(b,c,d,a,x[9],21,0xeb86d391);/**//*64*/npos+=25;m_progress.OffsetPos(npos);A+=a;B+=b;C+=c;D+=d;}3.4添加响应“打开文件”按钮的事件:voidCMy201200824302MD5Dlg::OnOpenButton(){CStringfilename;//保存路径unsignedlen;CFileDialogopendlg(TRUE,_T(*),NULL,OFN_OVERWRITEPROMPT,_T(所有文件(*.*;)|*.*||),NULL);//_T(*.rar)if(opendlg.DoModal()==IDOK){filename=opendlg.GetPathName();}elsereturn;if(!(fp=fopen(filename,rb))){MessageBox(不能打开文件!);return;}//以二进制打开文件fseek(fp,0,SEEK_END);//文件指针转到文件末尾if((len=ftell(fp))==-1){MessageBox(Sorry!Cannotcalculatefileswhichlargerthan2GB!\n);fclose(fp);}//ftell函数返回long,最大为2GB,超出返回-1rewind(fp);//文件指针复位到文件头A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476;//初始化链接变量flen[1]=len/0x20000000;//flen单位是bitflen[0]=(len%0x20000000)*8;memset(x,0,64);//初始化x数组为0fread(&x,4,16,fp);//以4字节为一组,读取16组数据for(i=0;ilen/64;i++){//循环运算直至文件结束md5();memset(x,0,64);fread(&x,4,16,fp);}((char*)x)[len%64]=128;//文件结束补1,补0操作,128二进制即10000000if(len%6455)md5(),memset(x,0,64);memcpy(x+14,flen,8);//文件末尾加入原文件的bit长度md5();fclose(fp);m_md5value.Format(%08x%08x%08x%08x,PP(A),PP(B),PP(C),PP(D));UpdateData(false);}3.5添加响应“复制MD5值”按钮的事件:voidCMy201200824302MD5Dlg::OnCopyButton(){if(m_md5value==)MessageBox(请先查看文件的MD5值!,提示);else{if(OpenClipboard()){HG