#define MD5_H
typedef struct
{
unsigned int count[2]
unsigned int state[4]
unsigned char buffer[64]
}MD5_CTX
#define F(x,y,z) ((x &y) | (~x &z))
#define G(x,y,z) ((x &z) | (y &~z))
#define H(x,y,z) (x^y^z)
#define I(x,y,z) (y ^ (x | ~z))
#define ROTATE_LEFT(x,n) ((x <<n) | (x >>(32-n)))
#define FF(a,b,c,d,x,s,ac) \
{ \
a += F(b,c,d) + x + ac\
a = ROTATE_LEFT(a,s)\
a += b\
}
#define GG(a,b,c,d,x,s,ac) \
{ \
a += G(b,c,d) + x + ac\
a = ROTATE_LEFT(a,s)\
a += b\
}
#define HH(a,b,c,d,x,s,ac) \
{ \
a += H(b,c,d) + x + ac\
a = ROTATE_LEFT(a,s)\
a += b\
}
#define II(a,b,c,d,x,s,ac) \
{ \
a += I(b,c,d) + x + ac\
a = ROTATE_LEFT(a,s)\
a += b\
}
void MD5Init(MD5_CTX *context)
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen)
void MD5Final(MD5_CTX *context,unsigned char digest[16])
void MD5Transform(unsigned int state[4],unsigned char block[64])
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len)
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len)
#endif
源文件md5.c
#include <memory.h>
#include "md5.h"
unsigned char PADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
void MD5Init(MD5_CTX *context)
{
context->count[0] = 0
context->count[1] = 0
context->state[0] = 0x67452301
context->state[1] = 0xEFCDAB89
context->state[2] = 0x98BADCFE
context->state[3] = 0x10325476
}
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen)
{
unsigned int i = 0,index = 0,partlen = 0
index = (context->count[0] >>3) &0x3F
partlen = 64 - index
context->count[0] += inputlen <<3
if(context->count[0] <(inputlen <<3))
context->count[1]++
context->count[1] += inputlen >>29
if(inputlen >= partlen)
{
memcpy(&context->buffer[index],input,partlen)
MD5Transform(context->state,context->buffer)
for(i = partleni+64 <= inputleni+=64)
MD5Transform(context->state,&input[i])
index = 0
}
else
{
i = 0
}
memcpy(&context->buffer[index],&input[i],inputlen-i)
}
void MD5Final(MD5_CTX *context,unsigned char digest[16])
{
unsigned int index = 0,padlen = 0
unsigned char bits[8]
index = (context->count[0] >>3) &0x3F
padlen = (index <56)?(56-index):(120-index)
MD5Encode(bits,context->count,8)
MD5Update(context,PADDING,padlen)
MD5Update(context,bits,8)
MD5Encode(digest,context->state,16)
}
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len)
{
unsigned int i = 0,j = 0
while(j <len)
{
output[j] = input[i] &0xFF
output[j+1] = (input[i] >>8) &0xFF
output[j+2] = (input[i] >>16) &0xFF
output[j+3] = (input[i] >>24) &0xFF
i++
j+=4
}
}
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len)
{
unsigned int i = 0,j = 0
while(j <len)
{
output[i] = (input[j]) |
(input[j+1] <<8) |
(input[j+2] <<16) |
(input[j+3] <<24)
i++
j+=4
}
}
void MD5Transform(unsigned int state[4],unsigned char block[64])
{
unsigned int a = state[0]
unsigned int b = state[1]
unsigned int c = state[2]
unsigned int d = state[3]
unsigned int x[64]
MD5Decode(x,block,64)
FF(a, b, c, d, x[ 0], 7, 0xd76aa478)/* 1 */
FF(d, a, b, c, x[ 1], 12, 0xe8c7b756)/* 2 */
FF(c, d, a, b, x[ 2], 17, 0x242070db)/* 3 */
FF(b, c, d, a, x[ 3], 22, 0xc1bdceee)/* 4 */
FF(a, b, c, d, x[ 4], 7, 0xf57c0faf)/* 5 */
FF(d, a, b, c, x[ 5], 12, 0x4787c62a)/* 6 */
FF(c, d, a, b, x[ 6], 17, 0xa8304613)/* 7 */
FF(b, c, d, a, x[ 7], 22, 0xfd469501)/* 8 */
FF(a, b, c, d, x[ 8], 7, 0x698098d8)/* 9 */
FF(d, a, b, c, x[ 9], 12, 0x8b44f7af)/* 10 */
FF(c, d, a, b, x[10], 17, 0xffff5bb1)/* 11 */
FF(b, c, d, a, x[11], 22, 0x895cd7be)/* 12 */
FF(a, b, c, d, x[12], 7, 0x6b901122)/* 13 */
FF(d, a, b, c, x[13], 12, 0xfd987193)/* 14 */
FF(c, d, a, b, x[14], 17, 0xa679438e)/* 15 */
FF(b, c, d, a, x[15], 22, 0x49b40821)/* 16 */
#include<stdio.h>#include<string.h>
#define F(x, y, z) (((x) &(y)) | ((~x) &(z)))
#define G(x, y, z) (((x) &(z)) | ((y) &(~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
#define RL(x, y) (((x) <<(y)) | ((x) >>(32 - (y)))) //x向左循环移y位
#define PP(x) (x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24) //将x高低位互换,例如PP(aabbccdd)=ddccbbaa
#define FF(a, b, c, d, x, s, ac) a = b + (RL((a + F(b,c,d) + x + ac),s))
#define GG(a, b, c, d, x, s, ac) a = b + (RL((a + G(b,c,d) + x + ac),s))
#define HH(a, b, c, d, x, s, ac) a = b + (RL((a + H(b,c,d) + x + ac),s))
#define II(a, b, c, d, x, s, ac) a = b + (RL((a + I(b,c,d) + x + ac),s))
void go_md5(unsigned *a, unsigned *b, unsigned *c, unsigned *d, unsigned *A, unsigned *B, unsigned *C, unsigned *D, unsigned x[]){ //MD5核心算法,供64轮
*a=*A,*b=*B,*c=*C,*d=*D
/**//* Round 1 */
FF (*a, *b, *c, *d, x[ 0], 7, 0xd76aa478)/**//* 1 */
FF (*d, *a, *b, *c, x[ 1], 12, 0xe8c7b756)/**//* 2 */
FF (*c, *d, *a, *b, x[ 2], 17, 0x242070db)/**//* 3 */
FF (*b, *c, *d, *a, x[ 3], 22, 0xc1bdceee)/**//* 4 */
FF (*a, *b, *c, *d, x[ 4], 7, 0xf57c0faf)/**//* 5 */
FF (*d, *a, *b, *c, x[ 5], 12, 0x4787c62a)/**//* 6 */
FF (*c, *d, *a, *b, x[ 6], 17, 0xa8304613)/**//* 7 */
FF (*b, *c, *d, *a, x[ 7], 22, 0xfd469501)/**//* 8 */
FF (*a, *b, *c, *d, x[ 8], 7, 0x698098d8)/**//* 9 */
FF (*d, *a, *b, *c, x[ 9], 12, 0x8b44f7af)/**//* 10 */
FF (*c, *d, *a, *b, x[10], 17, 0xffff5bb1)/**//* 11 */
FF (*b, *c, *d, *a, x[11], 22, 0x895cd7be)/**//* 12 */
FF (*a, *b, *c, *d, x[12], 7, 0x6b901122)/**//* 13 */
FF (*d, *a, *b, *c, x[13], 12, 0xfd987193)/**//* 14 */
FF (*c, *d, *a, *b, x[14], 17, 0xa679438e)/**//* 15 */
FF (*b, *c, *d, *a, x[15], 22, 0x49b40821)/**//* 16 */
/**//* Round 2 */
GG (*a, *b, *c, *d, x[ 1], 5, 0xf61e2562)/**//* 17 */
GG (*d, *a, *b, *c, x[ 6], 9, 0xc040b340)/**//* 18 */
GG (*c, *d, *a, *b, x[11], 14, 0x265e5a51)/**//* 19 */
GG (*b, *c, *d, *a, x[ 0], 20, 0xe9b6c7aa)/**//* 20 */
GG (*a, *b, *c, *d, x[ 5], 5, 0xd62f105d)/**//* 21 */
GG (*d, *a, *b, *c, x[10], 9, 0x02441453)/**//* 22 */
GG (*c, *d, *a, *b, x[15], 14, 0xd8a1e681)/**//* 23 */
GG (*b, *c, *d, *a, x[ 4], 20, 0xe7d3fbc8)/**//* 24 */
GG (*a, *b, *c, *d, x[ 9], 5, 0x21e1cde6)/**//* 25 */
GG (*d, *a, *b, *c, x[14], 9, 0xc33707d6)/**//* 26 */
GG (*c, *d, *a, *b, x[ 3], 14, 0xf4d50d87)/**//* 27 */
GG (*b, *c, *d, *a, x[ 8], 20, 0x455a14ed)/**//* 28 */
GG (*a, *b, *c, *d, x[13], 5, 0xa9e3e905)/**//* 29 */
GG (*d, *a, *b, *c, x[ 2], 9, 0xfcefa3f8)/**//* 30 */
GG (*c, *d, *a, *b, x[ 7], 14, 0x676f02d9)/**//* 31 */
GG (*b, *c, *d, *a, x[12], 20, 0x8d2a4c8a)/**//* 32 */
/**//* Round 3 */
HH (*a, *b, *c, *d, x[ 5], 4, 0xfffa3942)/**//* 33 */
HH (*d, *a, *b, *c, x[ 8], 11, 0x8771f681)/**//* 34 */
HH (*c, *d, *a, *b, x[11], 16, 0x6d9d6122)/**//* 35 */
HH (*b, *c, *d, *a, x[14], 23, 0xfde5380c)/**//* 36 */
HH (*a, *b, *c, *d, x[ 1], 4, 0xa4beea44)/**//* 37 */
HH (*d, *a, *b, *c, x[ 4], 11, 0x4bdecfa9)/**//* 38 */
HH (*c, *d, *a, *b, x[ 7], 16, 0xf6bb4b60)/**//* 39 */
HH (*b, *c, *d, *a, x[10], 23, 0xbebfbc70)/**//* 40 */
HH (*a, *b, *c, *d, x[13], 4, 0x289b7ec6)/**//* 41 */
HH (*d, *a, *b, *c, x[ 0], 11, 0xeaa127fa)/**//* 42 */
HH (*c, *d, *a, *b, x[ 3], 16, 0xd4ef3085)/**//* 43 */
HH (*b, *c, *d, *a, x[ 6], 23, 0x04881d05)/**//* 44 */
HH (*a, *b, *c, *d, x[ 9], 4, 0xd9d4d039)/**//* 45 */
HH (*d, *a, *b, *c, x[12], 11, 0xe6db99e5)/**//* 46 */
HH (*c, *d, *a, *b, x[15], 16, 0x1fa27cf8)/**//* 47 */
HH (*b, *c, *d, *a, x[ 2], 23, 0xc4ac5665)/**//* 48 */
/**//* Round 4 */
II (*a, *b, *c, *d, x[ 0], 6, 0xf4292244)/**//* 49 */
II (*d, *a, *b, *c, x[ 7], 10, 0x432aff97)/**//* 50 */
II (*c, *d, *a, *b, x[14], 15, 0xab9423a7)/**//* 51 */
II (*b, *c, *d, *a, x[ 5], 21, 0xfc93a039)/**//* 52 */
II (*a, *b, *c, *d, x[12], 6, 0x655b59c3)/**//* 53 */
II (*d, *a, *b, *c, x[ 3], 10, 0x8f0ccc92)/**//* 54 */
II (*c, *d, *a, *b, x[10], 15, 0xffeff47d)/**//* 55 */
II (*b, *c, *d, *a, x[ 1], 21, 0x85845dd1)/**//* 56 */
II (*a, *b, *c, *d, x[ 8], 6, 0x6fa87e4f)/**//* 57 */
II (*d, *a, *b, *c, x[15], 10, 0xfe2ce6e0)/**//* 58 */
II (*c, *d, *a, *b, x[ 6], 15, 0xa3014314)/**//* 59 */
II (*b, *c, *d, *a, x[13], 21, 0x4e0811a1)/**//* 60 */
II (*a, *b, *c, *d, x[ 4], 6, 0xf7537e82)/**//* 61 */
II (*d, *a, *b, *c, x[11], 10, 0xbd3af235)/**//* 62 */
II (*c, *d, *a, *b, x[ 2], 15, 0x2ad7d2bb)/**//* 63 */
II (*b, *c, *d, *a, x[ 9], 21, 0xeb86d391)/**//* 64 */
*A += *a
*B += *b
*C += *c
*D += *d
}
void get_x(char *p_str, unsigned *pa_x)
{
int k = 0
int i = 0
int j
int f = 0
int g,h
while (p_str[k] != 0)
{
g = k+3
while (i <4)
{
if (p_str[g] == 0)
{
g--
i++
continue
}
pa_x[f] = pa_x[f]*16*16+p_str[g]
i++
g--
k++
}
f++
i = 0
}
}
int main()
{
char ch[7] = "123456"
char *p
p = ch
int f = 0, j
unsigned A,B,C,D,a,b,c,d,i,len,flen[2],x[16] //i临时变量,len文件长,flen[2]为64位二进制表示的文件初始长度
A = 0x67452301, B = 0xefcdab89, C = 0x98badcfe, D = 0x10325476//初始化链接变量
len = strlen(p)
flen[1] = len / 0x20000000//flen单位是bit
flen[0] = (len % 0x20000000) * 8
memset(x,0,64)//初始化x数组为0
get_x(ch, x)
for(i=0i<len/64i++)
{//循环运算直至文件结束
go_md5(&a,&b,&c,&d,&A,&B,&C,&D,x)
memset(x,0,64)
get_x(ch, x)
}
((char*)x)[len % 64] = 128
if(len%64>55)
{
go_md5(&a,&b,&c,&d,&A,&B,&C,&D,x)
memset(x,0,64)
}
memcpy(x + 14, flen, 8)
go_md5(&a,&b,&c,&d,&A,&B,&C,&D,x)
printf("MD5 Code:%08x%08x%08x%08x\n",PP(A),PP(B),PP(C),PP(D))
getch()
return 0
}
我自己修改的,在devcpp通过,