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

📄 md5.cpp

📁 MD5加密算法
💻 CPP
字号:
#include<math.h>
#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<len;i++)
	{
		k<<=8;
		k+=(byte)str[i];
		if(i%4==3 || i==len-1)
		{
			if(i==len-1)
			{
				if(len%4==0)
				{
					M.push_back(k);
					M.push_back(0x80000000);
				}
				else if(len%4==1)
				{
					k<<=24;
					k+=0x800000;
					M.push_back(k);
				}
				if(len%4==2)
				{
					k<<=16;
					k+=0x8000;
					M.push_back(k);
				}
				if(len%4==3)
				{
					k<<=8;
					k+=0x80;
					M.push_back(k);
				}
				k=0;
			}
			if(i==len-1)break;
			M.push_back(k);
			k=0;
		}
	}
	for(i=0;i<len/4+1;i++)
	{
		M[i]=(M[i] & 0xff)<<24 | ((M[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<<s) | (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<M.size()/16;i++)
	{
		for(int j=0;j<16;j++)
			BUFF[j]=M[i*16+j];
		tranform();
	}
	NumToStr(str2);
}

void MD5::NumToStr(CString& str)
{
	CString temp;

	A=(A & 0xff)<<24 | ((A>>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;

}

⌨️ 快捷键说明

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