计算 md5
代码从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的更多相关文章
- 最简单的计算MD5方法
原来写过一个计算MD5的程序,是用了一个叫MD5.pas的单元,使用起来还算简单,但还有更简单的办法,安装了indy就会有IdHashMessageDigest单元(delphi 7默认安装indy) ...
- 用python计算md5,sha1,crc32
Linux下计算md5sum,sha1sum,crc: 命令 输出 $md5sum hello f19dd746bc6ab0f0155808c388be8ff0 hello $sha1sum hel ...
- shell 批量计算MD5值
#!/bin/sh #需要计算MD5文件列表 # list=`ls` list="file list" for file in $list do file1=`` echo &qu ...
- Linux快速计算MD5和Sha1命令
Linux计算MD5和Sha1的命令 MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法 ...
- postman使用pre-request script计算md5
接口加了验签逻辑,具体是md5(salt+时间戳).被某君吐槽说测试不方便啊能不能先关掉.其实没有必要打开又关闭验签功能,postman的pre-request script功能完全可以模拟客户端加密 ...
- Windows下计算md5值
目录 Windows下计算md5值 1.linux 下计算md5值 2.Windows下计算md5值 Windows下计算md5值 1.linux 下计算md5值 [root@master yl]# ...
- 不要对md5file.read()计算md5值
最近遇到的一个问题,我使用以下代码对备份文件计算MD5值: # md5file=open("%s" % outputpath, 'rb') # md5=hashlib.md5(md ...
- 开发工具-在线计算MD5
更新记录: 2022年6月8日 更新标题. 2022年6月1日 开始. 都记在这以后就不用到处找了. 在线计算MD5 https://www.sojson.com/md5/ http://www.ip ...
- 计算 MD5值
// // MD5Value.h // iOSEdu // // Created by littest on 16/2/26. // Copyright © 2016年 littest. All ri ...
- python读取es中的所有数据并计算md5然后进行持久化
#!/usr/bin/python import threading import json import time from elasticsearch import Elasticsearch f ...
随机推荐
- ASP.NET Core 2.0使用Log4net实现记录日志功能
一.安装Log4net 1.使用Nuget包进行安装 在依赖项上面右键,选择“管理NuGet程序包”,如下图所示: 在浏览界面输入log4net,然后点击安装,如下图所示: 2.使用程序包管理器控制台 ...
- Java设计模式(8)组合模式(Composite模式)
Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树 ...
- 【Centos】【Python】【Flask】阿里云上部署一个 flask 项目
1. 安装 python3 和 pip3 参考:http://www.cnblogs.com/mqxs/p/8692870.html 2.安装 lnmpa 集成开发环境 参考:http://www.c ...
- perl学习-运算符添加引号
这个比较有意思,在其它语言中好像没有特别提到 Perl 引号运算符如下表所示. 运算符描述实例 q{ }为字符串添加单引号q{abcd} 结果为 'abcd' qq{ }为字符串添加双引号qq{abc ...
- unity-----------------------------关于WheelCollider设置或小车运动的注意事项
转载:Unity3d 汽车物理引擎 WheelCollider总结 WheelCollider总结 写了前面两篇文章,我想总结一下WheelCollider! 让我们能够更清晰的学会物理车的开发! ...
- ubuntu 系统启动异常之无登录界面和版本号启动四个点的地方卡住
zlib 搞的鬼,还没结局,由于rtmpdump 安装需要安装独立zlib库,装完后重启,完了吓一跳,卡住,尼玛这一年的代码都在里面啊!!! ldd /usr/sbin/python 查询库依赖zli ...
- EF5+MVC4系列(7) 后台SelectListItem传值给前台显示Select下拉框;后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式(ViewDate,TempDate,ViewBag,Model (实际是ViewDate.Model传值))
一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Ord ...
- [原创]Allegro 导入DXF文件,保留布好的线路信息
最近智能钥匙产品开发过程中,由于结构装配尺寸的偏差,需要对电路PCB外框OUTLINE进行缩小调整,并且USB插座定位孔改变. Allegro软件在线性绘制方面是有严重缺陷的,想绘制一个异形的板框比较 ...
- FastFel解析一个公式的步骤
FastFel 查看源码后,理解的运算步骤: 1) 创建一个 FelEngine,FelEngine fel = new FelEngineIml(); 2) 将表达式 exp 解析成为一个节点树 F ...
- C# 导出资源文件到硬盘
我把一个exe应用程序添加了资源里面, 我想,程序运行之后,点击按钮之后,就把这个资源文件导出到硬盘, 代码如下: private void button1_Click(object sender, ...