如有转载,请注明出处:http://blog.csdn.net/embedded_sky

作者:super_bert@csdn

C语言生成MD5校验码源码,从Linux命令源码md5sum移植,MS Windows VS2010环境可用。

头文件md5.h

#ifndef MD5_H
#define MD5_H#ifdef __alpha
typedef unsigned int uint32;
#else
typedef unsigned long uint32;
#endif#define FOPRTXT "r"struct MD5Context {uint32 buf[4];uint32 bits[2];unsigned char in[64];
};void MD5Init(struct MD5Context *context);
void MD5Update(struct MD5Context *context, unsigned char const *buf, unsigned len);
void MD5Final(unsigned char digest[16], struct MD5Context *context);
void MD5Transform(uint32 buf[4], uint32 const in[16]);/** This is needed to make RSAREF happy on some MS-DOS compilers.*/
typedef struct MD5Context MD5_CTX;/*add by super bert 2014-09-29*/
//生成文件MD5
int mdfile(FILE *fp, unsigned char *digest);int md5sum(const char *file, char *digest );void print_digest(unsigned char *p, char *md5code);#endif /* !MD5_H */

源文件md5.cpp

/** This code implements the MD5 message-digest algorithm.* The algorithm is due to Ron Rivest.  This code was* written by Colin Plumb in 1993, no copyright is claimed.* This code is in the public domain; do with it what you wish.** Equivalent code is available from RSA Data Security, Inc.* This code has been tested against that, and is equivalent,* except that you don't need to include two pages of legalese* with every copy.** To compute the message digest of a chunk of bytes, declare an* MD5Context structure, pass it to MD5Init, call MD5Update as* needed on buffers full of bytes, and then call MD5Final, which* will fill a supplied 16-byte array with the digest.*/#include "stdafx.h"#include <string.h>       /* for memcpy() */
#include "md5.h"void byteReverse(unsigned char *buf, unsigned longs);enum { UNKNOWN, MSB1st, LSB1st } byteOrder = UNKNOWN;void setByteOrder(void) {union {unsigned short int usi;unsigned char uc[2];} w;w.usi = 0x1234;if (w.uc[0] == 0x12)byteOrder = MSB1st;elsebyteOrder = LSB1st;
}#ifndef ASM_MD5
void byteReverse(unsigned char *buf, unsigned longs)
{uint32 t;if (byteOrder == UNKNOWN)setByteOrder();if (byteOrder == LSB1st)return;do {t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |((unsigned) buf[1] << 8 | buf[0]);*(uint32 *) buf = t;buf += 4;} while (--longs);
}
#endif/** Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious* initialization constants.*/
void MD5Init(struct MD5Context *ctx)
{ctx->buf[0] = 0x67452301;ctx->buf[1] = 0xefcdab89;ctx->buf[2] = 0x98badcfe;ctx->buf[3] = 0x10325476;ctx->bits[0] = 0;ctx->bits[1] = 0;
}/** Update context to reflect the concatenation of another buffer full* of bytes.*/
void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
{uint32 t;/* Update bitcount */t = ctx->bits[0];if ((ctx->bits[0] = t + ((uint32) len << 3)) < t)ctx->bits[1]++;      /* Carry from low to high */ctx->bits[1] += len >> 29;t = (t >> 3) & 0x3f;   /* Bytes already in shsInfo->data *//* Handle any leading odd-sized chunks */if (t) {unsigned char *p = (unsigned char *) ctx->in + t;t = 64 - t;if (len < t) {memcpy(p, buf, len);return;}memcpy(p, buf, t);byteReverse(ctx->in, 16);MD5Transform(ctx->buf, (uint32 *) ctx->in);buf += t;len -= t;}/* Process data in 64-byte chunks */while (len >= 64) {memcpy(ctx->in, buf, 64);byteReverse(ctx->in, 16);MD5Transform(ctx->buf, (uint32 *) ctx->in);buf += 64;len -= 64;}/* Handle any remaining bytes of data. */memcpy(ctx->in, buf, len);
}/** Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first)*/
void MD5Final(unsigned char digest[16], struct MD5Context *ctx)
{unsigned count;unsigned char *p;/* Compute number of bytes mod 64 */count = (ctx->bits[0] >> 3) & 0x3F;/* Set the first char of padding to 0x80.  This is safe since there isalways at least one byte free */p = ctx->in + count;*p++ = 0x80;/* Bytes of padding needed to make 64 bytes */count = 64 - 1 - count;/* Pad out to 56 mod 64 */if (count < 8) {/* Two lots of padding:  Pad the first block to 64 bytes */memset(p, 0, count);byteReverse(ctx->in, 16);MD5Transform(ctx->buf, (uint32 *) ctx->in);/* Now fill the next block with 56 bytes */memset(ctx->in, 0, 56);} else {/* Pad block to 56 bytes */memset(p, 0, count - 8);}byteReverse(ctx->in, 14);/* Append length in bits and transform */((uint32 *) ctx->in)[14] = ctx->bits[0];((uint32 *) ctx->in)[15] = ctx->bits[1];MD5Transform(ctx->buf, (uint32 *) ctx->in);byteReverse((unsigned char *) ctx->buf, 4);memcpy(digest, ctx->buf, 16);memset(ctx, 0, sizeof(ctx));   /* In case it's sensitive */
}#ifndef ASM_MD5/* The four core functions - F1 is optimized somewhat *//* #define F1(x, y, z) (x & y | ~x & z) */
#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))/* This is the central step in the MD5 algorithm. */
#define MD5STEP(f, w, x, y, z, data, s) \( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )/** The core of the MD5 algorithm, this alters an existing MD5 hash to* reflect the addition of 16 longwords of new data.  MD5Update blocks* the data and converts bytes into longwords for this routine.*/
void MD5Transform(uint32 buf[4], uint32 const in[16])
{register uint32 a, b, c, d;a = buf[0];b = buf[1];c = buf[2];d = buf[3];MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);buf[0] += a;buf[1] += b;buf[2] += c;buf[3] += d;
}/*add by super bert 2014-09-29*/
/*生成文件MD5 - 修改版*/
int mdfile(FILE *fp, unsigned char *digest)
{unsigned char buf[100];MD5_CTX ctx;int n;MD5Init(&ctx);/*first step*//*读取文件前100byte*/n = fread(buf, 1, sizeof(buf), fp);MD5Update(&ctx, buf, n);/*second step*//*读取文件末尾100byte*/fseek(fp, -100L, SEEK_END);n = fread(buf, 1, sizeof(buf), fp);MD5Update(&ctx, buf, n);MD5Final(digest, &ctx);if (ferror(fp)) {return -1;}return 0;
}/*add by super bert 2014-10-08*/
int md5sum(const char *file, char *md5code )
{unsigned char digest[16] = {0};FILE *fp = fopen(file, FOPRTXT);if (fp == NULL) {return -1;}if (mdfile(fp, digest)) {Printf("md5sum error!\n");fclose(fp);return -1;} print_digest(digest, md5code);fclose(fp);return 0;
}void print_digest(unsigned char *p, char *md5code)
{int i;char str[3];//char md5code[33];//strcpy(md5code,"");//memset(md5code, 0x00, sizeof(md5code));for (i = 0; i < 16; ++i){//printf("%02x", *p++);sprintf(str,"%02x", *p++);strcat(md5code,str);}
}#endif

C语言生成MD5校验码相关推荐

  1. java 文件md5校验_Java 获取 文件md5校验码

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

  2. 生成文件md5校验码可满足大于2G情况

    对于文件生成md5校验码,在实际开发中用处很大,有利于比较服务器上是否已经存在该文件,哪怕文件名不一致也无所谓. 由于存在超大文件,经过从网上查找,得到两种方法,一种是利用MappedByteBuff ...

  3. 脚本_根据 md5 校验码,检测文件是否被修改

    #!bin/bash #功能:根据 md5 校验码,检测文件是否被修改 #作者:liusingbon #本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目 ...

  4. 红帽子redhat linux 9.0官方下载地址,附MD5校验码

    红帽子redhat linux 9.0官方下载地址如下: https://archive.download.redhat.com/pub/redhat/linux/9/en/iso/i386/shri ...

  5. md5校验 java_java生成MD5校验码

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

  6. 下载的时候经常看到个MD5校验码,是什么意思

    MD5是message-digest algorithm 5(信息-摘要算法)的缩写,被广泛用于加密和解密技术上,它可以说是文件的"数字指纹".任何一个文件,无论是可执行程序.图像 ...

  7. android MD5校验码的生成与算法实现

    android MD5校验码的生成与算法实现 在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD ...

  8. 如何查看文件的md5校验码、sha1校验码和sha256校验码

    如何查看文件的md5校验码.sha1校验码和sha256校验码 本文是基于Windows 10系统和ubuntu 14.04系统环境,使用命令查看文件的md5校验码.sha1校验码和sha256校验码 ...

  9. 根据 md5 校验码,检测文件是否被修改

    根据 md5 校验码,检测文件是否被修改 #!/bin/bash #本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目录或文件 #本脚本在目标数据没有被修 ...

最新文章

  1. if condition 大于_小函数,大用处!巧用AND函数,避开IF函数嵌套
  2. 括号匹配检查c语言,c 语言 检查括号匹配 不能运行 ????
  3. 开源爬虫larbin分析
  4. 自定义权限 android,Android权限控制之自定义权限
  5. 手机ppt怎么添加页码_全网超详细的操作教程,手把手教你使用高效PPT小技巧!...
  6. 小米12比我的小米10还便宜
  7. log4js linux,日志管理 log4js
  8. 线上Go项目的Docker镜像应该怎么构建?
  9. ROS 内外网做双网卡绑定负载分流教程bonding 配置教程
  10. 悲剧,当用cywin 写Linux脚本
  11. excel两个表格数据对比_Excel表格中数据比对和查找的几种技巧
  12. 改进后的第二版Retropie树莓派掌机(二)
  13. UVALive(LA) 4487 Exclusive-OR(带权并查集)
  14. 项目管理术语英汉对照表
  15. 不入世的天才: 尼古拉·特斯拉
  16. 欧拉角与万向节死锁(Euler angle Gimbal Lock)
  17. ENVI/SARscape软件处理问题小结
  18. STM32F1与STM32CubeIDE编程实例-振动传感器驱动
  19. 数据结构中的逻辑结构以及物理结构
  20. make编译MCU(nxp1064)基于CMakeLists.txt

热门文章

  1. 关于Linux系统中的local、localdef和字符集的那些事
  2. dubbo2.7.x调用出现错误No provider available from registry localhost:9090 for service问题汇总并持续追踪
  3. 1045 Favorite Color Stripe (30分)
  4. Linux之计划任务服务crontab
  5. 【python自动化办公实例】CAD中用pyautocad简化等高线
  6. 5000个应用,每周1万次发布,携程的运维架构揭秘
  7. 【091】断锁-寻找连接点正确顺序的小游戏
  8. c语言there的用法,C语言函数(H类字母)
  9. 永磁同步电机的控制算法仿真模型 永磁同步电机的MRAS无传感器矢量控制 永磁同步电机的SMO无传感器矢量控制(反正切+锁相环)
  10. 信息系统项目管理师论文-项目整体管理