代码从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. 给data设置数据

    console.log(JSON.stringify(that.data.navigator[0].content) + "--____+" + JSON.stringify(th ...

  2. 记录一下寄几个儿的greendao数据库升级,可以说是非常菜鸡了嗯

    之前使用的greendao数据库存储服务器所有的历史推送消息,但是后来消息需要加几个新的字段 举个栗子,比如要新增红色框住的字段到数据库中: 本仙女作为一只思想成熟的菜鸡,当然是加了字段就赶紧重新往里 ...

  3. 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。

    题目描述 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数. 输入描述: 输入一个int型整数 输出描述: 按照从右向左的阅读顺序,返回一个不含重复数字的新的整数 输入例子 ...

  4. Loss is its own Reward: Self-Supervision for Reinforcement Learning

    作者用action, reward, state等当做lalbel,进行有监督训练.

  5. objective-C 的内存管理之-自动释放池(autorelease pool)

    如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候 ...

  6. SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.了解SpringBoot的基本概念 2.具体内容 在之前所建立的 SpringBoot 项目只是根据官方文档实现的一个基础程 ...

  7. Java如何创建用户自定义异常?

    在Java编程中,如何创建用户自定义异常? 此示例显示如何通过扩展Exception类来创建用户定义的异常. package com.yiibai; class MyException extends ...

  8. svn -- svn简介

    一.为什么需要SVN 你们在做中级项目中,都是采用小组合作开发的?那么说说你们在后期整合中遇到问题? 主要应用于: 1.协作开发 2.远程协作 3.版本回退 二.什么是SVN l svn全称SubVe ...

  9. Kubeadm 安装

    version 1.7.0 已解决: echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables error: faile ...

  10. Mac下给SD卡烧录树莓派系统

    1.mac 磁盘工具 抹掉sd卡 为fat 2. df -h 看清sd卡号 3. 卸载sd卡 diskutil unmount /dev/disk2s2 Volume UNTITLED on disk ...