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; 
 
}