网上找到的实现md5函数代码,包括一个头文件md5.h和一个源文件md5.c,用下面的测试代码test.c测试通过,各文件依次如下:
头文件md5.h:
1 #ifndef MD5_H 2 #define MD5_H 3 4 typedef struct 5 { 6 unsigned int count[2]; 7 unsigned int state[4]; 8 unsigned char buffer[64]; 9 }MD5_CTX; 10 11 12 #define F(x,y,z) ((x & y) | (~x & z)) 13 #define G(x,y,z) ((x & z) | (y & ~z)) 14 #define H(x,y,z) (x^y^z) 15 #define I(x,y,z) (y ^ (x | ~z)) 16 #define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n))) 17 #define FF(a,b,c,d,x,s,ac) \ 18 { \ 19 a += F(b,c,d) + x + ac; \ 20 a = ROTATE_LEFT(a,s); \ 21 a += b; \ 22 } 23 #define GG(a,b,c,d,x,s,ac) \ 24 { \ 25 a += G(b,c,d) + x + ac; \ 26 a = ROTATE_LEFT(a,s); \ 27 a += b; \ 28 } 29 #define HH(a,b,c,d,x,s,ac) \ 30 { \ 31 a += H(b,c,d) + x + ac; \ 32 a = ROTATE_LEFT(a,s); \ 33 a += b; \ 34 } 35 #define II(a,b,c,d,x,s,ac) \ 36 { \ 37 a += I(b,c,d) + x + ac; \ 38 a = ROTATE_LEFT(a,s); \ 39 a += b; \ 40 } 41 void MD5Init(MD5_CTX *context); 42 void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen); 43 void MD5Final(MD5_CTX *context,unsigned char digest[16]); 44 void MD5Transform(unsigned int state[4],unsigned char block[64]); 45 void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len); 46 void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len); 47 48 #endif