md5整理

来源:互联网 发布:软件需求文档ppt 编辑:程序博客网 时间:2024/05/20 15:57

MD5 是一个非常常用的算法,用于数字验证等很多方面,但是很多人只是想用这个算法,并不要求很了解其中的算法.其中也包括我在内,不过其实我也有适当的了解的.这里我就从Linux 2.6.36 中摘取出MD5部分并适当的修改了下,希望能对新手们有帮助,下面贴出代码:

MD5.h

#ifndef __HH_MD5_H_HH__#define __HH_MD5_H_HH__#include <string.h>#define MD5_DIGEST_SIZE16#define MD5_HMAC_BLOCK_SIZE64#define MD5_BLOCK_WORDS16#define MD5_HASH_WORDS4typedef unsigned charu8;typedef unsigned shortu16;typedef unsigned intu32;typedef unsigned long intu64;typedef struct md5_state {u32 hash[MD5_HASH_WORDS];u32 block[MD5_BLOCK_WORDS];u64 byte_count;}MD5_STATE;/*名称:md5_init功能:初始化MD5参数:输入:1:struct md5_state *desc;MD5结构体返回值:return 0;*/int md5_init(struct md5_state *desc);/*名称:md5_update功能:初始化MD5参数:输入:1:struct md5_state *descMD5结构体2:const u8 *data数据指针3:unsigned int len数据长度返回值:return 0;*/int md5_update(struct md5_state *desc, const u8 *data, unsigned int len);/*名称:md5_final功能:获取结果参数:输入:1:struct md5_state *descMD5结构体输出:2:u8 *out结果.长度为16eg.u8 out[16];返回值:return 0;*/int md5_final(struct md5_state *desc, u8 *out);/*名称:md5_cale功能:计算data指向的数据的MD5值,直接返回在out数组内参数:输入:1:const u8 *data数据指针2:unsigned int len数据长度输出:3:u8 *out结果.长度为16eg.u8 out[16];返回值:return 0;*/int md5_cale(const u8 *data, unsigned int len,u8 *out);#endif md5.c/*文件md5.c日期:2012-04-11 20:09作者:LvApp功能:MD5加密用法:1:实例变量 struct md5_state state;2:初始化md5_init(&state);3:MS5计算md5_update(&state,(u8*)"",strlen(""));4:结果md5_final(&state,res);维护:2012-04-11 20:091:从Linux内核中移植出来结果:测试正常2012-04-11 20:541:增加md5_calc函数接口,用于直接计算并返回.方便计算结果:测试正常*/

MD5.c

#include "md5.h"#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))#define MD5STEP(f, w, x, y, z, in, s) \(w += f(x, y, z) + in, w = (w<<s | w>>(32-s)) + x)/*名称:md5_transform功能:MD5四轮运算,用于完成MD5主要计算部分参数:输入:1:u32 *hash, 密钥2:u32 const *in加密数据返回值:无*/void md5_transform(u32 *hash, u32 const *in){u32 a, b, c, d;a = hash[0];b = hash[1];c = hash[2];d = hash[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);hash[0] += a;hash[1] += b;hash[2] += c;hash[3] += d;}/*名称:md5_init功能:初始化MD5参数:输入:1:struct md5_state *desc;MD5结构体返回值:return 0;*/int md5_init(struct md5_state *desc){struct md5_state *mctx = desc;mctx->hash[0] = 0x67452301;mctx->hash[1] = 0xefcdab89;mctx->hash[2] = 0x98badcfe;mctx->hash[3] = 0x10325476;mctx->byte_count = 0;return 0;}/*名称:md5_update功能:初始化MD5参数:输入:1:struct md5_state *descMD5结构体2:const u8 *data数据指针3:unsigned int len数据长度返回值:return 0;*/int md5_update(struct md5_state *desc, const u8 *data, unsigned int len){struct md5_state *mctx = desc;const u32 avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f);mctx->byte_count += len;if (avail > len) {memcpy((char *)mctx->block + (sizeof(mctx->block) - avail),data, len);return 0;}memcpy((char *)mctx->block + (sizeof(mctx->block) - avail),       data, avail);md5_transform(mctx->hash, mctx->block);data += avail;len -= avail;while (len >= sizeof(mctx->block)) {memcpy(mctx->block, data, sizeof(mctx->block));md5_transform(mctx->hash, mctx->block);data += sizeof(mctx->block);len -= sizeof(mctx->block);}memcpy(mctx->block, data, len);return 0;}/*名称:md5_final功能:获取结果参数:输入:1:struct md5_state *descMD5结构体输出:2:u8 *out结果.长度为16eg.u8 out[16];返回值:return 0;*/int md5_final(struct md5_state *desc, u8 *out){struct md5_state *mctx = desc;const unsigned int offset = mctx->byte_count & 0x3f;char *p = (char *)mctx->block + offset;int padding = 56 - (offset + 1);*p++ = (char)0x80;if (padding < 0) {memset(p, 0x00, padding + sizeof (u64));md5_transform(mctx->hash, mctx->block);p = (char *)mctx->block;padding = 56;}memset(p, 0, padding);mctx->block[14] = mctx->byte_count << 3;mctx->block[15] = mctx->byte_count >> 29;md5_transform(mctx->hash, mctx->block);memcpy(out, mctx->hash, sizeof(mctx->hash));memset(mctx, 0, sizeof(*mctx));return 0;}/*名称:md5_cale功能:计算data指向的数据的MD5值,直接返回在out数组内参数:输入:1:const u8 *data数据指针2:unsigned int len数据长度输出:3:u8 *out结果.长度为16eg.u8 out[16];返回值:return 0;*/int md5_cale(const u8 *data, unsigned int len,u8 *out){struct md5_state state;md5_init(&state);md5_update(&state,data,len);md5_final(&state,out);return 0;}

如若需要代码,请留下邮箱,我会及时发送给你...

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝生产许可编号一定要填怎么办 官网下单被砍单怎么办美卡美私 大学网络课程挂了怎么办 如果二审超过6个月还不判怎么办? sci的proof时间超了怎么办 合肥电大考试没过怎么办 社保账号密码忘记了怎么办 住房公积金账号密码忘记了怎么办 燃气费单子丢了怎么办 商标初审公告期内被异议怎么办 手被山药痒了怎么办 9个月宝宝不吃奶粉怎么办 八个月宝宝拉粑粑费劲怎么办? 两个月小孩不吃奶粉怎么办 两个月的小孩不吃奶粉怎么办 两个多月宝宝不吃奶怎么办 三个多月宝宝不爱吃奶怎么办 4个月宝宝不吃奶怎么办 5个月宝宝不爱吃奶怎么办 九个月宝宝一直流鼻涕怎么办 九个月宝宝一直咳嗽怎么办 宝宝3岁不爱喝水怎么办 1岁宝宝不肯喝水怎么办 三个月宝宝体检说严重缺钙怎么办 1岁半宝宝不吃药怎么办 1岁宝宝抗拒吃药怎么办 六个月宝宝不爱吃辅食怎么办 宝宝九个月了不爱吃辅食怎么办 八个月宝宝不喜欢吃辅食怎么办 小孩米粉吃多了怎么办 宝宝四个月了奶水不足怎么办 4个月奶水不足怎么办 孩子不吃奶粉母乳又不够怎么办 宝宝吃母乳上火了怎么办 5个月宝宝厌奶期怎么办 九个月宝宝不吃奶粉怎么办 第5个月奶不够吃怎么办 九个月的宝宝不吃奶粉怎么办 9个月宝宝不肯吃怎么办 11个月不吃辅食怎么办 4个月母乳不足怎么办