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

📄 md5.c

📁 MD5加解密算法
💻 C
📖 第 1 页 / 共 2 页
字号:
  unsigned int i, j;

  for(i=0,j=0;j<len;i++,j += 4)
output[i]=((UINT4)input[j])|(((UINT4)input[j+1])<<8)|(((UINT4)input[j+2])<<16)|(((UINT4)input[j+3])<<24);
}

// Note: Replace "for loop" with standard memcpy if possible.

static void MD5_memcpy(POINTER output,POINTER input,unsigned int len)
{
  unsigned int i;

  for (i = 0; i < len; i++)
 output[i] = input[i];
}

// Note: Replace "for loop" with standard memset if possible.

static void MD5_memset(POINTER output,int value,unsigned int len)
{
  unsigned int i;

  for (i = 0; i < len; i++)
 ((char *)output)[i] = (char)value;
}


static void MD5_memchange(unsigned char output[8],UINT4 input[2])
{
 //int count;
 output[0]=(unsigned char)((input[1] >> 24) & 0xff);
 output[1]=(unsigned char)((input[1] >> 16) & 0xff);
 output[2]=(unsigned char)((input[1] >> 8) & 0xff);
 output[3]=(unsigned char)(input[1] & 0xff);

 output[4]=(unsigned char)((input[0] >> 24) & 0xff);
 output[5]=(unsigned char)((input[0] >> 16) & 0xff);
 output[6]=(unsigned char)((input[0] >> 8) & 0xff);
 output[7]=(unsigned char)(input[0] & 0xff);
}

int MD5File(unsigned char *filename1,unsigned char *output)
{

  unsigned int iPaddingStringLen;
  MD5_CTX *mInformation;
  MD5_CTX nInformation;
  unsigned char cInputLen[8];
  FILE *fp1;
  unsigned char cInputString[65];   //[64]
  unsigned int iInputLen;
			     
  unsigned char *cResult;
  
  int count;
  cResult = output;

  if((fp1=fopen((char*)filename1,"rb"))==NULL)
    {
     return(10);
	 }

	

  mInformation=&nInformation;
  MD5Init(mInformation);

  mInformation->count[0]=0;mInformation->count[1]=0;

  do{
     iInputLen=fread(cInputString,1,SIZE,fp1);

     if (iInputLen!=SIZE)
	{
	 if ((mInformation->count[0] += iInputLen*8 )< iInputLen*8)
	    mInformation->count[1]++;

	 MD5_memchange((POINTER)&cInputLen[0],(UINT4 *)&mInformation->count[0]);

	 iInputLen=iInputLen+8;
	 if (iInputLen==64)
		 {
	     MD5_memcpy((POINTER)&mInformation->buffer[iInputLen-8], (POINTER)&cInputLen[0],8);
	     MD5_memcpy((POINTER)&mInformation->buffer[0], (POINTER)&cInputString[0],iInputLen-8);

	     MD5Transform ((UINT4 *)&mInformation->state[0],(POINTER)&mInformation->buffer[0]);
	     break;
	    }

	 if (iInputLen<64)
	    {
	     MD5_memcpy((POINTER)&mInformation->buffer[0], (POINTER)&cInputString[0],iInputLen-8);
	     MD5_memcpy((POINTER)&mInformation->buffer[iInputLen-8], (POINTER)&cInputLen[0],8);

	     iPaddingStringLen=64-iInputLen;
	     MD5_memcpy((POINTER)&mInformation->buffer[iInputLen], (POINTER)&PADDING[0],iPaddingStringLen);

	     MD5Transform ((UINT4 *)&mInformation->state[0],(POINTER)&mInformation->buffer[0]);
	    }
	 else
	    {
	     MD5_memcpy((POINTER)&mInformation->buffer[iInputLen-8], (POINTER)&cInputLen[0],72-iInputLen);
	     MD5_memcpy((POINTER)&mInformation->buffer[0], (POINTER)&cInputString[0],iInputLen-8);

	     MD5Transform ((UINT4 *)&mInformation->state[0],(POINTER)&mInformation->buffer[0]);

	     MD5_memcpy((POINTER)&mInformation->buffer[0], (POINTER)&cInputLen[72-iInputLen],iInputLen-64);
	     iPaddingStringLen=64+64-iInputLen;
	     MD5_memcpy((POINTER)&mInformation->buffer[iInputLen-64], (POINTER)&PADDING[0],iPaddingStringLen);

	     MD5Transform ((UINT4 *)&mInformation->state[0],(POINTER)&mInformation->buffer[0]);
	    }
	 break;
	}

     if ((mInformation->count[0] += 512)< 512)
	    mInformation->count[1]++;

     MD5_memcpy((POINTER)&mInformation->buffer[0], (POINTER)&cInputString[0],64);

     MD5Transform ((UINT4 *)&mInformation->state[0],(POINTER)&mInformation->buffer[0]);

    }while(TRUE);

  //MessageBox(NULL,"ok","ok",MB_OK);

  fclose(fp1);  

  for(count=0;count<4;count++)
  {
 cResult[4*count+0]=(unsigned char)((mInformation->state[count]>>24)&0xff);
 cResult[4*count+1]=(unsigned char)((mInformation->state[count]>>16)&0xff);
 cResult[4*count+2]=(unsigned char)((mInformation->state[count]>>8)&0xff);
 cResult[4*count+3]=(unsigned char)(mInformation->state[count]& 0xff);
  }
  

 

 return(1);
}

void MD5String(unsigned char *inputData,unsigned char *hashstr)
{
  int i;
  int inputlength,length,nCycle;
  unsigned int iPaddingStringLen;
  MD5_CTX *mInformation;
  MD5_CTX nInformation;
  unsigned char cInputLen[8];

  unsigned char cInputString[65];   //[64]
  unsigned int iInputLen;
			     
  unsigned char cResult[16];
  int count;

  mInformation=&nInformation;
  MD5Init(mInformation);

  mInformation->count[0]=0;mInformation->count[1]=0;

  inputlength=strlen((char *)inputData);
  length=inputlength/64;
  iInputLen=inputlength%64;

  nCycle=0;
  while(nCycle<length)
    {
     
     for(i=0;i<64;i++)
	cInputString[i]=inputData[nCycle*64+i];
     
     if ((mInformation->count[0] += 512)< 512)
	    mInformation->count[1]++;

     MD5_memcpy((POINTER)&mInformation->buffer[0], (POINTER)&cInputString[0],64);

     MD5Transform ((UINT4 *)&mInformation->state[0],(POINTER)&mInformation->buffer[0]);
     nCycle++;

    };

  for(i=0;i<iInputLen;i++)
	cInputString[i]=inputData[nCycle*64+i];
	cInputString[i]='\0';
  //if (iInputLen!=SIZE)
  //	{
	 if ((mInformation->count[0] += iInputLen*8 )< iInputLen*8)
	    mInformation->count[1]++;

	 MD5_memchange((POINTER)&cInputLen[0],(UINT4 *)&mInformation->count[0]);

	 iInputLen=iInputLen+8;
	 if (iInputLen==64)
		 {
	     MD5_memcpy((POINTER)&mInformation->buffer[iInputLen-8], (POINTER)&cInputLen[0],8);
	     MD5_memcpy((POINTER)&mInformation->buffer[0], (POINTER)&cInputString[0],iInputLen-8);

	     MD5Transform ((UINT4 *)&mInformation->state[0],(POINTER)&mInformation->buffer[0]);
	 	    }

	 if (iInputLen<64)
	    {
	     MD5_memcpy((POINTER)&mInformation->buffer[0], (POINTER)&cInputString[0],iInputLen-8);
	     MD5_memcpy((POINTER)&mInformation->buffer[iInputLen-8], (POINTER)&cInputLen[0],8);

	     iPaddingStringLen=64-iInputLen;
	     MD5_memcpy((POINTER)&mInformation->buffer[iInputLen], (POINTER)&PADDING[0],iPaddingStringLen);

	     MD5Transform ((UINT4 *)&mInformation->state[0],(POINTER)&mInformation->buffer[0]);
	    }
	 else
	    {
	     MD5_memcpy((POINTER)&mInformation->buffer[iInputLen-8], (POINTER)&cInputLen[0],72-iInputLen);
	     MD5_memcpy((POINTER)&mInformation->buffer[0], (POINTER)&cInputString[0],iInputLen-8);

	     MD5Transform ((UINT4 *)&mInformation->state[0],(POINTER)&mInformation->buffer[0]);

	     MD5_memcpy((POINTER)&mInformation->buffer[0], (POINTER)&cInputLen[72-iInputLen],iInputLen-64);
	     iPaddingStringLen=64+64-iInputLen;
	     MD5_memcpy((POINTER)&mInformation->buffer[iInputLen-64], (POINTER)&PADDING[0],iPaddingStringLen);

	     MD5Transform ((UINT4 *)&mInformation->state[0],(POINTER)&mInformation->buffer[0]);
	    }
  
  //	}


  for(count=0;count<4;count++)
  {
   cResult[4*count+0]=(unsigned char)((mInformation->state[count]>>24)&0xff);
   cResult[4*count+1]=(unsigned char)((mInformation->state[count]>>16)&0xff);
   cResult[4*count+2]=(unsigned char)((mInformation->state[count]>>8)&0xff);
   cResult[4*count+3]=(unsigned char)(mInformation->state[count]& 0xff);
  }
 for(i=0;i<16;i++)
    hashstr[i]=cResult[i];
 hashstr[16]='\0';

 return;
}

int WINAPI DLLEntryPoint (HINSTANCE hDLL, DWORD dwReason, LPVOID Reserved)
{
	switch(dwReason)
	{
	case DLL_PROCESS_ATTACH:
		{

			break;
		}
	case DLL_PROCESS_DETACH:
		{

			break;
		}
	}
	return TRUE;
}

/*

void main(void)
{
 unsigned char* inputData="ABCDEFGHIJKLMNOPQRST 1234567890";
 unsigned char* hashstr;

 // allocate memory for string 
 if ((hashstr = (unsigned char *) malloc(17)) == NULL)
    {
       printf("Not enough memory to allocate buffer\n");
       exit(1);  // terminate program if out of memory 
    }


 MD5String(inputData,hashstr);
 printf("The hash result is %s\n",hashstr);

 }
*/

⌨️ 快捷键说明

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