当前位置:首页 » 编程语言 » c语言计算文件md5
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言计算文件md5

发布时间: 2022-09-09 16:03:36

⑴ 跪求大虾帮忙实现下MD5的算法(用c语言),刚找到工作,忘大家帮个忙,谢谢啊!

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <time.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include "../md5/md5.h"

#define T1 0xd76aa478
#define T2 0xe8c7b756
#define T3 0x242070db
#define T4 0xc1bdceee
#define T5 0xf57c0faf
#define T6 0x4787c62a
#define T7 0xa8304613
#define T8 0xfd469501
#define T9 0x698098d8
#define T10 0x8b44f7af
#define T11 0xffff5bb1
#define T12 0x895cd7be
#define T13 0x6b901122
#define T14 0xfd987193
#define T15 0xa679438e
#define T16 0x49b40821
#define T17 0xf61e2562
#define T18 0xc040b340
#define T19 0x265e5a51
#define T20 0xe9b6c7aa
#define T21 0xd62f105d
#define T22 0x02441453
#define T23 0xd8a1e681
#define T24 0xe7d3fbc8
#define T25 0x21e1cde6
#define T26 0xc33707d6
#define T27 0xf4d50d87
#define T28 0x455a14ed
#define T29 0xa9e3e905
#define T30 0xfcefa3f8
#define T31 0x676f02d9
#define T32 0x8d2a4c8a
#define T33 0xfffa3942
#define T34 0x8771f681
#define T35 0x6d9d6122
#define T36 0xfde5380c
#define T37 0xa4beea44
#define T38 0x4bdecfa9
#define T39 0xf6bb4b60
#define T40 0xbebfbc70
#define T41 0x289b7ec6
#define T42 0xeaa127fa
#define T43 0xd4ef3085
#define T44 0x04881d05
#define T45 0xd9d4d039
#define T46 0xe6db99e5
#define T47 0x1fa27cf8
#define T48 0xc4ac5665
#define T49 0xf4292244
#define T50 0x432aff97
#define T51 0xab9423a7
#define T52 0xfc93a039
#define T53 0x655b59c3

#define T54 0x8f0ccc92
#define T55 0xffeff47d
#define T56 0x85845dd1
#define T57 0x6fa87e4f
#define T58 0xfe2ce6e0
#define T59 0xa3014314
#define T60 0x4e0811a1
#define T61 0xf7537e82
#define T62 0xbd3af235
#define T63 0x2ad7d2bb
#define T64 0xeb86d391

static void md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
{
md5_word_t
a = pms->abcd[0], b = pms->abcd[1],
c = pms->abcd[2], d = pms->abcd[3];
md5_word_t t;

#ifndef ARCH_IS_BIG_ENDIAN
# define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */
#endif
#if ARCH_IS_BIG_ENDIAN

/*
* On big-endian machines, we must arrange the bytes in the right
* order. (This also works on machines of unknown byte order.)
*/
md5_word_t X[16];
const md5_byte_t *xp = data;
int i;

for (i = 0; i < 16; i, xp = 4)
X[i] = xp[0] (xp[1] << 8) (xp[2] << 16) (xp[3] << 24);

#else /* !ARCH_IS_BIG_ENDIAN */

/*
* On little-endian machines, we can process properly aligned data
* without ing it.
*/
md5_word_t xbuf[16];
const md5_word_t *X;

if (!((data - (const md5_byte_t *)0) & 3)) {
/* data are properly aligned */
X = (const md5_word_t *)data;
} else {
/* not aligned */
memcpy(xbuf, data, 64);
X = xbuf;
}
#endif

#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))

/* Round 1. */
/* Let [abcd k s i] denote the operation
a = b ((a F(b,c,d) X[k] T[i]) <<< s). */
#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
#define SET(a, b, c, d, k, s, Ti)\
t = a F(b,c,d) X[k] Ti;\
a = ROTATE_LEFT(t, s) b
/* Do the following 16 operations. */
SET(a, b, c, d, 0, 7, T1);
SET(d, a, b, c, 1, 12, T2);
SET(c, d, a, b, 2, 17, T3);
SET(b, c, d, a, 3, 22, T4);
SET(a, b, c, d, 4, 7, T5);
SET(d, a, b, c, 5, 12, T6);
SET(c, d, a, b, 6, 17, T7);

SET(b, c, d, a, 7, 22, T8);
SET(a, b, c, d, 8, 7, T9);
SET(d, a, b, c, 9, 12, T10);
SET(c, d, a, b, 10, 17, T11);
SET(b, c, d, a, 11, 22, T12);
SET(a, b, c, d, 12, 7, T13);
SET(d, a, b, c, 13, 12, T14);
SET(c, d, a, b, 14, 17, T15);
SET(b, c, d, a, 15, 22, T16);
#undef SET

/* Round 2. */
/* Let [abcd k s i] denote the operation
a = b ((a G(b,c,d) X[k] T[i]) <<< s). */
#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
#define SET(a, b, c, d, k, s, Ti)\
t = a G(b,c,d) X[k] Ti;\
a = ROTATE_LEFT(t, s) b
/* Do the following 16 operations. */
SET(a, b, c, d, 1, 5, T17);
SET(d, a, b, c, 6, 9, T18);
SET(c, d, a, b, 11, 14, T19);
SET(b, c, d, a, 0, 20, T20);
SET(a, b, c, d, 5, 5, T21);
SET(d, a, b, c, 10, 9, T22);
SET(c, d, a, b, 15, 14, T23);
SET(b, c, d, a, 4, 20, T24);
SET(a, b, c, d, 9, 5, T25);
SET(d, a, b, c, 14, 9, T26);
SET(c, d, a, b, 3, 14, T27);
SET(b, c, d, a, 8, 20, T28);
SET(a, b, c, d, 13, 5, T29);
SET(d, a, b, c, 2, 9, T30);
SET(c, d, a, b, 7, 14, T31);
SET(b, c, d, a, 12, 20, T32);
#undef SET

⑵ 用c语言实现python的md5功能

题中所示代码中,python实现了计算空字符串的MD5值,并对MD5的值的十六进制的字符串所表示的字节进行BASE64处理。

不像Python内部有实现md5功能,根据ANSI C标准,C语言的标准库里是没有md5功能的;

但是RFC1231规定了MD5功能的C实现并提供了附件,可以直接用,也可以直接获取现成的实现,在编译链接时指定正确的.h头文件和.lib静态链接库文件;

这里我采取前者的做法(电脑上没有装VC,有VC就简单很多,使用的是minGW)大概六七百行代码左右。

然后这里展示不完,给个实现效果图

BASE64的编码原理

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

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

⑷ 求一个计算文件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;
}

⑸ md5是什么 如何计算MD5

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。

MD5算法具有以下特点:

1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

2、容易计算:从原数据计算出MD5值很容易。

3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的16进制数字串)。

大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为司法机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的MD5“数字指纹”,如果任何人对文件做了任何改动,其MD5也就是对应的“数字指纹”都会发生变化。

⑹ 求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;
}

⑺ 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]里

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

⑻ c#实现如何遍历一个文件夹下的所有文件,并用md5函数算出所有文件的md5值

把问题分解
遍历文件夹使用函数System.IO.Directory.GetFiles()
如果你想获得包括子文件夹下的所有文件 也有对应的重载

计算md5需要使用System.Security.Cryptography.MD5类
用法如下:
MD5 md5 = MD5.Create();
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] hash = md5.ComputeHash(fs);
fs.Close();

两段代码连上 一个遍历 再加上你自己的逻辑 就实现出来了

⑼ 如何用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通过,

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

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

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