⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 md5.cpp

📁 MD消息摘要程序
💻 CPP
字号:
#include "MD5Head.h"

MD5 context;
unsigned char buf[64];//输入缓冲,64*8=512位

//四个线性函数
LONG32 F(LONG32 x,LONG32 y,LONG32 z)
{
	return (x&y)|((~x)&z);
}
LONG32 G(LONG32 x,LONG32 y,LONG32 z)
{
	return (x&z)|(y&(~z));
}
LONG32 H(LONG32 x,LONG32 y,LONG32 z)
{
	return x^y^z;
}
LONG32 I(LONG32 x,LONG32 y,LONG32 z)
{
	return y^(x|(~z));
}

//移位函数
LONG32 rotate(LONG32 x,LONG32 n)
{
	x=(x<<n)|(x>>(32-n));
	return x;
}


//四轮转换函数
void FF(LONG32 *a,LONG32 *b,LONG32 *c,LONG32 *d,LONG32 mj,LONG32 s,LONG32 ti)
{
	(*a)+=F(*b,*c,*d)+mj+ti;
	(*a)=rotate(*a,s);
	(*a)+=*b;
//	*a=*b+rotate((*a)+(F(*b,*c,*d)+mj+ti),s);	
}
void GG(LONG32 *a,LONG32 *b,LONG32 *c,LONG32 *d,LONG32 mj,LONG32 s,LONG32 ti)
{
	(*a)+=G(*b,*c,*d)+mj+ti;
	(*a)=rotate(*a,s);
	(*a)+=*b;
	//*a=*b+rotate(*a+(G(*b,*c,*d)+mj+ti),s);	
}
void HH(LONG32 *a,LONG32 *b,LONG32 *c,LONG32 *d,LONG32 mj,LONG32 s,LONG32 ti)
{
	(*a)+=H(*b,*c,*d)+mj+ti;
	(*a)=rotate(*a,s);
	(*a)+=*b;
	//*a=*b+rotate(*a+(H(*b,*c,*d)+mj+ti),s);	
}
void II(LONG32 *a,LONG32 *b,LONG32 *c,LONG32 *d,LONG32 mj,LONG32 s,LONG32 ti)
{
	(*a)+=I(*b,*c,*d)+mj+ti;
	(*a)=rotate(*a,s);
	(*a)+=*b;
	//*a=*b+rotate(*a+(I(*b,*c,*d)+mj+ti),s);	
}


//初始化函数
void initial(MD5 *text)
{
	text->count[0]=text->count[1]=0;
	text->chain_vari[0]=0x67452301;
    text->chain_vari[1]=0xefcdab89;
    text->chain_vari[2]=0x98badcfe;
    text->chain_vari[3]=0x10325476;
}

void copytobuf(MD5 *text,char *input)
{
	LONG32 i,j;
	LONG32 inputlen;
    inputlen=strlen(input);//输入串长度
	LONG32 bytenum;//64个字节的数目
	LONG32 residue;//余数
	bytenum=inputlen/64;
	residue=inputlen-bytenum*64;
	if((text->count[0]+=(inputlen<<3))<(inputlen<<3))//左移三位成位数
		text->count[1]++;
	text->count[1]+=(inputlen>>29);
	
	for(j=0;j<bytenum;j++)//进行bytenum次转换
	{
		for(i=0;i<64;i++)//把输入串中的64B拷贝入缓冲buf
		{
			buf[i]=input[64*j+i];
		}
		transf(text->chain_vari,buf);
	}

	for(i=0;i<residue;i++)//剩余的拷贝入缓冲
	{
		buf[i]=input[bytenum*64+i];
	}
	
	if(residue<56)//余数小于56,填充到56
	{
		buf[i]=(unsigned char)0x80; //第一个位填充1,其他位填0
		i++;
		while(i<56)
		{
			buf[i]=0;
			i++;
		}
		padnum(buf,56,text->count);
		transf(text->chain_vari,buf);

	}
	else  //大于或等于56时
	{
		buf[i]=(unsigned char)0x80;
		i++;
		while(i<64)
		{
			buf[i]=0;
			i++;
		}
		transf(text->chain_vari,buf);

		for(i=0;i<56;i++)
			buf[i]=0;
		padnum(buf,56,text->count);
		transf(text->chain_vari,buf);
	}
}


void padnum(unsigned char *output,LONG32 j,LONG32 *input)//把输入块的位数存放于块最后
{
	int i;
	for(i=0;i<2;i++,j=j+4)
	{
		output[j]=(unsigned char)(input[i]&0xff);
		output[j+1]=(unsigned char)((input[i]>>8)&0xff);
		output[j+2]=(unsigned char)((input[i]>>16)&0xff);
		output[j+3]=(unsigned char)((input[i]>>24)&0xff);
	}
}


void transf(LONG32 *state,unsigned char *input)
{
	LONG32 statebuf[4];
	for(int k=0;k<4;k++)//把state所指的暂存起来
		statebuf[k]=state[k];
	LONG32 *a,*b,*c,*d;
	a=&state[0];
	b=&state[1];
	c=&state[2];
	d=&state[3];
	int i,j;
	LONG32 n[16];
	for(i=0,j=0;i<16;i++,j+=4) //每连续四个字符转换成32位的整形
	{
		n[i]=((LONG32)input[j])|(((LONG32)input[j+1])<<8)|(((LONG32)input[j+2])<<16)|(((LONG32)input[j+3])<<24);
	}
	
	//第一轮转换
	FF(a,b,c,d,n[0],7,0xd76aa478); 
	FF(d,a,b,c,n[1],12,0xe8c7b756);
    FF(c,d,a,b,n[2],17,0x242070db);
    FF(b,c,d,a,n[3],22,0xc1bdceee); 
    FF(a,b,c,d,n[4],7,0xf57c0faf); 
    FF(d,a,b,c,n[5],12,0x4787c62a); 
    FF(c,d,a,b,n[6],17,0xa8304613); 
    FF(b,c,d,a,n[7],22,0xfd469501); 
    FF(a,b,c,d,n[8],7,0x698098d8); 
    FF(d,a,b,c,n[9],12,0x8b44f7af); 
    FF(c,d,a,b,n[10],17,0xffff5bb1);
    FF(b,c,d,a,n[11],22,0x895cd7be); 
    FF(a,b,c,d,n[12],7,0x6b901122); 
    FF(d,a,b,c,n[13],12,0xfd987193); 
    FF(c,d,a,b,n[14],17,0xa679438e);
    FF(b,c,d,a,n[15],22,0x49b40821);

	//第二轮转换
	GG(a,b,c,d,n[1],5,0xf61e2562); 
    GG(d,a,b,c,n[6],9,0xc040b340);
    GG(c,d,a,b,n[11],14,0x265e5a51);
    GG(b,c,d,a,n[0],20,0xe9b6c7aa); 
    GG(a,b,c,d,n[5],5,0xd62f105d); 
    GG(d,a,b,c,n[10],9,0x2441453); 
    GG(c,d,a,b,n[15],14,0xd8a1e681); 
    GG(b,c,d,a,n[4],20,0xe7d3fbc8);
    GG(a,b,c,d,n[9],5,0x21e1cde6); 
    GG(d,a,b,c,n[14],9,0xc33707d6); 
    GG(c,d,a,b,n[3],14,0xf4d50d87); 
    GG(b,c,d,a,n[8],20,0x455a14ed);
    GG(a,b,c,d,n[13],5,0xa9e3e905); 
    GG(d,a,b,c,n[2],9,0xfcefa3f8); 
    GG(c,d,a,b,n[7],14,0x676f02d9); 
    GG(b,c,d,a,n[12],20,0x8d2a4c8a); 
	
	//第三轮转换
	HH(a,b,c,d,n[5],4,0xfffa3942);
    HH(d,a,b,c,n[8],11,0x8771f681);
    HH(c,d,a,b,n[11],16,0x6d9d6122);
    HH(b,c,d,a,n[14],23,0xfde5380c); 
    HH(a,b,c,d,n[1],4,0xa4beea44); 
    HH(d,a,b,c,n[4],11,0x4bdecfa9); 
    HH(c,d,a,b,n[7],16,0xf6bb4b60);
    HH(b,c,d,a,n[10],23,0xbebfbc70);
    HH(a,b,c,d,n[13],4,0x289b7ec6); 
    HH(d,a,b,c,n[0],11,0xeaa127fa); 
    HH(c,d,a,b,n[3],16,0xd4ef3085); 
    HH(b,c,d,a,n[6],23,0x4881d05); 
    HH(a,b,c,d,n[9],4,0xd9d4d039); 
    HH(d,a,b,c,n[12],11,0xe6db99e5); 
    HH(c,d,a,b,n[15],16,0x1fa27cf8); 
    HH(b,c,d,a,n[2],23,0xc4ac5665); 

    //第四轮转换
    II(a,b,c,d,n[0],6,0xf4292244);
    II(d,a,b,c,n[7],10,0x432aff97); 
    II(c,d,a,b,n[14],15,0xab9423a7);
    II(b,c,d,a,n[5],21,0xfc93a039);
    II(a,b,c,d,n[12],6,0x655b59c3); 
    II(d,a,b,c,n[3],10,0x8f0ccc92);
    II(c,d,a,b,n[10],15,0xffeff47d); 
    II(b,c,d,a,n[1],21,0x85845dd1); 
    II(a,b,c,d,n[8],6,0x6fa87e4f); 
    II(d,a,b,c,n[15],10,0xfe2ce6e0);
    II(c,d,a,b,n[6],15,0xa3014314); 
    II(b,c,d,a,n[13],21,0x4e0811a1); 
    II(a,b,c,d,n[4],6,0xf7537e82); 
    II(d,a,b,c,n[11],10,0xbd3af235); 
    II(c,d,a,b,n[2],15,0x2ad7d2bb); 
    II(b,c,d,a,n[9],21,0xeb86d391);
	
	state[0]=*a+statebuf[0];
    state[1]=*b+statebuf[1];
    state[2]=*c+statebuf[2];
    state[3]=*d+statebuf[3];

}

//输出a,b,c,d级联
void output(MD5 *text)
{
 	int i,k;
	LONG32 out[2];
 	for(i=0;i<4;i++)       //a,b,c,d置换顺序显示
	{
		out[0]=0;
		for(k=0;k<32;k+=8)
		{
			out[1]=((text->chain_vari[i]&0xff)<<(24-k));
			out[0]=out[0]|out[1];
			text->chain_vari[i]=text->chain_vari[i]>>8;
		}
		cout<<hex<<out[0]; //十六进制显示
	}
	cout<<endl;
}

//主函数,测试输入字符串的结果
void main()
{
	char string[maxsize];	
	MD5 *pointer;
	pointer=&context;
    cout<<"please input a string: ";
	cin>>string;
	initial(pointer);
    copytobuf(pointer,string);
	cout<<"the message digest is: ";
	output(pointer);
	
}

	














⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -