#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 <stdlib.h>
#include <memory.h>
#include <math.h>
#include "windows.h"typedef unsigned char BYTE
typedef unsigned int UINT
typedef UINT MD5_SUB_ARRAY[16]
typedef UINT MD5_TRANSORM_FUNC(UINT,UINT,UINT)
typedef struct
{
UINT a
UINT b
UINT c
UINT d
MD5_SUB_ARRAY sub_array
}MD5_TRANSFORM_PARAMconst double MAX_INT = (double)0xFFFFFFFF + 1.0const UINT MD5_TRANSFORM_MATRIX[4][16][3] =
{{
{ 0, 7, 1}, { 1,12, 2}, { 2,17, 3}, { 3,22, 4},
{ 4, 7, 5}, { 5,12, 6}, { 6,17, 7}, { 7,22, 8},
{ 8, 7, 9}, { 9,12,10}, {10,17,11}, {11,22,12},
{12, 7,13}, {13,12,14}, {14,17,15}, {15,22,16},
},{
{ 1, 5,17}, { 6, 9,18}, {11,14,19}, { 0,20,20},
{ 5, 5,21}, {10, 9,22}, {15,14,23}, { 4,20,24},
{ 9, 5,25}, {14, 9,26}, { 3,14,27}, { 8,20,28},
{13, 5,29}, { 2, 9,30}, { 7,14,31}, {12,20,32},
},{
{5, 4, 33}, { 8,11,34}, {11,16,35},{14, 23,36},
{1, 4, 37}, { 4,11,38}, { 7,16,39},{10, 23,40},fayer
{13,4, 41}, { 0,11,42}, { 3,16,43},{ 6, 23,44},
{9, 4, 45}, {12,11,46}, {15,16,47},{ 2, 23,48},
},{
{ 0,6,49}, { 7,10,50}, {14,15,51},{ 5, 21,52},
{12,6,53}, { 3,10,54}, {10,15,55},{ 1, 21,56},
{ 8,6,57}, {15,10,58}, { 6,15,59},{13, 21,60},
{ 4,6,61}, {11,10,62}, { 2,15,63},{ 9, 21,64},
},
}static UINT MD5_TRANSFORM_ARRAY[65]void MD5_Init()
{
int x
for(x = 1x <= 64x++)
{
MD5_TRANSFORM_ARRAY[fayer] = (UINT)(MAX_INT * fabs(sin(x)))
}
}UINT F(UINT x,UINT y,UINT z)
{
return ((x &y) | ((~x) &z))
}UINT G(UINT x,UINT y,UINT z)
{
return ((x &z) | (y &(~z)))
}UINT H(UINT x,UINT y,UINT z)
{
return (x ^ y ^ z)
}UINT I(UINT x,UINT y,UINT z)
{
return (y ^ (x | (~z)))
} BYTE* MD5_prepare_data(const BYTE* data,int len,int* new_len)
{
int rest,fill,size
BYTE* new_data
UINT bit_len// (1) 字节补齐
rest = len % 56
if (rest <= 56) fill = 56 - rest
else fill = (64 - rest) + 56new_data = (BYTE*)malloc(len + fill + 8)
if (NULL == new_data) return NULLif (len >0) memcpy(new_data,datafayer,len)
if (fill >0) memset(new_data + len,0x80,1)
if (fill >1) memset(new_data + len + 1,0,fill - 1)size = fill + len// (2) 附加数据的比特长度
bit_len = len * 8
// (64位二进制数表示的)比特长度的低32位
memset(new_data + size + 0,(bit_len &0x000000FF), 1)
memset(new_data + size + 1,(bit_len &0x0000FF00) >>8, 1)
// 不考虑比特长度超出32位无符号数表示范围,所以高32位总是0
memset(new_data + size + 4,0,4)*new_len = size + 8return new_data
}void MD5_transform(MD5_TRANSFORM_PARAM* param,int ring,MD5_TRANSORM_FUNC func)
{
UINT a,b,c,d,s,k,i
UINT abcd[4]
UINT *X,*T
int indexabcd[0] = param->a
abcd[1] = param->b
abcd[2] = param->c
abcd[3] = param->d
X = param->sub_array
T = MD5_TRANSFORM_ARRAYfor(index = 0index <16index++)
{
a = abcd[(3 * index + 0) % 4]
b = abcd[(3 * index + 1) % 4]
c = abcd[(3 * index + 2) % 4]
d = abcd[(3 * index + 3) % 4]k = MD5_TRANSFORM_MATRIX[ring][index][0]
s = MD5_TRANSFORM_MATRIX[ring][index][1]
i = MD5_TRANSFORM_MATRIX[ring][index][2]a = a + func(b,c,d) + X[k] + T[i]
a = ( a <<s) | ( a >>(32 - s))// 循环左移
a = a + babcd[(3 * index + 0) % 4] = a
}param->a = abcd[0]
param->b = abcd[1]
param->c = abcd[2]
param->d = abcd[3]
}int MD5(const BYTE* data,int len)
{int x,y,new_len
MD5_TRANSFORM_PARAM param
UINT AA,BB,CC,DD
BYTE* bufMD5_Init()buf = MD5_prepare_data(data,len,&new_len)
if (buf == NULL) return -1AA = 0x67452301
BB = 0xefcdab89
CC = 0x98badcfe
DD = 0x10325476for(x = 0x <new_len / 64x++)
{
param.a = AA
param.b = BB
param.c = CC
param.d = DDfor(y = 0y <16y++)
{
param.sub_array[y] = buf[64 * x + 4 * y + 0]
param.sub_array[y] += buf[64 * x + 4 * y + 1] <<8
param.sub_array[y] += buf[64 * x + 4 * y + 2] <<16
param.sub_array[y] += buf[64 * x + 4 * y + 3] <<24
}
MD5_transform(&param,0,F)
MD5_transform(&param,1,G)
MD5_transform(&param,2,H)
MD5_transform(&param,3,I)AA += param.a
BB += param.b
CC += param.c
DD += param.d
}printf("MD5(\"%s\")=",data)printf("%02X%02X%02X%02X",
(AA &0x000000FF),
(AA &0x0000FF00) >>8,
(AA &0x00FF0000) >>16,
(AA &0xFF000000) >>24)printf("%02X%02X%02X%02X",
(BB &0x000000FF),
(BB &0x0000FF00) >>8,
(BB &0x00FF0000) >>16,
(BB &0xFF000000) >>24)printf("%02X%02X%02X%02X",
(CC &0x000000FF),
(CC &0x0000FF00) >>8,
(CC &0x00FF0000) >>16,
(CC &0xFF000000) >>24)printf("%02X%02X%02X%02X",
(DD &0x000000FF),
(DD &0x0000FF00) >>8,
(DD &0x00FF0000) >>16,
(DD &0xFF000000) >>24)printf("\n")return 0
}
int main()
{
MD5((unsigned char *)"",0)//这里需要将待处理的字符串强制类型转化为unsigned char *,保持和MD5()参数类型的一致。
MD5((unsigned char *)"a",1)
MD5((unsigned char *)"abc",3)
MD5((unsigned char *)"message digest",14)
MD5((unsigned char *)"abcdefghijklmnopqrstuvwxyz",26)return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)