根据网上资料,整理验证C程序代码。

接口函数:

 /******************************************************
*函数名称:Compute_data_md5
*输 入:data 校验数据首地址
len 校验数据长度
md5_str 字符串形式的MD5值
*输 出:无
*功 能:计算数据MD5值,并以字符串形式返回
*******************************************************/
int Compute_data_md5(unsigned char *data, unsigned int len,unsigned char *md5_str)

MD5.h 的内容:

 #ifndef _MD5_H_
#define _MD5_H_ #define MD5_SIZE 16
#define MD5_STR_LEN (MD5_SIZE * 2) typedef struct
{
unsigned int count[];
unsigned int state[];
unsigned char buffer[];
} 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[]);
void MD5Transform(unsigned int state[], unsigned char block[]);
void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len);
void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len); int Compute_data_md5(unsigned char *data, unsigned int len,unsigned char *md5_str); #endif

MD5.c 的内容:

 #include "md5.h"
#include <memory.h>
#include <stdio.h> unsigned char PADDING[] =
{
0x80,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,
}; void MD5Init(MD5_CTX *context)
{
context->count[] = ;
context->count[] = ;
context->state[] = 0x67452301;
context->state[] = 0xEFCDAB89;
context->state[] = 0x98BADCFE;
context->state[] = 0x10325476;
} void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen)
{
unsigned int i = ;
unsigned int index = ;
unsigned int partlen = ; index = (context->count[] >> ) & 0x3F;
partlen = - index;
context->count[] += inputlen << ; if(context->count[] < (inputlen << ))
context->count[]++;
context->count[] += inputlen >> ; if(inputlen >= partlen)
{
memcpy(&context->buffer[index], input,partlen);
MD5Transform(context->state, context->buffer); for(i = partlen; i+ <= inputlen; i+=)
MD5Transform(context->state, &input[i]); index = ;
}
else
{
i = ;
}
memcpy(&context->buffer[index], &input[i], inputlen-i);
} void MD5Final(MD5_CTX *context, unsigned char digest[])
{
unsigned int index = ,padlen = ;
unsigned char bits[]; index = (context->count[] >> ) & 0x3F;
padlen = (index < )?(-index):(-index);
MD5Encode(bits, context->count, );
MD5Update(context, PADDING, padlen);
MD5Update(context, bits, );
MD5Encode(digest, context->state, );
} void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len)
{
unsigned int i = ;
unsigned int j = ; while(j < len)
{
output[j] = input[i] & 0xFF;
output[j+] = (input[i] >> ) & 0xFF;
output[j+] = (input[i] >> ) & 0xFF;
output[j+] = (input[i] >> ) & 0xFF;
i++;
j += ;
}
} void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len)
{
unsigned int i = ;
unsigned int j = ; while(j < len)
{
output[i] = (input[j]) |
(input[j+] << ) |
(input[j+] << ) |
(input[j+] << );
i++;
j += ;
}
} void MD5Transform(unsigned int state[], unsigned char block[])
{
unsigned int a = state[];
unsigned int b = state[];
unsigned int c = state[];
unsigned int d = state[];
unsigned int x[]; MD5Decode(x,block,); FF(a, b, c, d, x[ ], , 0xd76aa478); /* 1 */
FF(d, a, b, c, x[ ], , 0xe8c7b756); /* 2 */
FF(c, d, a, b, x[ ], , 0x242070db); /* 3 */
FF(b, c, d, a, x[ ], , 0xc1bdceee); /* 4 */
FF(a, b, c, d, x[ ], , 0xf57c0faf); /* 5 */
FF(d, a, b, c, x[ ], , 0x4787c62a); /* 6 */
FF(c, d, a, b, x[ ], , 0xa8304613); /* 7 */
FF(b, c, d, a, x[ ], , 0xfd469501); /* 8 */
FF(a, b, c, d, x[ ], , 0x698098d8); /* 9 */
FF(d, a, b, c, x[ ], , 0x8b44f7af); /* 10 */
FF(c, d, a, b, x[], , 0xffff5bb1); /* 11 */
FF(b, c, d, a, x[], , 0x895cd7be); /* 12 */
FF(a, b, c, d, x[], , 0x6b901122); /* 13 */
FF(d, a, b, c, x[], , 0xfd987193); /* 14 */
FF(c, d, a, b, x[], , 0xa679438e); /* 15 */
FF(b, c, d, a, x[], , 0x49b40821); /* 16 */ /* Round 2 */
GG(a, b, c, d, x[ ], , 0xf61e2562); /* 17 */
GG(d, a, b, c, x[ ], , 0xc040b340); /* 18 */
GG(c, d, a, b, x[], , 0x265e5a51); /* 19 */
GG(b, c, d, a, x[ ], , 0xe9b6c7aa); /* 20 */
GG(a, b, c, d, x[ ], , 0xd62f105d); /* 21 */
GG(d, a, b, c, x[], , 0x2441453); /* 22 */
GG(c, d, a, b, x[], , 0xd8a1e681); /* 23 */
GG(b, c, d, a, x[ ], , 0xe7d3fbc8); /* 24 */
GG(a, b, c, d, x[ ], , 0x21e1cde6); /* 25 */
GG(d, a, b, c, x[], , 0xc33707d6); /* 26 */
GG(c, d, a, b, x[ ], , 0xf4d50d87); /* 27 */
GG(b, c, d, a, x[ ], , 0x455a14ed); /* 28 */
GG(a, b, c, d, x[], , 0xa9e3e905); /* 29 */
GG(d, a, b, c, x[ ], , 0xfcefa3f8); /* 30 */
GG(c, d, a, b, x[ ], , 0x676f02d9); /* 31 */
GG(b, c, d, a, x[], , 0x8d2a4c8a); /* 32 */ /* Round 3 */
HH(a, b, c, d, x[ ], , 0xfffa3942); /* 33 */
HH(d, a, b, c, x[ ], , 0x8771f681); /* 34 */
HH(c, d, a, b, x[], , 0x6d9d6122); /* 35 */
HH(b, c, d, a, x[], , 0xfde5380c); /* 36 */
HH(a, b, c, d, x[ ], , 0xa4beea44); /* 37 */
HH(d, a, b, c, x[ ], , 0x4bdecfa9); /* 38 */
HH(c, d, a, b, x[ ], , 0xf6bb4b60); /* 39 */
HH(b, c, d, a, x[], , 0xbebfbc70); /* 40 */
HH(a, b, c, d, x[], , 0x289b7ec6); /* 41 */
HH(d, a, b, c, x[ ], , 0xeaa127fa); /* 42 */
HH(c, d, a, b, x[ ], , 0xd4ef3085); /* 43 */
HH(b, c, d, a, x[ ], , 0x4881d05); /* 44 */
HH(a, b, c, d, x[ ], , 0xd9d4d039); /* 45 */
HH(d, a, b, c, x[], , 0xe6db99e5); /* 46 */
HH(c, d, a, b, x[], , 0x1fa27cf8); /* 47 */
HH(b, c, d, a, x[ ], , 0xc4ac5665); /* 48 */ /* Round 4 */
II(a, b, c, d, x[ ], , 0xf4292244); /* 49 */
II(d, a, b, c, x[ ], , 0x432aff97); /* 50 */
II(c, d, a, b, x[], , 0xab9423a7); /* 51 */
II(b, c, d, a, x[ ], , 0xfc93a039); /* 52 */
II(a, b, c, d, x[], , 0x655b59c3); /* 53 */
II(d, a, b, c, x[ ], , 0x8f0ccc92); /* 54 */
II(c, d, a, b, x[], , 0xffeff47d); /* 55 */
II(b, c, d, a, x[ ], , 0x85845dd1); /* 56 */
II(a, b, c, d, x[ ], , 0x6fa87e4f); /* 57 */
II(d, a, b, c, x[], , 0xfe2ce6e0); /* 58 */
II(c, d, a, b, x[ ], , 0xa3014314); /* 59 */
II(b, c, d, a, x[], , 0x4e0811a1); /* 60 */
II(a, b, c, d, x[ ], , 0xf7537e82); /* 61 */
II(d, a, b, c, x[], , 0xbd3af235); /* 62 */
II(c, d, a, b, x[ ], , 0x2ad7d2bb); /* 63 */
II(b, c, d, a, x[ ], , 0xeb86d391); /* 64 */
state[] += a;
state[] += b;
state[] += c;
state[] += d;
} /******************************************************
*函数名称:Compute_data_md5
*输 入:data 校验数据首地址
len 校验数据长度
md5_str 字符串形式的MD5值
*输 出:无
*功 能:计算数据MD5值,并以字符串形式返回
*******************************************************/
int Compute_data_md5(unsigned char *data, unsigned int len,unsigned char *md5_str)
{
unsigned char md5_value[MD5_SIZE];
unsigned int i = ; MD5_CTX md5; MD5Init(&md5);
MD5Update(&md5, data, len);
MD5Final(&md5, md5_value);
for(i = ; i < MD5_SIZE; i++)
{
snprintf(md5_str + i*, +, "%02x", md5_value[i]);
}
md5_str[MD5_STR_LEN] = '\0'; // add end
} #if 0
int Compute_file_md5(const char *file_path, char *md5_str)
{
int i;
int fd;
int ret;
unsigned char data[READ_DATA_SIZE];
unsigned char md5_value[MD5_SIZE];
MD5_CTX md5; fd = open(file_path, O_RDONLY);
if (- == fd)
{
perror("open");
return -;
} // init md5
MD5Init(&md5); while ()
{
ret = read(fd, data, READ_DATA_SIZE);
if (- == ret)
{
perror("read");
return -;
} MD5Update(&md5, data, ret); if ( == ret || ret < READ_DATA_SIZE)
{
break;
}
} close(fd); MD5Final(&md5, md5_value); for(i = ; i < MD5_SIZE; i++)
{
snprintf(md5_str + i*, +, "%02x", md5_value[i]);
}
md5_str[MD5_STR_LEN] = '\0'; // add end return ;
}
#endif

C语言实现MD5校验的更多相关文章

  1. Android MD5校验码的生成与算法实现

    在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数.然后将此 128 位计 ...

  2. 文件夹进行MD5校验的实现算法

    每份相同数据(文件夹)都可以生成一份唯一的md5校验文件,我们可以通过直接校验整个数据文件夹的方法来确定数据是否有误. 1.针对整个文件夹生成md5校验文件方法: 以data文件夹为例,我们需要得到d ...

  3. Java 自带MD5 校验文件

    http://www.iteye.com/topic/1127319 前天第一次发表博客到论坛,关于Java文件监控一文,帖子地址在:http://www.iteye.com/topic/112728 ...

  4. C# 获取文件MD5校验码

    using System; using System.IO; using System.Security.Cryptography; using System.Text; public class M ...

  5. 文件MD5校验

    1. 以前记得是在 msdn.itellyou.cn 上下载的 MD5 校验工具,应该是 IHasher,但是现在 msdn.itellyou.cn 上搜不到这个工具了... 2.

  6. 三、Socket之UDP异步传输文件-多文件传输和文件MD5校验

    本文接着上一篇文章二.Socket之UDP异步传输文件,在上一篇文章的基础上实现多文件的传输和文件传输完成后进行完整性校验. 要实现多文件的传输,必须要对文(2)中发送文件的数据格式进行改进,必须加入 ...

  7. MD5校验

    好久没有写随笔了,正好这两天可以休整一下,借此机会总结下最近使用python的小体会. 个人体会文件校验在下载文件时使用较多,在linux下最简单的实现方式就是: 1 $ md5sum filenam ...

  8. Java 获取 文件md5校验码

    讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个 ...

  9. MD5校验及其c实现

    那么MD5校验是什么? 一般软件或者说文件都有自己的固定文件格式或者架构信息,说简单一点就是.”世界上没有完全相同的2片叶子” ,因为MD5是一种不可逆的加密算法. 那么对于某些网上公开下载的软件,视 ...

随机推荐

  1. 分布式存储ceph--osd故障硬盘更换(6)

    正常状态:

  2. A股委托类型

    上海交易所于2006年8月7日启用了两种类型的市价委托,分别为:“最优五档即时成交剩余撤销”.“最优五档即时成交剩余转限价”. 深圳证券交易所启用了“对手方最优价格委托”.“本方最优价格委托”.“最优 ...

  3. eNSP路由器输出 '#' 无法启动的一种解决方法

    试过网上的改virtulboxIP.关防火墙.改兼容性等方法,都不成功.后来发现通过改变选择路由器的型号可以启动. 如果对路由器没有特殊需求,可以选择型号数字较小的试一下(最低可以选择Router).

  4. epoll 数据库安装以及相关概念

    epoll select 只能同时处理1024个客户端, 多线程会遇到资源瓶颈,什么才是解决高并发最有效的方式呢 linux中提供了epoll 这种多路复用的IO模型,注意其他平台没有相应的实现 所以 ...

  5. 论文阅读 | Tackling Adversarial Examples in QA via Answer Sentence Selection

    核心思想 基于阅读理解中QA系统的样本中可能混有对抗样本的情况,在寻找答案时,首先筛选出可能包含答案的句子,再做进一步推断. 方法 Part 1 given: 段落C   query Q 段落切分成句 ...

  6. udb主从不同步排错

    Last_SQL_Errno:1032Last_SQL_Error:Could not execute Update_rows event on table oride_data.data_syste ...

  7. [转帖]socks5 协议简介

    socks5 协议简介 http://zhihan.me/network/2017/09/24/socks5-protocol/ 什么是socks5 或许你没听说过socks5,但你一定听说过Shad ...

  8. C++多线程基础学习笔记(九)

    一.std::atomic续谈 上一章说到std::atomic是针对一个变量的,这里补充一下针对的变量操作一般是++,+=,--,&=等等运算 .以下这种不可取:a=a+1; 二.std:: ...

  9. spark内核篇-任务调度机制

    在生产环境中,spark 部署方式一般都是 yarn-cluster 模式,本文针对该模式进行讲解,当然大体思路也适用于其他模式 基础概念 一个 spark 应用包含 job.stage.task 三 ...

  10. centos服务器之间相互挂载(samba)

    前提:假设A服务器ip为:192.168.1.101 ,B服务器ip为:192.168.1.102现在要求把A服务器的/mnt/test 路径下的文件夹 共享到B服务器的/home/ceshi 下. ...