MD5的实现
别人的代码 但是似乎结果不正确 我觉得是数字可能不对 但是没有找到 希望大家帮忙找一下#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#define SINGLE_ONE_BIT 0x80
#define BLOCK_SIZE 512
#define MOD_SIZE 448
#define APP_SIZE 64
#define BITS 8
#define A 0x67452301
#define B 0xefcdab89
#define C 0x98badcfe
#define D 0x10325476
#ifdef UINT64
#undef UINT64
#endif
#ifdef UINT32
#undef UINT32
#endif
typedef unsigned long UINT64;
typedef unsigned long UINT32;
typedef unsigned char UINT8;
typedef struct
{
char *message;
UINT64 length;
}STRING;
const UINT32 X[4][2]={{0,1},{1,5},{5,3},{0,7}};
const UINT32 S[4][4]={
{7,12,17,22},
{5,9,14,20},
{4,11,16,23},
{6,10,15,21}
};
UINT32 F(UINT32 X,UINT32 Y,UINT32 Z)
{
return (X&Y)|(~X&Z);
}
UINT32 G(UINT32 X,UINT32 Y,UINT32 Z)
{
return (X&Z)|(Y&~Z);
}
UINT32 H(UINT32 X,UINT32 Y,UINT32 Z)
{
return X^Y^Z;
}
UINT32 I(UINT32 X,UINT32 Y,UINT32 Z)
{
return Y^(X|~Z);
}
UINT32 rotate_left(UINT32 x,UINT32 s)
{
return (x<<s)|(x>>(32-s));
}
UINT32 count_padding_bits(UINT32 length)
{
UINT32 div=length*BITS/BLOCK_SIZE;
UINT32 mod=length*BITS%BLOCK_SIZE;
UINT32 c_bits;
if(mod==0)
{
c_bits=MOD_SIZE;
}
else
{
c_bits=(MOD_SIZE+BLOCK_SIZE-mod)%BLOCK_SIZE;
}
return c_bits/BITS;
}
STRING append_padding_bits(char *argv)
{
UINT32 msg_length=strlen(argv);
UINT32 bit_length=count_padding_bits(msg_length);
UINT64 app_length=msg_length *BITS;
STRING string;
string.message=(char*)malloc(msg_length+bit_length+APP_SIZE/BITS);
strncpy(string.message,argv,msg_length);
memset(string.message+msg_length,0,bit_length);
string.message[msg_length]=SINGLE_ONE_BIT;//(char)
memmove(string.message+msg_length+bit_length,(char*)&app_length,sizeof(UINT64));
string.length=msg_length+bit_length+sizeof(UINT64);
return string;
}
int main(int argc,char *argv[])
{
STRING string;
UINT32 w[16];
UINT32 chain[4];
UINT32 state[4];
UINT8 r[16];
UINT32 (*auxi[4])(UINT32,UINT32,UINT32)={F,G,H,I};
int roundldx;
int argldx;
int sldx;
int wldx;
int i;
int j;
if(argc<2)
{
fprintf(stderr,"usage:%s string...\n",argv[0]);
return EXIT_FAILURE;
}
for(argldx=1;argldx<argc;argldx++)
{
string=append_padding_bits(argv[argldx]);
chain[0]=A;
chain[1]=B;
chain[2]=C;
chain[3]=D;
int len=string.length;
for(j=0;j<len;j+=BLOCK_SIZE/BITS)
{
memmove((char*)w,string.message+j,BLOCK_SIZE/BITS);
memmove(state,chain,sizeof(chain));
for(roundldx=0;roundldx<4;roundldx++)
{
wldx=X[roundldx][0];
sldx=0;
for(i=0;i<16;i++)
{
state[sldx]=state[(sldx+1)%4]+
rotate_left(state[sldx]+
(*auxi[roundldx])
(state[(sldx+1)%4],state[(sldx+2)%4],state[(sldx+3)%4])
+w[wldx]
+(UINT32)floor((1UL<<32)*fabs(sin(roundldx*16+i+1))),
S[roundldx][i%4]);
sldx=(sldx+3)%4;
wldx=(wldx+X[roundldx][1])&0xF;////////////
}
}
chain[0]+=state[0];
chain[1]+=state[1];
chain[2]+=state[2];
chain[3]+=state[3];
}
memmove(r+0,(char*)&chain[0],sizeof(UINT32));
memmove(r+4,(char*)&chain[1],sizeof(UINT32));
memmove(r+8,(char*)&chain[2],sizeof(UINT32));
memmove(r+12,(char*)&chain[3],sizeof(UINT32));
for(i=0;i<16;i++)
printf("%02x",r[i]);
putchar('\n');
}
return EXIT_SUCCESS;
}