📄 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 + -