📄 md5.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 + -