计算 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 ...
随机推荐
- 用source函数代替繁冗的R语言打包过程
用source函数代替繁冗的R语言打包过程 经过初级的学习和使用R语言之后我们渐渐的开始动手写自己的R语言小程序,这些小程序因为和自己的工作非常契合而变得通用性不是那么强.因此,要让它们成为一个独立的 ...
- 100 行代码实现的 JavaScript MVC 样式框架
介绍 使用过 JavaScript框架(如 AngularJS, Backbone 或者Ember)的人都很熟悉在UI(用户界面,前端)中mvc的工作机理.这些框架实现了MVC,使得在一个单页面中实现 ...
- 第三百七十八节,Django+Xadmin打造上线标准的在线教育平台—django自带的admin后台管理介绍
第三百七十八节,Django+Xadmin打造上线标准的在线教育平台—django自带的admin后台管理介绍 配置django的admin数据库管理后台 首先urls.py配置数据库后台路由映射,一 ...
- Java如何在正则表达式中匹配重复单词?
在Java编程中,如何在正则表达式中匹配重复单词? 以下示例显示了如何使用regex.Matcher类的p.matcher()方法和m.group()方法在正则表达式中搜索重复的单词. package ...
- (转)WAVE PCM 声音文件格式
WAVE文件格式是Microsoft为存储多媒体的RIFF规范的一部分.一个RIFF文件以一个文件头开始,然后是一系列的数据块.一个WAVE文件常常仅由一个WAVE块构成,WAVE块包含一个说明格式的 ...
- VMWare中Linux虚拟机设置静态IP上网的设置方法
VMWare中Linux虚拟机设置静态IP上网的设置方法 标签: vmwareLinux虚拟机securecrt静态IP上网 2016-05-18 02:30 702人阅读 评论(0) 收藏 举报 ...
- VMware安装与VMware下安装CentOS系统
1.下载安装VMware,我安装的是VMware 12.VMware从11开始不再支持32位系统,32位系统请安装VMware10. VMware官方功能特性介绍http://www.vmware.c ...
- Web APi之HttpClient注意事项以及建议
Web APi之HttpClient注意事项以及建议 前言 之前对于用SelfHost来手动实现Web API的宿主模式,似乎不是太深入,所以本篇文章我们一起来讨论关于利用HttpClient来访问W ...
- linux中wget命令
Linux系统中的wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器.wget支持HTTP,HTTPS和FTP协 ...
- glsl Dream
<-vertex-> #version varying vec2 uv; void main(void) { uv = gl_MultiTexCoord0.st; gl_Position ...