当前位置:首页 » 编程语言 » md5c语言计算文件

md5c语言计算文件

发布时间: 2022-02-24 13:53:54

A. 求c语言调用md5函数的函数,注意是直接输入字符串就能获得的,不要输入文件名的那种

c语言标准库没有这个函数,随便给你搜了一下别人的实现

/*md5.h*/
#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 = partlen;i+64 <= inputlen;i+=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 */

/* 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, 0x2441453); /* 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, 0x4881d05); /* 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 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
}

B. C语言实现文件传输时用md5加密

搜一下:C语言实现文件传输时用md5加密

C. 如何用C语言实现MD5算法计算一个文本的消息摘要

#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=0;i<len/64;i++)
{ //循环运算直至文件结束
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通过,

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

C语言没有内置的MD5函数,可以在以下页面找到C语言实现程序和MD5的算法介绍:

http://tools.ietf.org/html/rfc1321

E. 求个C语言的socket通信程序,要求服务端计算文件的MD5值并发送,之后才发送正文内容....求高手指教

我不太清楚你说的文件是大文件还是小文件(小于8K的),如果是大文件,可以定义一个简单的协议,比如,规定3个字段
消息类型
消息长度
消息内容
每个消息可以定义一个最大长度,每次收到消息时首先判定消息类型,比如你可以规定1为请求文件的MD5值,消息的内容为文件的路径,消息的长度字段就可以规定消息内容的长度,服务器返回时,可以让消息内容为文件的MD5值;而2可以定义为发送的消息内容是文件的内容(原始文件被分成多段传送);3就可以定义为文件内容传送结束,此时客户端就可以关闭文件就行MD5校验,看是否与之前收到的服务器发送的MD5一致。

如果是简单的文件传送,对效率要求不高,可以简单地采用TCP单线程传送,如果对效率要求较高可以考虑采用UDP进行传送,不过此时协议需要增加超时机制,还要设置包的序号,防止错位。

其实你这个程序就只有两个部分,一个是socket通信,另一个就是MD5值的校验,前者不论是TCP还是UDP都有现成的模板,后者MD5的算法肯定不需要你我去写,肯定也有现成的函数库调用,所以实现起来应该不困难。

F. 请教MD5算法 用C语言实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#ifdefined(__APPLE__)
#defineCOMMON_DIGEST_FOR_OPENSSL
#include<CommonCrypto/CommonDigest.h>
#defineSHA1CC_SHA1
#else
#include<openssl/md5.h>
#endif

//这是我自己写的函数,用于计算MD5
//参数str:要转换的字符串
//参数lengthL:字符串的长度可以用strlen(str)直接获取参数str的长度
//返回值:MD5字符串
char*str2md5(constchar*str,intlength){
intn;
MD5_CTXc;
unsignedchardigest[16];
char*out=(char*)malloc(33);

MD5_Init(&c);

while(length>0){
if(length>512){
MD5_Update(&c,str,512);
}else{
MD5_Update(&c,str,length);
}
length-=512;
str+=512;
}

MD5_Final(digest,&c);

for(n=0;n<16;++n){
snprintf(&(out[n*2]),16*2,"%02x",(unsignedint)digest[n]);
}

returnout;
}

intmain(intargc,char**argv){
char*output=str2md5("hello",strlen("hello"));

printf("%s ",output);
//上面会输出hello的MD5字符串:
//
free(output);
return0;
}

G. 如何计算一个文件的md5值

文件校验和完整性验证程序 (FCIV) 实用程序可以用于计算 MD5 或 sha-1 加密哈希值的文件。 有关文件校验和完整性验证程序 (FCIV) 实用程序的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 841290可用性和文件校验和完整性验证程序实用程序的说明 若要计算在 MD5 和文件的 sha-1 哈希值,请在命令行键入以下命令: FCIV-md5-sha1 path\filename.ext 例如对于计算 Shdocvw.dll 文件 %Systemroot% \System32 文件夹中的 MD5 和 sha-1 哈希值,键入以下命令: FCIV-md5-sha1 c:\windows\system32\shdocvw.dll

H. c语言md5程序里面有文件位操作不懂 达人请进

0x2000 0000在这里是16进制数 转换成十进制数是536870912bit = 67108864 BYTE = 65536 KB = 64MB
/* flen[1]=len/0x20000000; //flen单位是bit */
这行指令做的是 看那个被打开的文件的长度是64兆的多少倍 并且把计算出的结果(倍数)放到array flen[1]里(file length)并且存进去的是个整数 文件长度是个很长的很奇怪的数 除个536870912这么个怪数肯定不会是个整数(至少大多情况下)

所以有了下面这一行指令
/* flen[0]=(len%0x20000000)*8; */
这行指令把file length除64MB这个数的余数提出 并且乘了8(即除以64MB 余数* 8 让BYTE单位变成bit单位) 为程序的后面做运算做铺垫或者准备
并且存在了flen[0]里

这个程序不全 我想提问题的人应该有全的版本 我能给的帮助就这么多 希望能帮到你:)

I. 求一个计算文件MD5的程序(C或C++都行)

#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_PARAM;const double MAX_INT = (double)0xFFFFFFFF + 1.0;const 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 = 1; x <= 64; x++)
{
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) + 56;new_data = (BYTE*)malloc(len + fill + 8);
if (NULL == new_data) return NULL;if (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 + 8;return 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 index;abcd[0] = param->a;
abcd[1] = param->b;
abcd[2] = param->c;
abcd[3] = param->d;
X = param->sub_array;
T = MD5_TRANSFORM_ARRAY;for(index = 0; index < 16; index++)
{
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 + b;abcd[(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* buf;MD5_Init();buf = MD5_prepare_data(data,len,&new_len);
if (buf == NULL) return -1;AA = 0x67452301;
BB = 0xefcdab89;
CC = 0x98badcfe;
DD = 0x10325476;for(x = 0; x < new_len / 64; x++)
{
param.a = AA;
param.b = BB;
param.c = CC;
param.d = DD;for(y = 0; y < 16; y++)
{
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(¶m,0,F);
MD5_transform(¶m,1,G);
MD5_transform(¶m,2,H);
MD5_transform(¶m,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;
}

J. C语言中md5的数据读取与填充

查阅fread函数,可以实现按照字节批次读取,你的文件最好用二进制方式打开。
查阅剩余数据,恐怕得实际读取才知道,但是每次读取文件都会改变文件指针的位置,你需要用fseek来移动文件指针回到原本的位置。
函数 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);函数说明 fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放
读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目,
如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()
来决定发生什么情况。

热点内容
电脑中dns服务器 发布:2025-01-09 23:30:12 浏览:700
解放数据库 发布:2025-01-09 23:28:52 浏览:366
融资租赁算法 发布:2025-01-09 23:28:47 浏览:826
长安t最新配置怎么开 发布:2025-01-09 23:28:45 浏览:146
群晖脚本图片 发布:2025-01-09 23:27:56 浏览:311
android开发发展 发布:2025-01-09 23:15:36 浏览:283
sw装配体怎么选择零件配置 发布:2025-01-09 23:13:17 浏览:209
如何进入华为的服务器 发布:2025-01-09 23:11:37 浏览:854
安卓日历每月提醒怎么设置 发布:2025-01-09 23:07:53 浏览:387
安卓手机qq怎么备份 发布:2025-01-09 23:07:12 浏览:958