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

📄 md5.c

📁 md5加密解密 算法原程序
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

#define pi		3.1415926

const double constant = 4294967296;

unsigned char f_inputbuffer[64];
unsigned int  f_subgroup[16];
unsigned int  f_bufferbitlenlow;						//存放的是位长度
unsigned int  f_bufferbitlenhigh;
unsigned int  f_a,f_b,f_c,f_d;
unsigned int  f_aa,f_bb,f_cc,f_dd;
unsigned int  f_T[64];
FILE * fp;
unsigned char f_exit,f_label;
unsigned int readlength;


typedef struct { 
	unsigned int * a, * b, * c, * d;
} Para_value;

void P_fillinputbuffer(unsigned char * ptrbuf);
void P_recycle(void);
unsigned int P_Calculate(Para_value value,unsigned char k,unsigned char s,unsigned char i,unsigned char j);
void P_ChangeValue(Para_value * value);
unsigned int P_moveleft(unsigned int para,unsigned char bits);
unsigned int fun_f(unsigned int a,unsigned int b,unsigned int c);
unsigned int fun_g(unsigned int a,unsigned int b,unsigned int c);
unsigned int fun_h(unsigned int a,unsigned int b,unsigned int c);
unsigned int fun_i(unsigned int a,unsigned int b,unsigned int c);

const unsigned int (*fun_ptr[])(unsigned int a,unsigned int b,unsigned int c) =
{
	fun_f,fun_g,fun_h,fun_i
};

const unsigned char Para_K[4][16] = 
{
	{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}
};
const unsigned char Para_S[4][16] = 
{
	{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}
};

int main(int argc, char* argv[])
{
	unsigned int i = 0;
	unsigned char * ptrbuf;

	memset(f_inputbuffer,0,sizeof(f_inputbuffer));
	memset(f_subgroup,0,sizeof(f_subgroup));
	f_bufferbitlenlow = 0;
	f_bufferbitlenhigh = 0;
	readlength = 0;
	f_label = 0;

	fp = fopen(argv[1],"r");
    if(fp == NULL) {
		fp = fopen(argv[1],"w");				//create file
	}
    fclose(fp);
    fp = fopen(argv[1],"r+");					//enable to read and write and insert
	
	P_recycle();

	ptrbuf = (unsigned char *)malloc(4*sizeof(f_a));
	memcpy(&ptrbuf[0],&f_a,4);
	memcpy(&ptrbuf[4],&f_b,4);
	memcpy(&ptrbuf[8],&f_c,4);
	memcpy(&ptrbuf[12],&f_d,4);

//	fseek(fp,0,2);
//	fputc('\n',fp);
//	for(i=0;i<16;i++)  fprintf(fp,"%02x",ptrbuf[i]);
	fclose(fp);

	fp = fopen("result.txt","r");
	if(fp == NULL) {
		fp = fopen("result.txt","w");
	}
	fp = fopen("result.txt","r+");
	fseek(fp,0,2);
	for(i=0;i<16;i++)  fprintf(fp,"%02x",ptrbuf[i]);
	fputc('\n',fp);
	fclose(fp);
	free(ptrbuf);
	
	return 0;
}

void P_fillinputbuffer(unsigned char * ptrbuf)
{
	unsigned char insertcount,i; 
	if(!feof(fp))
	{
		readlength = fread(ptrbuf,1,64,fp);
		if((f_bufferbitlenlow + (readlength << 3)) < f_bufferbitlenlow)  f_bufferbitlenhigh++;
		f_bufferbitlenlow += (readlength << 3);
		f_bufferbitlenhigh += (readlength >> 29);
	}
	if(readlength != 64)
	{
		if(readlength > 56)
		{
			if(f_label)
			{
				insertcount = 56;
				for(i=0;i<insertcount;i++)  *ptrbuf++ = 0;
				memcpy(ptrbuf,(unsigned char *)&f_bufferbitlenlow,4);
				ptrbuf += 4;
				memcpy(ptrbuf,(unsigned char *)&f_bufferbitlenhigh,4);
				f_exit = 1;
				f_label = 0;
			}
			else
			{
				ptrbuf += readlength;
				insertcount = 64 - readlength;
				for(i=0;i<insertcount;i++)
				{
					if(i == 0) *ptrbuf = 0x80;
					else *ptrbuf = 0;
					ptrbuf++;
				}
				f_label = 1;
			}
		}
		else				//小于等于56
		{
			ptrbuf += readlength;
			insertcount = 56 - readlength;
			for(i=0;i<insertcount;i++)
			{
				if(i == 0) *ptrbuf = 0x80;
				else *ptrbuf = 0;
				ptrbuf++;
			}
			memcpy(ptrbuf,(unsigned char *)&f_bufferbitlenlow,4);
			ptrbuf += 4;
			memcpy(ptrbuf,(unsigned char *)&f_bufferbitlenhigh,4);
			f_exit = 1;
		}
	}
	else
		readlength = 0;
}

void P_recycle(void)
{
	unsigned char j,k;
	double temp;
	Para_value value;
	for(j=1;j<=64;j++)
	{
		temp = fabs(sin(j));						//单位是弧度
		f_T[j-1] = (unsigned int)(constant * temp);
	}

	f_a = 0x67452301;					//内存中的顺序是0x01234567
	f_b = 0xefcdab89;
	f_c = 0x98badcfe;
	f_d = 0x10325476;
	f_exit = 0;

	while(!f_exit)
	{
		P_fillinputbuffer(f_inputbuffer);

		f_aa = f_a;
		f_bb = f_b;
		f_cc = f_c;
		f_dd = f_d;
		value.a = &f_a;
		value.b = &f_b;
		value.c = &f_c;
		value.d = &f_d;
		memcpy(f_subgroup,&f_inputbuffer[0],sizeof(f_subgroup));
		for(j=0;j<4;j++)
		{
			for(k=0;k<16;k++)
			{
				*value.a = P_Calculate(value,Para_K[j][k],Para_S[j][k],(unsigned char)(j*16+k),j);
				P_ChangeValue(&value);
			}
		}
		f_a += f_aa;
		f_b += f_bb;
		f_c += f_cc;
		f_d += f_dd;
	}
}

unsigned int fun_f(unsigned int a,unsigned int b,unsigned int c)
{
	return ((a&b) | ((~a)&c)); 
}
unsigned int fun_g(unsigned int a,unsigned int b,unsigned int c)
{
	return ((a&c) | (b&(~c))); 
}
unsigned int fun_h(unsigned int a,unsigned int b,unsigned int c)
{
	return (a^b^c);
}
unsigned int fun_i(unsigned int a,unsigned int b,unsigned int c)
{
	return (b ^ (a | (~c)));
}

unsigned int P_Calculate(Para_value value,unsigned char k,unsigned char s,unsigned char i,unsigned char j)
{
	unsigned int a;
	a = *value.a + (*fun_ptr[j])(*value.b,*value.c,*value.d) + f_subgroup[k] + f_T[i];
	a = P_moveleft(a,s);
	a += *value.b;
	return (a);
}

void P_ChangeValue(Para_value * value)
{
	Para_value backup;
	memcpy(&backup,value,sizeof(Para_value));
	value->a = backup.d;
	value->b = backup.a;
	value->c = backup.b;
	value->d = backup.c;
}

unsigned int P_moveleft(unsigned int para,unsigned char bits)
{
	para = (para << bits) | (para >> (32-bits));
	return (para);
}

⌨️ 快捷键说明

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