MD5算法 C语言实现
来源:互联网 发布:桑植县启航网络咨询 编辑:程序博客网 时间:2024/06/02 08:45
MD5算法 C语言实现
实现了计算字符串和文件的MD5
算法来自百度百科
VS2013下成功编译运行,速度一般吧。。。
代码如下:
#include <stdio.h>#include <stdlib.h>#define MD5_ROTL(a,b) (MD5_tmp=(a),((MD5_tmp>>(32-b))&(0x7fffffff>>(31-b)))|(MD5_tmp<<b)) //循环左移#define MD5_F(X,Y,Z) ((X&Y)|((~X)&Z))#define MD5_G(X,Y,Z) ((X&Z)|(Y&(~Z)))#define MD5_H(X,Y,Z) (X^Y^Z)#define MD5_I(X,Y,Z) (Y^(X|(~Z)))#define MD5_FF(a,b,c,d,Mj,s,ti) a=b+MD5_ROTL((a+MD5_F(b,c,d)+Mj+ti),s)#define MD5_GG(a,b,c,d,Mj,s,ti) a=b+MD5_ROTL((a+MD5_G(b,c,d)+Mj+ti),s)#define MD5_HH(a,b,c,d,Mj,s,ti) a=b+MD5_ROTL((a+MD5_H(b,c,d)+Mj+ti),s)#define MD5_II(a,b,c,d,Mj,s,ti) a=b+MD5_ROTL((a+MD5_I(b,c,d)+Mj+ti),s)#define MD5main \{MD5_FF(a, b, c, d, M[0], 7, 0xd76aa478);\MD5_FF(d, a, b, c, M[1], 12, 0xe8c7b756);\MD5_FF(c, d, a, b, M[2], 17, 0x242070db);\MD5_FF(b, c, d, a, M[3], 22, 0xc1bdceee);\MD5_FF(a, b, c, d, M[4], 7, 0xf57c0faf);\MD5_FF(d, a, b, c, M[5], 12, 0x4787c62a);\MD5_FF(c, d, a, b, M[6], 17, 0xa8304613);\MD5_FF(b, c, d, a, M[7], 22, 0xfd469501);\MD5_FF(a, b, c, d, M[8], 7, 0x698098d8);\MD5_FF(d, a, b, c, M[9], 12, 0x8b44f7af);\MD5_FF(c, d, a, b, M[10], 17, 0xffff5bb1);\MD5_FF(b, c, d, a, M[11], 22, 0x895cd7be);\MD5_FF(a, b, c, d, M[12], 7, 0x6b901122);\MD5_FF(d, a, b, c, M[13], 12, 0xfd987193);\MD5_FF(c, d, a, b, M[14], 17, 0xa679438e);\MD5_FF(b, c, d, a, M[15], 22, 0x49b40821);\MD5_GG(a, b, c, d, M[1], 5, 0xf61e2562);\MD5_GG(d, a, b, c, M[6], 9, 0xc040b340);\MD5_GG(c, d, a, b, M[11], 14, 0x265e5a51);\MD5_GG(b, c, d, a, M[0], 20, 0xe9b6c7aa);\MD5_GG(a, b, c, d, M[5], 5, 0xd62f105d);\MD5_GG(d, a, b, c, M[10], 9, 0x02441453);\MD5_GG(c, d, a, b, M[15], 14, 0xd8a1e681);\MD5_GG(b, c, d, a, M[4], 20, 0xe7d3fbc8);\MD5_GG(a, b, c, d, M[9], 5, 0x21e1cde6);\MD5_GG(d, a, b, c, M[14], 9, 0xc33707d6);\MD5_GG(c, d, a, b, M[3], 14, 0xf4d50d87);\MD5_GG(b, c, d, a, M[8], 20, 0x455a14ed);\MD5_GG(a, b, c, d, M[13], 5, 0xa9e3e905);\MD5_GG(d, a, b, c, M[2], 9, 0xfcefa3f8);\MD5_GG(c, d, a, b, M[7], 14, 0x676f02d9);\MD5_GG(b, c, d, a, M[12], 20, 0x8d2a4c8a);\MD5_HH(a, b, c, d, M[5], 4, 0xfffa3942);\MD5_HH(d, a, b, c, M[8], 11, 0x8771f681);\MD5_HH(c, d, a, b, M[11], 16, 0x6d9d6122);\MD5_HH(b, c, d, a, M[14], 23, 0xfde5380c);\MD5_HH(a, b, c, d, M[1], 4, 0xa4beea44);\MD5_HH(d, a, b, c, M[4], 11, 0x4bdecfa9);\MD5_HH(c, d, a, b, M[7], 16, 0xf6bb4b60);\MD5_HH(b, c, d, a, M[10], 23, 0xbebfbc70);\MD5_HH(a, b, c, d, M[13], 4, 0x289b7ec6);\MD5_HH(d, a, b, c, M[0], 11, 0xeaa127fa);\MD5_HH(c, d, a, b, M[3], 16, 0xd4ef3085);\MD5_HH(b, c, d, a, M[6], 23, 0x04881d05);\MD5_HH(a, b, c, d, M[9], 4, 0xd9d4d039);\MD5_HH(d, a, b, c, M[12], 11, 0xe6db99e5);\MD5_HH(c, d, a, b, M[15], 16, 0x1fa27cf8);\MD5_HH(b, c, d, a, M[2], 23, 0xc4ac5665);\MD5_II(a, b, c, d, M[0], 6, 0xf4292244);\MD5_II(d, a, b, c, M[7], 10, 0x432aff97);\MD5_II(c, d, a, b, M[14], 15, 0xab9423a7);\MD5_II(b, c, d, a, M[5], 21, 0xfc93a039);\MD5_II(a, b, c, d, M[12], 6, 0x655b59c3);\MD5_II(d, a, b, c, M[3], 10, 0x8f0ccc92);\MD5_II(c, d, a, b, M[10], 15, 0xffeff47d);\MD5_II(b, c, d, a, M[1], 21, 0x85845dd1);\MD5_II(a, b, c, d, M[8], 6, 0x6fa87e4f);\MD5_II(d, a, b, c, M[15], 10, 0xfe2ce6e0);\MD5_II(c, d, a, b, M[6], 15, 0xa3014314);\MD5_II(b, c, d, a, M[13], 21, 0x4e0811a1);\MD5_II(a, b, c, d, M[4], 6, 0xf7537e82);\MD5_II(d, a, b, c, M[11], 10, 0xbd3af235);\MD5_II(c, d, a, b, M[2], 15, 0x2ad7d2bb);\MD5_II(b, c, d, a, M[9], 21, 0xeb86d391);\A = a += A, B = b += B, C = c += C, D = d += D;}long MD5_tmp;extern char* StrMD5(const char* str, long length, char* md5){ /* 计算字符串MD5 参数说明: str 字符串指针 length 字符串长度 md5 用于保存MD5的字符串指针 返回值为参数md5 */ char *pp; long l, i, *M, abcdtmp[4], A, B, C, D, a, b, c, d; a = A = 0x67452301, b = B = 0xEFCDAB89, c = C = 0x98BADCFE, d = D = 0x10325476; l = length + ((length % 64 > 56) ? (128 - length % 64) : (64 - length % 64)); if(!(pp = (char*)malloc((unsigned long)l))) return 0; for (i = 0; i < length; pp[i]=str[i],i++); for (pp[i++] = 128; i < l; pp[i++] = 0); *((long*)(pp + l - 8)) = length << 3; for (i = 0; i < l; i += 64){ M = (long*)pp; MD5main } free(pp); abcdtmp[0] = a, abcdtmp[1] = b, abcdtmp[2] = c, abcdtmp[3] = d; for (pp = (char*)abcdtmp, i = 0; i < 16; sprintf((md5 + 2 * i), "%02X", (unsigned char)pp[i]), i++); return md5;}extern char* FileMD5(const char* file, char* md5){ /* 计算文件MD5 参数说明: file 文件路径字符串指针 md5 用于保存MD5的字符串指针 返回值为参数md5 */ FILE* fh; char* addlp; long addlsize, j, M[16], abcdtmp[4], A, B, C, D, a, b, c, d; long long length, i, cpys; void *pp, *ppend; fh = fopen(file, "rb"); fseek(fh, 0, SEEK_END); length = _ftelli64(fh); a = A = 0x67452301, b = B = 0xEFCDAB89, c = C = 0x98BADCFE, d = D = 0x10325476; addlsize = (56 - length % 64 > 0) ? (64) : (128); if (!(addlp = (char*)malloc(addlsize))) return 0; cpys = ((length - (56 - length % 64)) > 0) ? (length - length % 64) : (0); j = (long)(length - cpys); fseek(fh, -j, SEEK_END); fread(addlp, 1, j, fh); for (addlp[j++] = 128; j < addlsize; addlp[j++] = 0); pp = addlp + addlsize - 8; *((long long *)pp) = length << 3; for (rewind(fh); 16 == fread(M, 4, 16, fh);) MD5main for (pp = addlp, ppend = addlp + addlsize; pp < ppend; (long*)pp += 16){ for (i = 0; i < 16; M[i] = ((long*)pp)[i], i++); MD5main } free(addlp);fclose(fh); abcdtmp[0] = a, abcdtmp[1] = b, abcdtmp[2] = c, abcdtmp[3] = d; for (addlp = (char*)abcdtmp, i = 0; i < 16; sprintf((md5 + 2 * i), "%02X", (unsigned char)addlp[i]), i++); return md5;}
0 0
- C语言实现MD5算法!
- MD5算法 C语言 实现
- C语言实现MD5算法
- MD5算法C语言实现
- MD5算法 C语言实现
- C语言实现MD5算法
- MD5算法的C语言实现
- C语言 MD5 算法
- MD5 C语言实现
- C#MD5算法实现
- md5算法C实现
- C实现MD5算法
- md5 算法的c语言实现及应用
- MD5 SHA1 UUID 算法的C语言实现
- MD5算法C语言实现16、32位版
- C语言之MD5算法
- md5函数C语言实现
- md5加密C语言实现
- 知识碎片之C语言
- Android中的通知Notification
- 利用itext创建PDF表格
- Android中pendingIntent的深入理解
- vs2008编译nxogre全攻略
- MD5算法 C语言实现
- Know the Difference between Mitigation plan and Contingency Plan
- BZOJ大视野 1083: [SCOI2005]繁忙的都市 解题报告
- Android ScrollView向上滑动控件顶部悬浮效果实现
- NP 问题初识
- Tomcat架构(三)
- HDU 4267 A Simple Problem with Integers
- 神舟OSCAR数据库试用手记【1】
- Python 实现网络爬虫 抓取静态网页【代码】