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

📄 md5.h

📁 我用C编写的一个md5加密算法
💻 H
字号:
#ifndef _YJG_MD5_H_
#define _YJG_MD5_H_

#include <string.h>
#include <math.h>

// MD5基本运算函数 F, G, H and I
#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 ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))

class uint128
{
public:
	unsigned int n[4];
	char * toString();
	uint128()
	{
		int i=0;
		for(i=0;i<4;i++) n[i]=0;
	}
	uint128(uint128 & u)
	{
		int i=0;
		for(i=0;i<4;i++) n[i]=u.n[i];
	}

	~uint128(){}
private:
	void uint2char(const unsigned int u,char * s);//把32为整数以十六进制打印到字符串中
}; 
void uint2Char(const unsigned int u,char *s)
{
	int i;
	int t;
	for(i=0;i<8;i++)
	{
		t=u%(unsigned int)pow(16,i+1);
		if(t<10) s[i]='0'+t;
		else s[i]='A'+t;
	}
}
char * uint128::toString()
{
	char * p=new char[33];
	int i,j,t;
	for(j=0;j<4;j++)
	{
		for(i=0;i<8;i++)
		{
			if(i<7)	t=(n[j]/(unsigned int)pow(16,i))%16;
			else t=n[j]/(unsigned int)pow(16,i);
			if(t<10) p[j*8+i]='0'+t;
			else p[j*8+i]='a'+(t-10);
		}

	}
	p[32]='\0';
	return p;
}


const unsigned int T[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,
			0XA9E3E905,0XFCEFA3F8,0X676F02D9,0X8D2A4C8A,
			0XFFFA3942,0X8771F681,0X699D6122,0XFDE5380C,
			0XA4BEEA44,0X4BDECFA9,0XF6BB4B60,0XBEBFBC70,
			0X289B7EC6,0XEAA127FA,0XD4EF3085,0X04881D05,
			0XD9D4D039,0XE6DB99E5,0X1FA27CF8,0XC4AC5665,
			0XFA292244,0X432AFF97,0XAB9423A7,0XFC93A039,
			0X655B59C3,0X8F0CCC92,0XFFEFF47D,0X85845DD1,
			0X6FA87E4F,0XFE2CE6E0,0XA3014314,0XAE0811A1,
			0XF7537E82,0XBD3AF235,0X2AD7D2BB,0XEB86D391
			};

//定义[abcd k s i]的函数
void Round1(unsigned int &a,unsigned int b,unsigned int c,unsigned int d,unsigned int k,unsigned int s,unsigned int i,unsigned int *X)
{
	a=b+(ROTATE_LEFT((a+F(b,c,d)+X[k]+T[i]),s));
}
void Round2(unsigned int &a,unsigned int b,unsigned int c,unsigned int d,unsigned int k,unsigned int s,unsigned int i,unsigned int *X)
{
	a=b+(ROTATE_LEFT((a+G(b,c,d)+X[k]+T[i]),s));
}
void Round3(unsigned int &a,unsigned int b,unsigned int c,unsigned int d,unsigned int k,unsigned int s,unsigned int i,unsigned int *X)
{
	a=b+(ROTATE_LEFT((a+H(b,c,d)+X[k]+T[i]),s));
}
void Round4(unsigned int &a,unsigned int b,unsigned int c,unsigned int d,unsigned int k,unsigned int s,unsigned int i,unsigned int *X)
{
	a=b+(ROTATE_LEFT((a+I(b,c,d)+X[k]+T[i]),s));
}

unsigned int Char2Int32(char a,char b,char c,char d)
{
	unsigned int r;
	r=((unsigned int)d)&0x000000ff;
	r+=(((unsigned int)c)&0x000000ff)<<8;
	r+=(((unsigned int)b)&0x000000ff)<<16;
	r+=(((unsigned int)a)&0x000000ff)<<24;
	return r;
}
unsigned int block[16];			//算法处理的每个512大小的块
uint128 md5(char * string)
{
	uint128 r;
	int i,j,last;
	int start;
	unsigned int len;		//存放输入的字符串长度,最长为4G个字节
	
	unsigned int AA,BB,CC,DD;
	char t[4];
	unsigned int A=0X67452301;
	unsigned int B=0XEFCDAB89;
	unsigned int C=0X98BADCFE;
	unsigned int D=0X10325476;


	start=0;
	len=strlen(string);
	last=(len>=448)?(len/512+2):1;
	while(last!=0)
	{
		//以下为填充并选出每次的512bit
		if(last==1)			//最后一块
		{
			for(i=start;i<56+start;i+=4)
			{
				for(j=0;j<4;j++)
				{
					if(i+j==len) t[j]=0x80;
					else if(i+j<len) t[j]=string[i+j];
					else t[j]='\0';
				}
				block[i/4]=Char2Int32(t[0],t[1],t[2],t[3]);
			}
			block[14]=0;
			block[15]=len;
			last=0;
		}
		else
		{
			for(i=start;i<64+start;i+=4)
			{
				for(j=0;j<4;j++)
				{
					if(i+j==len) t[j]=0x80;
					else if(i+j<len) t[j]=string[i+j];
					else t[j]='\0';
				}
				block[i/4]=Char2Int32(t[0],t[1],t[2],t[3]);
			}
			last--;
			start+=512;
		}
		AA=A;
		BB=B;
		CC=C;
		DD=D;
		/*roud1*/
		Round1(A,B,C,D,0,7,1,block);
		Round1(D,A,B,C,1,12,2,block);
		Round1(C,D,A,B,2,17,3,block);
		Round1(B,C,D,A,3,22,4,block);
		Round1(A,B,C,D,4,7,5,block);
		Round1(D,A,B,C,5,12,6,block);
		Round1(C,D,A,B,6,17,7,block);
		Round1(B,C,D,A,7,22,8,block);
		Round1(A,B,C,D,8,7,9,block);
		Round1(D,A,B,C,9,12,10,block);
		Round1(C,D,A,B,10,17,11,block);
		Round1(B,C,D,A,11,22,12,block);
		Round1(A,B,C,D,12,7,13,block);
		Round1(D,A,B,C,13,12,14,block);
		Round1(C,D,A,B,14,17,15,block);
		Round1(B,C,D,A,15,22,16,block);
		/*roud2*/
		Round2(A,B,C,D,1,5,17,block);
		Round2(D,A,B,C,6,9,18,block);
		Round2(C,D,A,B,11,14,19,block);
		Round2(B,C,D,A,0,20,20,block);
		Round2(A,B,C,D,5,5,21,block);
		Round2(D,A,B,C,10,9,22,block);
		Round2(C,D,A,B,15,14,23,block);
		Round2(B,C,D,A,4,20,24,block);
		Round2(A,B,C,D,9,5,25,block);
		Round2(D,A,B,C,14,9,26,block);
		Round2(C,D,A,B,3,14,27,block);
		Round2(B,C,D,A,8,20,28,block);
		Round2(A,B,C,D,13,5,29,block);
		Round2(D,A,B,C,2,9,30,block);
		Round2(C,D,A,B,7,14,31,block);
		Round2(B,C,D,A,12,20,32,block);
		/*roud3*/
		Round3(A,B,C,D,5,4,33,block);
		Round3(D,A,B,C,8,11,34,block);
		Round3(C,D,A,B,11,16,35,block);
		Round3(B,C,D,A,14,23,36,block);
		Round3(A,B,C,D,1,4,37,block);
		Round3(D,A,B,C,4,11,38,block);
		Round3(C,D,A,B,7,16,39,block);
		Round3(B,C,D,A,10,23,40,block);
		Round3(A,B,C,D,13,4,41,block);
		Round3(D,A,B,C,0,11,42,block);
		Round3(C,D,A,B,3,16,43,block);
		Round3(B,C,D,A,6,23,44,block);
		Round3(A,B,C,D,9,4,45,block);
		Round3(D,A,B,C,12,11,46,block);
		Round3(C,D,A,B,15,16,47,block);
		Round3(B,C,D,A,2,23,48,block);
		/*roud4*/
		Round4(A,B,C,D,0,6,49,block);
		Round4(D,A,B,C,7,10,50,block);
		Round4(C,D,A,B,14,15,51,block);
		Round4(B,C,D,A,5,21,52,block);
		Round4(A,B,C,D,12,6,53,block);
		Round4(D,A,B,C,3,10,54,block);
		Round4(C,D,A,B,10,15,55,block);
		Round4(B,C,D,A,1,21,56,block);
		Round4(A,B,C,D,8,6,57,block);
		Round4(D,A,B,C,15,10,58,block);
		Round4(C,D,A,B,6,15,59,block);
		Round4(B,C,D,A,13,21,60,block);
		Round4(A,B,C,D,4,6,61,block);
		Round4(D,A,B,C,11,10,62,block);
		Round4(C,D,A,B,2,15,63,block);
		Round4(B,C,D,A,9,21,64,block);

		A=A+AA;
		B=B+BB;
		C=C+CC;
		D=D+DD;
	}//end while
	r.n[0]=A;
	r.n[1]=B;
	r.n[2]=C;
	r.n[3]=D;

	return r;
}
#endif

⌨️ 快捷键说明

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