第1页实验二哈希算法MD51、目的使学生认识理解数据哈希算法:了解其基本原理,掌握MD5算法过程。2、环境PC1台、软件VC60、3、方法和步骤(1)请根据算法的描述和你对算法过程的理解,选用一种编程语言C,C++,Java,Pascal来实现MD5和MAC算法,//以姓名小写全拼为消息,求消息的Md5指纹值如图1填充:图2:4轮线性调用第2页图3:第i轮指纹参数变到第i+1轮指纹参数。4、注意实验报告画出MD5的流程图;对MD5照指导书进行详细描述。记录64次线性过程所变的局部32位指纹的值,及变量名;第一个参数被更新,循环右移一个参数后作为下次的4参数。如:1:a:D6D117B42:d:344A8432第3页3:c:2F6FBD724:b:7AD956F2…64b:C08226B3以计算器为工具,手工验证,第1次和16,32,48,64次执行的a,b,c,d的计算过程。验证过程与比对过程写于报告之上。思考题:如果以姓名消息,以8位学号为密钥求MD5的HMAC值,共要做几次哈希,每次哈希分别调用了次”round”?5、预备知识1.理解MD5过程Step1:PaddingM0M1|M1|≡448mod512填充到512位的整数倍差64位。或者64字节整数倍差8个字节。–Padding内容:100…0Step2:Append64-bitlength填充前长度(单位:bits)。–若|M0|2^64,则仅取低64位。即|M|%2^64–数据格式:低字节在前(little-endian)小端格式。–|M2|为512的倍数:Y1,…,YL-1(L个分组)Step3:实始化指纹值(小端格式)(little-endian)(ABCD)CV0IV,I=1。,A=01234567(左边是内存状况,值形式:0x67452301)B=89ABCDEF(0xEFCDAB89)C=FEDCBA98(0x98BADCFE)D=76543210(0x10325476)Step4:MD5:压缩;CV0=IV,CVi=HMD5(CVi-1,Pi)4-1(a=A,b=B,c=C,d=D)4-2:从消息左边选出第三1个512位的分组,将其分16个整数x[0-15]。连同a,b,c,d指纹整数,移位数组s,常数数组ac,进行16位FF非线性变换。F(x,y,z)=(((x)&(y))|((~x)&(z)))FF(a,b,c,d,x,s,ac){(a)+=F((b),(c),(d))+(x)+(UINT4)(ac);(a)=ROTATE_LEFT((a),(s));(a)+=(b);}//第1轮S盒#defineS117#defineS1212#defineS1317#defineS1422第4页轮数开始:FF(a,b,c,d,x[0],S11,0xd76aa478);/*1*/FF(d,a,b,c,x[1],S12,0xe8c7b756);/*2*/FF(c,d,a,b,x[2],S13,0x242070db);/*3*/FF(b,c,d,a,x[3],S14,0xc1bdceee);/*4*/FF(a,b,c,d,x[4],S11,0xf57c0faf);/*5*/FF(d,a,b,c,x[5],S12,0x4787c62a);/*6*/FF(c,d,a,b,x[6],S13,0xa8304613);/*7*/FF(b,c,d,a,x[7],S14,0xfd469501);/*8*/FF(a,b,c,d,x[8],S11,0x698098d8);/*9*/FF(d,a,b,c,x[9],S12,0x8b44f7af);/*10*/FF(c,d,a,b,x[10],S13,0xffff5bb1);/*11*/FF(b,c,d,a,x[11],S14,0x895cd7be);/*12*/FF(a,b,c,d,x[12],S11,0x6b901122);/*13*/FF(d,a,b,c,x[13],S12,0xfd987193);/*14*/FF(c,d,a,b,x[14],S13,0xa679438e);/*15*/FF(b,c,d,a,x[15],S14,0x49b40821);/*16*//*第二轮循环*/G(x,y,z)=(((x)&(z))|((y)&(~z)))GG(a,b,c,d,x,s,ac){(a)+=G((b),(c),(d))+(x)+(UINT4)(ac);=ROTATE_LEFT((a),(s));(a)+=(b);}//第2轮S盒#defineS215#defineS229#defineS2314#defineS2420GG(a,b,c,d,x[1],S21,0xf61e2562);/*17*/GG(d,a,b,c,x[6],S22,0xc040b340);/*18*/GG(c,d,a,b,x[11],S23,0x265e5a51);/*19*/GG(b,c,d,a,x[0],S24,0xe9b6c7aa);/*20*/GG(a,b,c,d,x[5],S21,0xd62f105d);/*21*/GG(d,a,b,c,x[10],S22,0x2441453);/*22*/GG(c,d,a,b,x[15],S23,0xd8a1e681);/*23*/GG(b,c,d,a,x[4],S24,0xe7d3fbc8);/*24*/GG(a,b,c,d,x[9],S21,0x21e1cde6);/*25*/GG(d,a,b,c,x[14],S22,0xc33707d6);/*26*/GG(c,d,a,b,x[3],S23,0xf4d50d87);/*27*/GG(b,c,d,a,x[8],S24,0x455a14ed);/*28*/GG(a,b,c,d,x[13],S21,0xa9e3e905);/*29*/GG(d,a,b,c,x[2],S22,0xfcefa3f8);/*30*/GG(c,d,a,b,x[7],S23,0x676f02d9);/*31*/GG(b,c,d,a,x[12],S24,0x8d2a4c8a);/*32*/第5页/*第三轮循环*/H(x,y,z)=((x)^(y)^(z))HH(a,b,c,d,x,s,ac){(a)+=H((b),(c),(d))+(x)+(UINT4)(ac);(a)=ROTATE_LEFT((a),(s));(a)+=(b);}//第3轮S盒#defineS314#defineS3211#defineS3316#defineS3423HH(a,b,c,d,x[5],S31,0xfffa3942);/*33*/HH(d,a,b,c,x[8],S32,0x8771f681);/*34*/HH(c,d,a,b,x[11],S33,0x6d9d6122);/*35*/HH(b,c,d,a,x[14],S34,0xfde5380c);/*36*/HH(a,b,c,d,x[1],S31,0xa4beea44);/*37*/HH(d,a,b,c,x[4],S32,0x4bdecfa9);/*38*/HH(c,d,a,b,x[7],S33,0xf6bb4b60);/*39*/HH(b,c,d,a,x[10],S34,0xbebfbc70);/*40*/HH(a,b,c,d,x[13],S31,0x289b7ec6);/*41*/HH(d,a,b,c,x[0],S32,0xeaa127fa);/*42*/HH(c,d,a,b,x[3],S33,0xd4ef3085);/*43*/HH(b,c,d,a,x[6],S34,0x4881d05);/*44*/HH(a,b,c,d,x[9],S31,0xd9d4d039);/*45*/HH(d,a,b,c,x[12],S32,0xe6db99e5);/*46*/HH(c,d,a,b,x[15],S33,0x1fa27cf8);/*47*/HH(b,c,d,a,x[2],S34,0xc4ac5665);/*48*//*第四轮循环*/I(x,y,z)=((y)^((x)|(~z)))II(a,b,c,d,x,s,ac){(a)+=I((b),(c),(d))+(x)+(UINT4)(ac);(a)=ROTATE_LEFT((a),(s));(a)+=(b);}//第4轮S盒#defineS416#defineS4210#defineS4315#defineS4421II(a,b,c,d,x[0],S41,0xf4292244);/*49*/II(d,a,b,c,x[7],S42,0x432aff97);/*50*/II(c,d,a,b,x[14],S43,0xab9423a7);/*51*/II(b,c,d,a,x[5],S44,0xfc93a039);/*52*/第6页II(a,b,c,d,x[12],S41,0x655b59c3);/*53*/II(d,a,b,c,x[3],S42,0x8f0ccc92);/*54*/II(c,d,a,b,x[10],S43,0xffeff47d);/*55*/II(b,c,d,a,x[1],S44,0x85845dd1);/*56*/II(a,b,c,d,x[8],S41,0x6fa87e4f);/*57*/II(d,a,b,c,x[15],S42,0xfe2ce6e0);/*58*/II(c,d,a,b,x[6],S43,0xa3014314);/*59*/II(b,c,d,a,x[13],S44,0x4e0811a1);/*60*/II(a,b,c,d,x[4],S41,0xf7537e82);/*61*/II(d,a,b,c,x[11],S42,0xbd3af235);/*62*/II(c,d,a,b,x[2],S43,0x2ad7d2bb);/*63*/II(b,c,d,a,x[9],S44,0xeb86d391);/*64*/分组指纹累加;A+=a;B+=b;C+=c;D+=d;还有下个512位分组?有则重复,没则作为指纹输出。以32位为组输出指纹,注意:CPU是反序存放的,要反“反序”输出变为正序。与书上进行验证。A=A+a:98500190B=B+b:B04FD23CC=C+c:7D3F96D6D=D+d:727FE128哈希值组1:90015098哈希值组2:3CD24FB0哈希值组3:D6963F7D哈希值组4:28E17F72第7页示例:你的消息:abc你的消息长度:3初始指纹值:A:67452301初始指纹值:B:EFCDAB89初始指纹值:C:98BADCFE初始指纹值:D:10325476你的原始消息:你的消息位长度低32位:context-count[0]:24bits你的消息位长度高32位:context-count[1]:0消息长度不够一个512位(64字节)分组[0]:0X61[1]:0X62[2]:0X63你的消息字节数:3还差填充字节数与附加长度字节数之和:611-0串填充字节数:53填充后,你的消息:你的消息位长度低32位:context-count[0]:448bits你的消息位长度高32位:context-count[1]:0消息长度不够一个512位(64字节)分组[0]:0X61[1]:0X62[2]:0X63[3]:0X80[4]:0X00[5]:0X00[6]:0X00[7]:0X00[8]:0X00[9]:0X00[10]:0X00[11]:0X00[12]:0X00[13]:0X00[14]:0X00[15]:0X00[16]:0X00[17]:0X00[18]:0X00[19]:0X00[20]:0X00[21]:0X00[22]:0X00[23]:0X00[24]:0X00[25]:0X00[26]:0X00[27]:0X00[28]:0X00[29]:0X00[30]:0X00[31]:0X00[32]:0X00[33]:0X00[34]:0X00[