函数入口参数
void MD5(UC *data)
输入为一个任意长度的字符串,加密结果是32位的16进制数,如:MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
算法流程
1.对于输入的字符串,按位填补一个1以及若干个0使得填补后的位数为 N*512+448(按字节的话就是N*64+56),N>=0
2.再添加一个64位(8个字节)的数,该数字为原始长度,使得最后的字符串变为(N+1)*512位(既(N+1)*64字节)。
3.初始化四个32位的数,A=0x67452301;B=0xefcdab89;C=0x98badcfe;D=0x10325476;
4.将字符串分成N+1块,每块512位(64个字节),循环N+1次,对于每次循环:
1)令a=A;b=B;c=C;d=D;
2)将当前的64个字节转为16个32位的数M[0~15]。
3)进行64轮操作。
4)A+=a;B+=b;C+=c;D+=d;
5.输出ABCD的级联。
完整代码
View Code
#include <stdio.h> #include <string.h> #define MAXINLEN 1000 #define PP(x) ((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)) #define F(x,y,z) (((x)&(y))|((~(x))&(z))) #define G(x,y,z) (((x)&(z))|((y)&(~(z)))) #define H(x,y,z) ((x)^(y)^(z)) #define I(x,y,z) ((y)^((x)|(~(z)))) #define ROL(x,y) (((x)<<(y))|((x)>>(32-(y)))) #define FF(a,b,c,d,M,s,t) a=b+ROL(a+F(b,c,d)+M+t,s) #define GG(a,b,c,d,M,s,t) a=b+ROL(a+G(b,c,d)+M+t,s) #define HH(a,b,c,d,M,s,t) a=b+ROL(a+H(b,c,d)+M+t,s) #define II(a,b,c,d,M,s,t) a=b+ROL(a+I(b,c,d)+M+t,s) typedef __int64 LL; typedef unsigned int UI; typedef unsigned char UC; void Fill(UC *data,int add,LL len) { int i; LL temp=len<<3; if(add) { data[len++]=(1<<7); while(--add) { data[len++]=0; } } for(i=len; i<len+8; i++) { data[i]=temp%(1<<8); temp/=(1<<8); } return; } void MD5_Trans(UC *data,UI *A,UI *B,UI *C,UI *D) { UI a,b,c,d; UI M[16]; int i; a=*A,b=*B,c=*C,d=*D; for(i=0; i<16; ++i) { M[i]=data[(i<<2)]|(data[(i<<2)+1]<<8)|(data[(i<<2)+2]<<16)|(data[(i<<2)+3]<<24); } FF(a,b,c,d,M[0],7,0xd76aa478); FF(d,a,b,c,M[1],12,0xe8c7b756); FF(c,d,a,b,M[2],17,0x242070db); FF(b,c,d,a,M[3],22,0xc1bdceee); FF(a,b,c,d,M[4],7,0xf57c0faf); FF(d,a,b,c,M[5],12,0x4787c62a); FF(c,d,a,b,M[6],17,0xa8304613); FF(b,c,d,a,M[7],22,0xfd469501); FF(a,b,c,d,M[8],7,0x698098d8); FF(d,a,b,c,M[9],12,0x8b44f7af); FF(c,d,a,b,M[10],17,0xffff5bb1); FF(b,c,d,a,M[11],22,0x895cd7be); FF(a,b,c,d,M[12],7,0x6b901122); FF(d,a,b,c,M[13],12,0xfd987193); FF(c,d,a,b,M[14],17,0xa679438e); FF(b,c,d,a,M[15],22,0x49b40821); GG(a,b,c,d,M[1],5,0xf61e2562); GG(d,a,b,c,M[6],9,0xc040b340); GG(c,d,a,b,M[11],14,0x265e5a51); GG(b,c,d,a,M[0],20,0xe9b6c7aa); GG(a,b,c,d,M[5],5,0xd62f105d); GG(d,a,b,c,M[10],9,0x02441453); GG(c,d,a,b,M[15],14,0xd8a1e681); GG(b,c,d,a,M[4],20,0xe7d3fbc8); GG(a,b,c,d,M[9],5,0x21e1cde6); GG(d,a,b,c,M[14],9,0xc33707d6); GG(c,d,a,b,M[3],14,0xf4d50d87); GG(b,c,d,a,M[8],20,0x455a14ed); GG(a,b,c,d,M[13],5,0xa9e3e905); GG(d,a,b,c,M[2],9,0xfcefa3f8); GG(c,d,a,b,M[7],14,0x676f02d9); GG(b,c,d,a,M[12],20,0x8d2a4c8a); HH(a,b,c,d,M[5],4,0xfffa3942); HH(d,a,b,c,M[8],11,0x8771f681); HH(c,d,a,b,M[11],16,0x6d9d6122); HH(b,c,d,a,M[14],23,0xfde5380c); HH(a,b,c,d,M[1],4,0xa4beea44); HH(d,a,b,c,M[4],11,0x4bdecfa9); HH(c,d,a,b,M[7],16,0xf6bb4b60); HH(b,c,d,a,M[10],23,0xbebfbc70); HH(a,b,c,d,M[13],4,0x289b7ec6); HH(d,a,b,c,M[0],11,0xeaa127fa); HH(c,d,a,b,M[3],16,0xd4ef3085); HH(b,c,d,a,M[6],23,0x04881d05); HH(a,b,c,d,M[9],4,0xd9d4d039); HH(d,a,b,c,M[12],11,0xe6db99e5); HH(c,d,a,b,M[15],16,0x1fa27cf8); HH(b,c,d,a,M[2],23,0xc4ac5665); II(a,b,c,d,M[0],6,0xf4292244); II(d,a,b,c,M[7],10,0x432aff97); II(c,d,a,b,M[14],15,0xab9423a7); II(b,c,d,a,M[5],21,0xfc93a039); II(a,b,c,d,M[12],6,0x655b59c3); II(d,a,b,c,M[3],10,0x8f0ccc92); II(c,d,a,b,M[10],15,0xffeff47d); II(b,c,d,a,M[1],21,0x85845dd1); II(a,b,c,d,M[8],6,0x6fa87e4f); II(d,a,b,c,M[15],10,0xfe2ce6e0); II(c,d,a,b,M[6],15,0xa3014314); II(b,c,d,a,M[13],21,0x4e0811a1); II(a,b,c,d,M[4],6,0xf7537e82); II(d,a,b,c,M[11],10,0xbd3af235); II(c,d,a,b,M[2],15,0x2ad7d2bb); II(b,c,d,a,M[9],21,0xeb86d391); *A+=a,*B+=b,*C+=c,*D+=d; return; } void MD5(UC *data) { int i,addlen; UI A,B,C,D; LL Len; Len=strlen((const char *)data); addlen=(64+56-Len%64)%64; Fill(data,addlen,Len); Len=Len+addlen+8; A=0x67452301; B=0xefcdab89; C=0x98badcfe; D=0x10325476; for(i=0; i<Len; i+=64) { MD5_Trans(&data[i],&A,&B,&C,&D); } printf("%08X %08X %08X %08X\n",PP(A),PP(B),PP(C),PP(D)); return; } int main() { //freopen("IO","r",stdin); UC Str[MAXINLEN+64]; while(gets((char *)Str)!=NULL) { printf("MD5(\"%s\") = ",Str); MD5(Str); } return 0; } /* IO: a abc message digest abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy cog */
16color: #000000;