C语言实现MD5校验
根据网上资料,整理验证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校验的更多相关文章
- Android MD5校验码的生成与算法实现
在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数.然后将此 128 位计 ...
- 文件夹进行MD5校验的实现算法
每份相同数据(文件夹)都可以生成一份唯一的md5校验文件,我们可以通过直接校验整个数据文件夹的方法来确定数据是否有误. 1.针对整个文件夹生成md5校验文件方法: 以data文件夹为例,我们需要得到d ...
- Java 自带MD5 校验文件
http://www.iteye.com/topic/1127319 前天第一次发表博客到论坛,关于Java文件监控一文,帖子地址在:http://www.iteye.com/topic/112728 ...
- C# 获取文件MD5校验码
using System; using System.IO; using System.Security.Cryptography; using System.Text; public class M ...
- 文件MD5校验
1. 以前记得是在 msdn.itellyou.cn 上下载的 MD5 校验工具,应该是 IHasher,但是现在 msdn.itellyou.cn 上搜不到这个工具了... 2.
- 三、Socket之UDP异步传输文件-多文件传输和文件MD5校验
本文接着上一篇文章二.Socket之UDP异步传输文件,在上一篇文章的基础上实现多文件的传输和文件传输完成后进行完整性校验. 要实现多文件的传输,必须要对文(2)中发送文件的数据格式进行改进,必须加入 ...
- MD5校验
好久没有写随笔了,正好这两天可以休整一下,借此机会总结下最近使用python的小体会. 个人体会文件校验在下载文件时使用较多,在linux下最简单的实现方式就是: 1 $ md5sum filenam ...
- Java 获取 文件md5校验码
讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个 ...
- MD5校验及其c实现
那么MD5校验是什么? 一般软件或者说文件都有自己的固定文件格式或者架构信息,说简单一点就是.”世界上没有完全相同的2片叶子” ,因为MD5是一种不可逆的加密算法. 那么对于某些网上公开下载的软件,视 ...
随机推荐
- k8s创建资源的两种方式(5)
一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=reg ...
- SQL Server 修改默认实例
有一台服务器,里面装了两个版本的数据库,一个2008(实例名称为MSSQLSERVER),一个2017(实例名称为MSSQLSERVER01): Sql server 数据库可以安装多个数据库实例,但 ...
- springMVC获取来访地址referer
@RequestMapping("publishPost.do") public String publishPost(@Valid @ModelAttribute Post po ...
- vue添加滚动事件,解决简书Carol_笑一笑方案中vue移除滚动事件失效的问题
在写项目的时候,遇到了需要添加滚动事件的问题,在简书Carol_笑一笑这里找到了解决方案.代码如下 <script> export default { name:"vue-scr ...
- 配置nova服务使用ceph作为后端存储
在ceph监视器上执行 1.创建pool池 为nova服务创建pool池(因为我只有一个OSD节点,所以要将副本数设置为1) ceph osd pool create nova-vms 32 ceph ...
- jdk1.8 -- 方法推导 静态方法、实例方法、构造方法推导
一.静态方法的推导 public class MainTest { public static void main(String[] args) { // 正常情况下我们需要通过写一个consumer ...
- Jenkins+SVN持续环境搭建
需要三台不同环境的服务器,SVN.Jenkins.Tomcat 1.SVN搭建 1.Subversion服务器(SVN服务器) 2.项目对应的版本库 3.版本库中钩子程序(用于触发构建命令) 在我以前 ...
- A.Who is better?(The Preliminary Contest for ICPC Asia Xuzhou 2019)
https://nanti.jisuanke.com/t/41383 解: 斐波那契博弈+中国剩余定理. #include <bits/stdc++.h> using namespace ...
- Python-基础-文件操作-随机存取
随机存取 文件操作中,read()和write()都属于顺序存取,只能按顺序从头到尾的进行读写.实际上我们可以只访问文件中我们感兴趣的部分.对此,我们可以使用seek()和tell()方法.两种方法的 ...
- idea jar 中没有主清单属性
idea 中maven需要有插件 <build> <plugins> <plugin> <groupId>org.springframework.boo ...