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

📄 md5.cpp

📁 MD5算法c语言实现
💻 CPP
字号:
// MD5.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "MD5.h"
#include <string.h>
#define    MAX_SIZE     9
char       str[MAX_SIZE];

typedef   unsigned long     ulong;
typedef   unsigned          uint;
typedef   unsigned char     uchar;


#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(a,b,c,d,m,s,t)         (((a+F(b,c,d)+m+t)<<s)+((a+F(b,c,d)+m+t)>>(32-s)))


#define    FF(a,b,c,d,m,s,t)          a = b+ROL(a,b,c,d,m,s,t)
#define    GG(a,b,c,d,m,s,t)          a = b+ROL(a,b,c,d,m,s,t)
#define    HH(a,b,c,d,m,s,t)          a = b+ROL(a,b,c,d,m,s,t)
#define    II(a,b,c,d,m,s,t)          a = b+ROL(a,b,c,d,m,s,t)

struct md5_state{
	ulong    Blen,blen[2];
	ulong    state[4];
	uchar    buf[17];
	uint     blocknum;
	ulong    Block[16][16];
};

static const uint  m_val[64]   =    {
	0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
    1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12,
	5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2,
	0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9};

static const uint  s_val[64]   =    {
	7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,
	5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
	4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,
	6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21};

static const ulong t_val[64]  =     {
	0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,
	0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,
	0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
	0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3d905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,
	0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
	0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,
	0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,
	0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391};

static const	char  st[37] = "0123456789abcdefghijklmnopqrstuvwxyz";



void md5_Preprocess(uchar *lpin, md5_state *md)
{
	ulong    len;
	uint     i = 0,j = 0,k = 0;
	uchar *  lpstring;

	lpstring = lpin;
    for(len=0;*lpstring!='\0';lpstring++) len++;

	md->Blen    = len;
	md->blen[0] = len>>29;
	md->blen[1] = len<<3;

	j = len%64;
	if(j<56){
		lpin[len] = 128;
		for(i=1;i<56-j;i++)
			lpin[len+i] = 0;
	}
	if(j>56){
		lpin[len] = 128;
		for(i=1;i<120-j;i++)
			lpin[len+i] = 0;
	}

	len +=i;
	md->blocknum = len/64+1;

	for(i=0;i<md->blocknum-1;i++)
		for(j=0;j<16;j++)
			for(k=0;k<4;k++){
				md->Block[i][j]  =  md->Block[i][j]<<8;
				md->Block[i][j] +=  *lpin;
				lpin++;
			}

	for(j=0;j<14;j++)
		for(k=0;k<4;k++){
			md->Block[i][j] =   md->Block[i][j]<<8;
			md->Block[i][j] +=  *lpin;
			lpin++;
		}
	
	
	md->Block[i][j]   = md->blen[0];
	md->Block[i][j+1] = md->blen[1];
	


   	md->state[0] = 0x01234567;
	md->state[1] = 0x89abcdef;
	md->state[2] = 0xfedcba98;
	md->state[3] = 0x76543210;
}


void md5_Hash(md5_state *md)
{
	ulong         a,b,c,d,temp;
	uint           i,j;

	for(i=0;i<md->blocknum;i++){
		
		a = md->state[0];
		b = md->state[1];
		c = md->state[2];
		d = md->state[3];

		for(j=0;j<16;j++){
			FF(a,b,c,d,md->Block[i][m_val[j]],s_val[j],t_val[j]);
			temp  =  d;
			d     =  c;
			c     =  b;
			b     =  a;
			a     =  temp;
		}

		for(;j<32;j++){
			GG(a,b,c,d,md->Block[i][m_val[j]],s_val[j],t_val[j]);
			temp  =  d;
			d     =  c;
			c     =  b;
			b     =  a;
			a     =  temp;
		}

		for(;j<48;j++){
			HH(a,b,c,d,md->Block[i][m_val[j]],s_val[j],t_val[j]);
			temp  =  d;
			d     =  c;
			c     =  b;
			b     =  a;
			a     =  temp;
		}

		for(;j<64;j++){
			II(a,b,c,d,md->Block[i][m_val[j]],s_val[j],t_val[j]);
			temp  =  d;
			d     =  c;
			c     =  b;
			b     =  a;
			a     =  temp;
		}

		md->state[0] +=  a;
		md->state[1] +=  b;
		md->state[2] +=  c;
		md->state[3] +=  d;
		memset(md->buf,0,64);
	}


	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			md->buf[4*i+j] = (uchar)((md->state[i]>>(24-8*j))&0x000000ff);
	md->buf[16] = '\0';

	
}


bool        ft = false;
md5_state   md_cm;
void codestruct(char *str,int n ,md5_state * md)
{
	int         i;
	
	if( ft == true ||	n == 0) return ;
	
	for(i=0;i< 36;i++){
		if( ft == TRUE )
			return;
		str[n-1] = st[i];
		codestruct(str,n-1,md);
			if(n == 1){
			str[strlen(str)] = '\0';
			md5_Preprocess((uchar *)str,&md_cm);
			md5_Hash(&md_cm);
			str[strlen(str)-1] = '\0';
			if( strcmp((const char*)md_cm.buf,(const char*)md->buf) == 0 ){
				ft = true;
				return ;
			}
			continue;
		}
	} 
}



void  md5_Decode(char str[MAX_SIZE],md5_state * md)
{
	int         i;
	ft	= FALSE; 
	memset(str,0,MAX_SIZE);
	for(i=1;i<MAX_SIZE;i++)
	{	
		if(!ft)
			codestruct(str,i,md);
		else
			break;
	}
}


static md5_state             md;
HWND   hDlg;

DWORD   worker(LPVOID lp)
{
		md5_Decode(str,&md);
			
	    SetDlgItemText(hDlg,IDC_RRESULT,str);
		return 0;
}
	


INT_PTR CALLBACK DialogProc(HWND hwndDlg,
							UINT uMsg,
							WPARAM wParam,
							LPARAM lParam)
{
	char                  in[1024];
	char                  buff[1024];
	int                   i = 0;
	HANDLE				  hThread = INVALID_HANDLE_VALUE;


	switch(uMsg){
		case WM_INITDIALOG:

			hDlg = hwndDlg;
			SetDlgItemText(hwndDlg,IDC_DATA,"hello");
		break;

		case WM_COMMAND:

			switch(LOWORD(wParam)){

		case IDC_BUTTON_ENCODE:

            memset(in,0,1024);
			GetDlgItemText(hwndDlg,IDC_DATA,in,1024);
			in[strlen(in)] = '\0';
			md5_Preprocess((uchar *)in,&md);
			md5_Hash(&md);
			memset(buff,0,1024);
			for(i=0;i<16;i++)
				wsprintf(&buff[strlen(buff)],"%.2x",md.buf[i]);
			SetDlgItemText(hwndDlg,IDC_RESULT,buff);
			break;
			
		case IDC_BUTTON_DECODE:

			hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)worker,NULL,0,NULL);
			break;

		case IDC_BUTTON_QUIT:
			if( INVALID_HANDLE_VALUE != hThread)
			{
				SuspendThread(hThread);
				TerminateThread(hThread,-1);
			}
			EndDialog(hwndDlg,0);
			break;
			}
	}

	return 0;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	DialogBox(hInstance,MAKEINTRESOURCE(IDD_MD5),NULL,(DLGPROC)DialogProc);
	return 0;
 	
}

⌨️ 快捷键说明

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