代码从polarssl中扒来的,略作改动,md5.h & md5.cpp 如下

 #ifndef POLARSSL_MD5_H
#define POLARSSL_MD5_H #include <string>
#include <stdint.h> class md5
{
public:
void string_md5(const unsigned char *input, size_t ilen, unsigned char output[]); // open file failed return -1;
int file_md5(const char *path, unsigned char output[]); private:
typedef struct
{
uint32_t total[]; /*!< number of bytes processed */
uint32_t state[]; /*!< intermediate digest state */
unsigned char buffer[]; /*!< data block being processed */ unsigned char ipad[]; /*!< HMAC: inner padding */
unsigned char opad[]; /*!< HMAC: outer padding */
}
md5_context; void md5_init(md5_context *ctx); void md5_free(md5_context *ctx); void md5_starts(md5_context *ctx); void md5_update(md5_context *ctx, const unsigned char *input, size_t ilen); void md5_finish(md5_context *ctx, unsigned char output[]); void md5_process(md5_context *ctx, const unsigned char data[]);
}; #endif // POLARSSL_MD5_H
 #include "md5.h"
#include <stdio.h> /*
* 32-bit integer manipulation macros (little endian)
*/
#ifndef GET_UINT32_LE
#define GET_UINT32_LE(n,b,i) \
{ \
(n) = ( (uint32_t) (b)[(i) ] ) \
| ( (uint32_t) (b)[(i) + ] << ) \
| ( (uint32_t) (b)[(i) + ] << ) \
| ( (uint32_t) (b)[(i) + ] << ); \
}
#endif #ifndef PUT_UINT32_LE
#define PUT_UINT32_LE(n,b,i) \
{ \
(b)[(i) ] = (unsigned char) ( (n) ); \
(b)[(i) + ] = (unsigned char) ( (n) >> ); \
(b)[(i) + ] = (unsigned char) ( (n) >> ); \
(b)[(i) + ] = (unsigned char) ( (n) >> ); \
}
#endif void md5::md5_init(md5_context *ctx)
{
memset(ctx, , sizeof(md5_context));
} void md5::md5_free(md5_context *ctx)
{
if (ctx == NULL)
return; size_t n = sizeof(md5_context);
volatile unsigned char *p = (unsigned char*)ctx; while (n--) *p++ = ;
} /*
* MD5 context setup
*/
void md5::md5_starts(md5_context *ctx)
{
ctx->total[] = ;
ctx->total[] = ; ctx->state[] = 0x67452301;
ctx->state[] = 0xEFCDAB89;
ctx->state[] = 0x98BADCFE;
ctx->state[] = 0x10325476;
} void md5::md5_process(md5_context *ctx, const unsigned char data[])
{
uint32_t X[], A, B, C, D; GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, );
GET_UINT32_LE(X[], data, ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) #define P(a,b,c,d,k,s,t) \
{ \
a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
} A = ctx->state[];
B = ctx->state[];
C = ctx->state[];
D = ctx->state[]; #define F(x,y,z) (z ^ (x & (y ^ z))) P(A, B, C, D, , , 0xD76AA478);
P(D, A, B, C, , , 0xE8C7B756);
P(C, D, A, B, , , 0x242070DB);
P(B, C, D, A, , , 0xC1BDCEEE);
P(A, B, C, D, , , 0xF57C0FAF);
P(D, A, B, C, , , 0x4787C62A);
P(C, D, A, B, , , 0xA8304613);
P(B, C, D, A, , , 0xFD469501);
P(A, B, C, D, , , 0x698098D8);
P(D, A, B, C, , , 0x8B44F7AF);
P(C, D, A, B, , , 0xFFFF5BB1);
P(B, C, D, A, , , 0x895CD7BE);
P(A, B, C, D, , , 0x6B901122);
P(D, A, B, C, , , 0xFD987193);
P(C, D, A, B, , , 0xA679438E);
P(B, C, D, A, , , 0x49B40821); #undef F #define F(x,y,z) (y ^ (z & (x ^ y))) P(A, B, C, D, , , 0xF61E2562);
P(D, A, B, C, , , 0xC040B340);
P(C, D, A, B, , , 0x265E5A51);
P(B, C, D, A, , , 0xE9B6C7AA);
P(A, B, C, D, , , 0xD62F105D);
P(D, A, B, C, , , 0x02441453);
P(C, D, A, B, , , 0xD8A1E681);
P(B, C, D, A, , , 0xE7D3FBC8);
P(A, B, C, D, , , 0x21E1CDE6);
P(D, A, B, C, , , 0xC33707D6);
P(C, D, A, B, , , 0xF4D50D87);
P(B, C, D, A, , , 0x455A14ED);
P(A, B, C, D, , , 0xA9E3E905);
P(D, A, B, C, , , 0xFCEFA3F8);
P(C, D, A, B, , , 0x676F02D9);
P(B, C, D, A, , , 0x8D2A4C8A); #undef F #define F(x,y,z) (x ^ y ^ z) P(A, B, C, D, , , 0xFFFA3942);
P(D, A, B, C, , , 0x8771F681);
P(C, D, A, B, , , 0x6D9D6122);
P(B, C, D, A, , , 0xFDE5380C);
P(A, B, C, D, , , 0xA4BEEA44);
P(D, A, B, C, , , 0x4BDECFA9);
P(C, D, A, B, , , 0xF6BB4B60);
P(B, C, D, A, , , 0xBEBFBC70);
P(A, B, C, D, , , 0x289B7EC6);
P(D, A, B, C, , , 0xEAA127FA);
P(C, D, A, B, , , 0xD4EF3085);
P(B, C, D, A, , , 0x04881D05);
P(A, B, C, D, , , 0xD9D4D039);
P(D, A, B, C, , , 0xE6DB99E5);
P(C, D, A, B, , , 0x1FA27CF8);
P(B, C, D, A, , , 0xC4AC5665); #undef F #define F(x,y,z) (y ^ (x | ~z)) P(A, B, C, D, , , 0xF4292244);
P(D, A, B, C, , , 0x432AFF97);
P(C, D, A, B, , , 0xAB9423A7);
P(B, C, D, A, , , 0xFC93A039);
P(A, B, C, D, , , 0x655B59C3);
P(D, A, B, C, , , 0x8F0CCC92);
P(C, D, A, B, , , 0xFFEFF47D);
P(B, C, D, A, , , 0x85845DD1);
P(A, B, C, D, , , 0x6FA87E4F);
P(D, A, B, C, , , 0xFE2CE6E0);
P(C, D, A, B, , , 0xA3014314);
P(B, C, D, A, , , 0x4E0811A1);
P(A, B, C, D, , , 0xF7537E82);
P(D, A, B, C, , , 0xBD3AF235);
P(C, D, A, B, , , 0x2AD7D2BB);
P(B, C, D, A, , , 0xEB86D391); #undef F ctx->state[] += A;
ctx->state[] += B;
ctx->state[] += C;
ctx->state[] += D;
} /*
* MD5 process buffer
*/
void md5::md5_update(md5_context *ctx, const unsigned char *input, size_t ilen)
{
size_t fill;
uint32_t left; if (ilen == )
return; left = ctx->total[] & 0x3F;
fill = - left; ctx->total[] += (uint32_t)ilen;
ctx->total[] &= 0xFFFFFFFF; if (ctx->total[] < (uint32_t)ilen)
ctx->total[]++; if (left && ilen >= fill)
{
memcpy((void *)(ctx->buffer + left), input, fill);
md5_process(ctx, ctx->buffer);
input += fill;
ilen -= fill;
left = ;
} while (ilen >= )
{
md5_process(ctx, input);
input += ;
ilen -= ;
} if (ilen > )
{
memcpy((void *)(ctx->buffer + left), input, ilen);
}
} static const unsigned char md5_padding[] =
{
0x80, , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , ,
}; /*
* MD5 final digest
*/
void md5::md5_finish(md5_context *ctx, unsigned char output[])
{
uint32_t last, padn;
uint32_t high, low;
unsigned char msglen[]; high = (ctx->total[] >> )
| (ctx->total[] << );
low = (ctx->total[] << ); PUT_UINT32_LE(low, msglen, );
PUT_UINT32_LE(high, msglen, ); last = ctx->total[] & 0x3F;
padn = (last < ) ? ( - last) : ( - last); md5_update(ctx, md5_padding, padn);
md5_update(ctx, msglen, ); PUT_UINT32_LE(ctx->state[], output, );
PUT_UINT32_LE(ctx->state[], output, );
PUT_UINT32_LE(ctx->state[], output, );
PUT_UINT32_LE(ctx->state[], output, );
} /*
* output = MD5( input buffer )
*/
void md5::string_md5(const unsigned char *input, size_t ilen, unsigned char output[])
{
md5_context ctx; md5_init(&ctx);
md5_starts(&ctx);
md5_update(&ctx, input, ilen);
md5_finish(&ctx, output);
md5_free(&ctx);
} /*
* output = MD5( file contents )
*/
int md5::file_md5(const char *path, unsigned char output[])
{
FILE *f;
size_t n;
md5_context ctx;
unsigned char buf[]; if ((f = fopen(path, "rb")) == NULL)
return -; md5_init(&ctx);
md5_starts(&ctx); while ((n = fread(buf, , sizeof(buf), f)) > )
md5_update(&ctx, buf, n); md5_finish(&ctx, output);
md5_free(&ctx); if (ferror(f) != )
{
fclose(f);
return -;
} fclose(f);
return();
}

计算 md5的更多相关文章

  1. 最简单的计算MD5方法

    原来写过一个计算MD5的程序,是用了一个叫MD5.pas的单元,使用起来还算简单,但还有更简单的办法,安装了indy就会有IdHashMessageDigest单元(delphi 7默认安装indy) ...

  2. 用python计算md5,sha1,crc32

    Linux下计算md5sum,sha1sum,crc: 命令 输出 $md5sum hello f19dd746bc6ab0f0155808c388be8ff0  hello $sha1sum hel ...

  3. shell 批量计算MD5值

    #!/bin/sh #需要计算MD5文件列表 # list=`ls` list="file list" for file in $list do file1=`` echo &qu ...

  4. Linux快速计算MD5和Sha1命令

    Linux计算MD5和Sha1的命令 MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法 ...

  5. postman使用pre-request script计算md5

    接口加了验签逻辑,具体是md5(salt+时间戳).被某君吐槽说测试不方便啊能不能先关掉.其实没有必要打开又关闭验签功能,postman的pre-request script功能完全可以模拟客户端加密 ...

  6. Windows下计算md5值

    目录 Windows下计算md5值 1.linux 下计算md5值 2.Windows下计算md5值 Windows下计算md5值 1.linux 下计算md5值 [root@master yl]# ...

  7. 不要对md5file.read()计算md5值

    最近遇到的一个问题,我使用以下代码对备份文件计算MD5值: # md5file=open("%s" % outputpath, 'rb') # md5=hashlib.md5(md ...

  8. 开发工具-在线计算MD5

    更新记录: 2022年6月8日 更新标题. 2022年6月1日 开始. 都记在这以后就不用到处找了. 在线计算MD5 https://www.sojson.com/md5/ http://www.ip ...

  9. 计算 MD5值

    // // MD5Value.h // iOSEdu // // Created by littest on 16/2/26. // Copyright © 2016年 littest. All ri ...

  10. python读取es中的所有数据并计算md5然后进行持久化

    #!/usr/bin/python import threading import json import time from elasticsearch import Elasticsearch f ...

随机推荐

  1. Spring Cloud Config 自动刷新所有节点

    全局刷新 详细参考:<Sprin Cloud 与 Docker 微服务架构实战>p160-9.9.2节 1.使用Spring Cloud Config 客户端时,可以使用 /refresh ...

  2. r语言 列出所有变量

    你希望知道目前工作空间中存在哪些已定义的变量和函数. 解决方案 使用ls函数,或者使用ls.str函数了解每个变量更详细的信息. 讨论 ls函数可以显示当前工作空间中所有对象的名称:> x &l ...

  3. Qt中如何根据类名来实例化对象

    对于Qt 来说,是可以做到运行时,根据对象的类名字(字符串)来获得对象的实例的,这点和一些语言的反射机制是一样的. 但是在Qt中,我们需要所额外的一步,就是注册.只要做到了注册,我们就可以 自由的创建 ...

  4. Qt QTcpSocket 对连接服务器中断的不同情况进行判定

    简述 对于一个C/S结构的程序,客户端有些时候需要实时得知与服务器的连接状态.而对于客户端与服务器断开连接的因素很多,现在就目前遇到的情况进行一下总结. 分为下面六种不同情况 客户端网线断开 客户端网 ...

  5. 【转】【Html】Vuejs2.0学习之二(Render函数,createElement,vm.$slots,函数化组件,模板编译,JSX)

    1.Render函数 所以直接来到Render,本来也想跳过,发现后面的路由貌似跟它还有点关联.先来看看Render 1.1 官网一开始就看的挺懵的,不知道讲的是啥,动手试了一下,一开头讲的是Rend ...

  6. 【Centos】【Python】【Flask】阿里云上部署一个 flask 项目

    1. 安装 python3 和 pip3 参考:http://www.cnblogs.com/mqxs/p/8692870.html 2.安装 lnmpa 集成开发环境 参考:http://www.c ...

  7. 第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承

    第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...

  8. Lucene系列五:Lucene索引详解(IndexWriter详解、Document详解、索引更新)

    一.IndexWriter详解 问题1:索引创建过程完成什么事? 分词.存储到反向索引中 1. 回顾Lucene架构图: 介绍我们编写的应用程序要完成数据的收集,再将数据以document的形式用lu ...

  9. Asp.net WebApi下载文件

    1,图片 var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(stream ...

  10. 目标跟踪之meanshift---meanshift2

    均值漂移,可以对非刚性物理进行跟踪,是分参数估计,过程是迭代的过程,对光和形态不敏感,缺点是检测目标是固定的,特征不较少,模板背景没有实时更新,没有目标的位置精度预测只是梯度浓聚, 原理: 用文字标书 ...