📄 md5.c
字号:
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 + -