C语言求文件MD5的函数用法

C语言求文件MD5的函数用法,第1张

#ifndef MD5_H

#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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12234034.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存