www.pudn.com > Hash.rar > MD5.CPP
#include#include"cstring.h" #include"stdafx.h" #include"MD5.h" #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))) MD5::MD5() { Init(); } MD5::~MD5() {} void MD5::StrToVec(CString& str) { int i,d=0,len=str.GetLength(); unsigned long k=0; if(len==0) M.push_back(0x80000000); for(i=0;i >8) & 0xff)<<16 | ((M[i]>>16) & 0xff)<<8 | ((M[i]>>24) & 0xff); } } void MD5::FillUp(CString& str) { int len=str.GetLength(); unsigned long k; while(M.size()%16!=14) { M.push_back(0); } k=len*8; M.push_back(k); M.push_back(0); } void MD5::FF(unsigned long& X,unsigned long Y,unsigned long Z, unsigned long K,int i,int s,unsigned long t) { X=Y+Left(X+F(Y,Z,K)+BUFF[i]+t,s); } void MD5::GG(unsigned long& X,unsigned long Y,unsigned long Z, unsigned long K,int i,int s,unsigned long t) { X=Y+Left(X+G(Y,Z,K)+BUFF[i]+t,s); } void MD5::HH(unsigned long& X,unsigned long Y,unsigned long Z, unsigned long K,int i,int s,unsigned long t) { X=Y+Left(X+H(Y,Z,K)+BUFF[i]+t,s); } void MD5::II(unsigned long& X,unsigned long Y,unsigned long Z, unsigned long K,int i,int s,unsigned long t) { X=Y+Left(X+I(Y,Z,K)+BUFF[i]+t,s); } unsigned long MD5::Left(unsigned long X,int s) { return ( (X< >(32-s))); } void MD5::tranform() { unsigned long AA,BB,CC,DD; AA=A; BB=B; CC=C; DD=D; //ROUND1 FF(A,B,C,D,0,7,0xd76aa478); FF(D,A,B,C,1,12,0xe8c7b756); FF(C,D,A,B,2,17,0x242070db); FF(B,C,D,A,3,22,0xc1bdceee); FF(A,B,C,D,4,7,0xf57c0faf); FF(D,A,B,C,5,12,0x4787c62a); FF(C,D,A,B,6,17,0xa8304613); FF(B,C,D,A,7,22,0xfd469501); FF(A,B,C,D,8,7,0x698098d8); FF(D,A,B,C,9,12,0x8b44f7af); FF(C,D,A,B,10,17,0xffff5bb1); FF(B,C,D,A,11,22,0x895cd7be); FF(A,B,C,D,12,7,0x6b901122); FF(D,A,B,C,13,12,0xfd987193); FF(C,D,A,B,14,17,0xa679438e); FF(B,C,D,A,15,22,0x49b40821); //ROUDN2 GG(A,B,C,D,1,5,0xf61e2562); GG(D,A,B,C,6,9,0xc040b340); GG(C,D,A,B,11,14,0x265e5a51); GG(B,C,D,A,0,20,0xe9b6c7aa); GG(A,B,C,D,5,5,0xd62f105d); GG(D,A,B,C,10,9,0x02441453); GG(C,D,A,B,15,14,0xd8a1e681); GG(B,C,D,A,4,20,0xe7d3fbc8); GG(A,B,C,D,9,5,0x21e1cde6); GG(D,A,B,C,14,9,0xc33707d6); GG(C,D,A,B,3,14,0xf4d50d87); GG(B,C,D,A,8,20,0x455a14ed); GG(A,B,C,D,13,5,0xa9e3e905); GG(D,A,B,C,2,9,0xfcefa3f8); GG(C,D,A,B,7,14,0x676f02d9); GG(B,C,D,A,12,20,0x8d2a4c8a); //ROUND3 HH(A,B,C,D,5,4,0xfffa3942); HH(D,A,B,C,8,11,0x8771f681); HH(C,D,A,B,11,16,0x6d9d6122); HH(B,C,D,A,14,23,0xfde5380c); HH(A,B,C,D,1,4,0xa4beea44); HH(D,A,B,C,4,11,0x4bdecfa9); HH(C,D,A,B,7,16,0xf6bb4b60); HH(B,C,D,A,10,23,0xbebfbc70); HH(A,B,C,D,13,4,0x289b7ec6); HH(D,A,B,C,0,11,0xeaa127fa); HH(C,D,A,B,3,16,0xd4ef3085); HH(B,C,D,A,6,23,0x04881d05); HH(A,B,C,D,9,4,0xd9d4d039); HH(D,A,B,C,12,11,0xe6db99e5); HH(C,D,A,B,15,16,0x1fa27cf8); HH(B,C,D,A,2,23,0xc4ac5665); //ROUND4 II(A,B,C,D,0,6,0xf4292244); II(D,A,B,C,7,10,0x432aff97); II(C,D,A,B,14,15,0xab9423a7); II(B,C,D,A,5,21,0xfc93a039); II(A,B,C,D,12,6,0x655b59c3); II(D,A,B,C,3,10,0x8f0ccc92); II(C,D,A,B,10,15,0xffeff47d); II(B,C,D,A,1,21,0x85845dd1); II(A,B,C,D,8,6,0x6fa87e4f); II(D,A,B,C,15,10,0xfe2ce6e0); II(C,D,A,B,6,15,0xa3014314); II(B,C,D,A,13,21,0x4e0811a1); II(A,B,C,D,4,6,0xf7537e82); II(D,A,B,C,11,10,0xbd3af235); II(C,D,A,B,2,15,0x2ad7d2bb); II(B,C,D,A,9,21,0xeb86d391); A=A+AA; B=B+BB; C=C+CC; D=D+DD; } void MD5::Init() { A=0x67452301; B=0xefcdab89; C=0x98badcfe; D=0x10325476; } void MD5::Hash(CString& str1,CString& str2) { CString temp; StrToVec(str1); FillUp(str1); for(int i=0;i>8) & 0xff)<<16 | ((A>>16) & 0xff)<<8 | ((A>>24) & 0xff); temp.Format("%x",A); str+=temp; B=(B & 0xff)<<24 | ((B>>8) & 0xff)<<16 | ((B>>16) & 0xff)<<8 | ((B>>24) & 0xff); temp.Format("%x",B); str+=temp; C=(C & 0xff)<<24 | ((C>>8) & 0xff)<<16 | ((C>>16) & 0xff)<<8 | ((C>>24) & 0xff); temp.Format("%x",C); str+=temp; D=(D & 0xff)<<24 | ((D>>8) & 0xff)<<16 | ((D>>16) & 0xff)<<8 | ((D>>24) & 0xff); temp.Format("%x",D); str+=temp; }