《计算机信息安全》实验指导书
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputLen) {//MD5块处理函数
unsigned int i,index,partLen;
index = (unsigned int)((context->count[0] >> 3) & 0x3F);
if ((context->count[0] += ((UINT4)inputLen << 3))< ((UINT4)inputLen << 3)) context->count[1]++;
context->count[1] += ((UINT4)inputLen >> 29); partLen = 64 - index; if (inputLen >= partLen) {
MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); MD5Transform (context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64)
index = 0; } else i = 0;
MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i],inputLen-i); }
void MD5Final(unsigned char digest[16],MD5_CTX *context)
{/*完成函数,context指向上面处理过的结构体,digest[16]是用来存储结果的缓冲区 这个函数对未完成的信息先进行填充,然后处理,并把最终结果存储在digest[16]中*/ unsigned char bits[8]; unsigned int index, padLen; Encode (bits, context->count, 8);
index = (unsigned int)((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); MD5Update (context, PADDING, padLen);
14
MD5Transform (context->state, &input[i]);
《计算机信息安全》实验指导书
MD5Update (context, bits, 8); Encode (digest, context->state, 16);
MD5_memset ((POINTER)context, 0, sizeof (*context)); }
3、主函数
#include \#include
unsigned char *inputData;
char *inp = (char *)malloc(sizeof(char)*1024); inputData=(unsigned char*)inp; unsigned char* hashstr; int i,x;
time_t t; //这两行保证每次产生的随机数不同 int len;
srand( (unsigned) time( &t ) ); len = rand()*200/RAND_MAX; inp[len]='\\0'; for(i=0;i x = rand()*16/RAND_MAX; if(x<10) inp[i] = 48 + x; else if(x>9 && x<16) inp[i] = 65 + x -10; } 15 《计算机信息安全》实验指导书 printf(\明文字符串是: %s\\n\\n\ if ((hashstr = (unsigned char *) malloc(17)) == NULL) { printf(\ exit(1); // terminate program if out of memory } MD5String(inputData,hashstr); //调用MD5算法实现函数 printf(\明文经过MD5得到的消息摘要是:%s\\n\ } 七 实验结果 由于在程序中使用了语句int i,x;和time_t t;,保证了每次产生的明文信息均不同,故经过MD5算法运算,得到的消息摘要MD(x)也是不相同的。 八 思考题 1、简述消息认证码MAC的基本原理。 2、分析MAC与消息摘要的区别。 16