md5加密算法c语言版

from: http://blog.sina.com.cn/s/blog_693de6100101kcu6.html

注:以下是md5加密算法c语言版(16/32位)

---------------------------------------------------

网上找到的md5函数的实现,包括三个文件,依次如下:

头文件 TL_MD5.h

 1 [cpp] 2 #ifndef MD5_H  3 #define MD5_H  4   5 typedef struct  6 {  7     unsigned int count[2];  8     unsigned int state[4];  9     unsigned char buffer[64];
10 }MD5_CTX;
11
12
13 #define F(x,y,z) ((x & y) | (~x & z))
14 #define G(x,y,z) ((x & z) | (y & ~z))
15 #define H(x,y,z) (x^y^z)
16 #define I(x,y,z) (y ^ (x | ~z))
17 #define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))
18 #define FF(a,b,c,d,x,s,ac) \
19 { \
20     a += F(b,c,d) + x + ac; \
21     a = ROTATE_LEFT(a,s); \
22     a += b; \
23 }
24 #define GG(a,b,c,d,x,s,ac) \
25 { \
26     a += G(b,c,d) + x + ac; \
27     a = ROTATE_LEFT(a,s); \
28     a += b; \
29 }
30 #define HH(a,b,c,d,x,s,ac) \
31 { \
32     a += H(b,c,d) + x + ac; \
33     a = ROTATE_LEFT(a,s); \
34     a += b; \
35 }
36 #define II(a,b,c,d,x,s,ac) \
37 { \
38     a += I(b,c,d) + x + ac; \
39     a = ROTATE_LEFT(a,s); \
40     a += b; \
41 }
42 void MD5Init(MD5_CTX *context);
43 void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);
44 void MD5Final(MD5_CTX *context,unsigned char digest[16]);
45 void MD5Transform(unsigned int state[4],unsigned char block[64]);
46 void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len);
47 void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len);
48
49 #endif  

C/C++语言实现文件 TL_MD5.c 或者 TL_MD5.cpp

  1 [cpp] 2 #include <string.h>3 #include "md5.h"  4   5 unsigned char PADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  6 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  7 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  8 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  9   10 void MD5Init(MD5_CTX *context)  11 {  12     context->count[0] = 0;  13     context->count[1] = 0;  14     context->state[0] = 0x67452301;  15     context->state[1] = 0xEFCDAB89;  16     context->state[2] = 0x98BADCFE;  17     context->state[3] = 0x10325476;  18 }  19 void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen)  20 {  21     unsigned int i = 0,index = 0,partlen = 0;  22     index = (context->count[0] >> 3) & 0x3F;  23     partlen = 64 - index;  24     context->count[0] += inputlen << 3;  25     if(context->count[0] < (inputlen << 3))  26         context->count[1]++;  27     context->count[1] += inputlen >> 29;  28   29     if(inputlen >= partlen)  30     {  31         memcpy(&context->buffer[index],input,partlen);  32         MD5Transform(context->state,context->buffer);  33         for(i = partlen;i+64 <= inputlen;i+=64)  34             MD5Transform(context->state,&input[i]);  35         index = 0;          36     }    37     else  38     {  39         i = 0;  40     }  41     memcpy(&context->buffer[index],&input[i],inputlen-i);  42 }  43 void MD5Final(MD5_CTX *context,unsigned char digest[16])  44 {  45     unsigned int index = 0,padlen = 0;  46     unsigned char bits[8];  47     index = (context->count[0] >> 3) & 0x3F;  48     padlen = (index < 56)?(56-index):(120-index);  49     MD5Encode(bits,context->count,8);  50     MD5Update(context,PADDING,padlen);  51     MD5Update(context,bits,8);  52     MD5Encode(digest,context->state,16);  53 }  54 void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len)  55 {  56     unsigned int i = 0,j = 0;  57     while(j < len)  58     {  59         output[j] = input[i] & 0xFF;    60         output[j+1] = (input[i] >> 8) & 0xFF;  61         output[j+2] = (input[i] >> 16) & 0xFF;  62         output[j+3] = (input[i] >> 24) & 0xFF;  63         i++;  64         j+=4;  65     }  66 }  67 void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len)  68 {  69     unsigned int i = 0,j = 0;  70     while(j < len)  71     {  72         output[i] = (input[j]) |  73             (input[j+1] << 8) |  74             (input[j+2] << 16) |  75             (input[j+3] << 24);  76         i++;  77         j+=4;   78     }  79 }  80 void MD5Transform(unsigned int state[4],unsigned char block[64])  81 {  82     unsigned int a = state[0];  83     unsigned int b = state[1];  84     unsigned int c = state[2];  85     unsigned int d = state[3];  86     unsigned int x[64];  87     MD5Decode(x,block,64);  88     FF(a, b, c, d, x[ 0], 7, 0xd76aa478);   89     FF(d, a, b, c, x[ 1], 12, 0xe8c7b756);   90     FF(c, d, a, b, x[ 2], 17, 0x242070db);   91     FF(b, c, d, a, x[ 3], 22, 0xc1bdceee);   92     FF(a, b, c, d, x[ 4], 7, 0xf57c0faf);   93     FF(d, a, b, c, x[ 5], 12, 0x4787c62a);   94     FF(c, d, a, b, x[ 6], 17, 0xa8304613);   95     FF(b, c, d, a, x[ 7], 22, 0xfd469501);   96     FF(a, b, c, d, x[ 8], 7, 0x698098d8);   97     FF(d, a, b, c, x[ 9], 12, 0x8b44f7af);   98     FF(c, d, a, b, x[10], 17, 0xffff5bb1);   99     FF(b, c, d, a, x[11], 22, 0x895cd7be);
100     FF(a, b, c, d, x[12], 7, 0x6b901122);
101     FF(d, a, b, c, x[13], 12, 0xfd987193);
102     FF(c, d, a, b, x[14], 17, 0xa679438e);
103     FF(b, c, d, a, x[15], 22, 0x49b40821);
104
105
106     GG(a, b, c, d, x[ 1], 5, 0xf61e2562);
107     GG(d, a, b, c, x[ 6], 9, 0xc040b340);
108     GG(c, d, a, b, x[11], 14, 0x265e5a51);
109     GG(b, c, d, a, x[ 0], 20, 0xe9b6c7aa);
110     GG(a, b, c, d, x[ 5], 5, 0xd62f105d);
111     GG(d, a, b, c, x[10], 9,  0x2441453);
112     GG(c, d, a, b, x[15], 14, 0xd8a1e681);
113     GG(b, c, d, a, x[ 4], 20, 0xe7d3fbc8);
114     GG(a, b, c, d, x[ 9], 5, 0x21e1cde6);
115     GG(d, a, b, c, x[14], 9, 0xc33707d6);
116     GG(c, d, a, b, x[ 3], 14, 0xf4d50d87);
117     GG(b, c, d, a, x[ 8], 20, 0x455a14ed);
118     GG(a, b, c, d, x[13], 5, 0xa9e3e905);
119     GG(d, a, b, c, x[ 2], 9, 0xfcefa3f8);
120     GG(c, d, a, b, x[ 7], 14, 0x676f02d9);
121     GG(b, c, d, a, x[12], 20, 0x8d2a4c8a);
122
123
124     HH(a, b, c, d, x[ 5], 4, 0xfffa3942);
125     HH(d, a, b, c, x[ 8], 11, 0x8771f681);
126     HH(c, d, a, b, x[11], 16, 0x6d9d6122);
127     HH(b, c, d, a, x[14], 23, 0xfde5380c);
128     HH(a, b, c, d, x[ 1], 4, 0xa4beea44);
129     HH(d, a, b, c, x[ 4], 11, 0x4bdecfa9);
130     HH(c, d, a, b, x[ 7], 16, 0xf6bb4b60);
131     HH(b, c, d, a, x[10], 23, 0xbebfbc70);
132     HH(a, b, c, d, x[13], 4, 0x289b7ec6);
133     HH(d, a, b, c, x[ 0], 11, 0xeaa127fa);
134     HH(c, d, a, b, x[ 3], 16, 0xd4ef3085);
135     HH(b, c, d, a, x[ 6], 23,  0x4881d05);
136     HH(a, b, c, d, x[ 9], 4, 0xd9d4d039);
137     HH(d, a, b, c, x[12], 11, 0xe6db99e5);
138     HH(c, d, a, b, x[15], 16, 0x1fa27cf8);
139     HH(b, c, d, a, x[ 2], 23, 0xc4ac5665);
140
141
142     II(a, b, c, d, x[ 0], 6, 0xf4292244);
143     II(d, a, b, c, x[ 7], 10, 0x432aff97);
144     II(c, d, a, b, x[14], 15, 0xab9423a7);
145     II(b, c, d, a, x[ 5], 21, 0xfc93a039);
146     II(a, b, c, d, x[12], 6, 0x655b59c3);
147     II(d, a, b, c, x[ 3], 10, 0x8f0ccc92);
148     II(c, d, a, b, x[10], 15, 0xffeff47d);
149     II(b, c, d, a, x[ 1], 21, 0x85845dd1);
150     II(a, b, c, d, x[ 8], 6, 0x6fa87e4f);
151     II(d, a, b, c, x[15], 10, 0xfe2ce6e0);
152     II(c, d, a, b, x[ 6], 15, 0xa3014314);
153     II(b, c, d, a, x[13], 21, 0x4e0811a1);
154     II(a, b, c, d, x[ 4], 6, 0xf7537e82);
155     II(d, a, b, c, x[11], 10, 0xbd3af235);
156     II(c, d, a, b, x[ 2], 15, 0x2ad7d2bb);
157     II(b, c, d, a, x[ 9], 21, 0xeb86d391);
158     state[0] += a;
159     state[1] += b;
160     state[2] += c;
161     state[3] += d;
162 }  

md5函数测试代码文件

 1 [cpp] 2 #include   3 #include   4 #include   5 #include "md5.h"  6   7 int main(int argc, char *argv[])  8 {  9     MD5_CTX md5;
10     MD5Init(&md5);
11     int i;
12     unsigned char encrypt[] ="admin";//21232f297a57a5a743894a0e4a801fc3
13     unsigned char decrypt[16];
14     MD5Update(&md5,encrypt,strlen((char *)encrypt));
15     MD5Final(&md5,decrypt);
16     printf("加密前:%s\n加密后16位:",encrypt);
17     for(i=4;i<12;i++)
18     {
19         printf("02x",decrypt[i]);  //02x前需要加上 %
20     }
21
22     printf("\n加密前:%s\n加密后32位:",encrypt);
23     for(i=0;i<16;i++)
24     {
25         printf("02x",decrypt[i]);  //02x前需要加上 %
26     }
27
28     getchar();
29
30     return 0;
31 }  

MD5加密常用字符

7a57a5a743894a0e admin(16位MD5小写加密)
972130B75066C825 ADMIN(16位MD5大写加密)
21232f297a57a5a743894a0e4a801fc3 admin(32位MD5小写加密)
73ACD9A5972130B75066C82595A1FAE3 ADMIN(32位MD5大写加密)
49ba59abbe56e057 123456(16位MD5小写加密)
e10adc3949ba59abbe56e057f20f883e 123456(32位MD5小写加密)
469e80d32c0559f8 admin888(16位MD5小写加密)
2299413865C28A35 ADMIN888(16位MD5大写加密)
7fef6171469e80d32c0559f88b377245 admin888(32位MD5小写加密)
A1F63A962299413865C28A3593D359B0 ADMIN888(32位MD5大写加密)

md5知识扫盲

MD5:是一个散列算法,但非加密算法(因为没有密钥)
MD5是一种单向散列函数,单向散列函数的作用是将任何长度的一段数据散列成固定长度。常用于生成消息认证码等等,可以与非对称算法一起用于数字签名。
标准见http://www.ietf.org/rfc/rfc1321.txt

在线MD5计算 http://www.cmd5.com/

md5加密算法c语言版相关推荐

  1. php md5加密算法源码,MD5加密和哈希算法

    MD5加密算法为现在应用最广泛的哈希算法之一,该算法广泛应用于互联网网站的用户文件加密,能够将用户密码加密为128位的长整数.数据库并不明文存储用户密码,而是在用户登录时将输入密码字符串进行MD5加密 ...

  2. md5加密算法原理及其GO语言实现

    md5加密算法原理及其GO语言实现 MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值 ...

  3. 文件Md5计算(C语言版)

    文件Md5计算(C语言版) 这是一个参考了网上很多人的C语言以及C++版本的计算工具而制作的,已对其优化了一部分,加了新功能:如果能计算出有效的Md5则自动复制到剪贴板,并且支持拖拽文件到窗口上,完全 ...

  4. C语言实现MD5加密算法

    转载声明:http://blog.csdn.net/haroroda/article/details/45935099 这次我分享的是MD5加密算法.其实MD5这个大名在还没上密码学课之前我就听说过了 ...

  5. RSA加密——go语言版

    RSA加密--go语言版 源起 公钥和私钥格式关系 公钥 私钥 go语言生成公私钥 go加载私钥 pkcs1 pkcs8 go加载公钥 go进行rsa加密和验签 openssl生成的公私钥 去掉私钥的 ...

  6. MD5加密算法与SHA加密算法

    2.MD5加密 2.1 概述 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为R ...

  7. 简要分析用MD5加密算法加密信息(如有疑问,敬请留言)

    一.引言 最近看了媒体的一篇关于"网络上公开叫卖个人隐私信息"报导,不法分子通过非法手段获得的个人隐私信息,其详细.准确程度简直令人瞠口结舌.在互联网飞速发展的现在,我们不难想到, ...

  8. MD5加密算法及Java实现

    MD5加密算法及Java实现 上个学期在学数据库的时候,大作业是用Java Web+MySQL实现一个简易的系统,其中老师就提到了MD5算法,用来将用户提交的密码进行加密后放在数据库中,以防被泄露.在 ...

  9. rsa2048加密算法c语言代码,rsa加密算法c语言代码

    如何用C语言实现RSA算法? 上学期交的作业,已通过老师在运行时间上的测试 #include #include unsigned long prime1,prime2,ee; unsigned lon ...

  10. 漫画形式,通俗易懂地讲述什么是MD5加密算法

    本文将通过漫画的形式来通俗易懂的讲述什么是MD5加密算法 (Message Digest Algorithm MD5(中文名为消息摘要算法第五版)),MD5加密算法的底层原理以及MD5加密算法的破解算 ...

最新文章

  1. Django博客系统(文章模型)
  2. python pcl学习入门
  3. C# 打印多页tif
  4. IntentService用法
  5. 通过超分辨率重构来提高二维码的对比度
  6. 架构风格与基于网络的软件架构设计
  7. Sensoro告诉你ibeacon为什么这么火?
  8. 在java中创建线程有几种办法_Java中创建线程的几种主流方式
  9. 软件测试宝藏图_tSQLt –数据库单元测试中被遗忘的宝藏
  10. 重装 Windows 7 系统后电脑出现乱码怎么办
  11. 智能优化算法总结-数字孪生下的车间调度-APS预告
  12. rabbitMQ windows 下安装
  13. 基于SSM开发智夫子在线考试系统
  14. unity3d烘焙教程 持续更新中【2020】
  15. 【C语言】 --- 段错误
  16. 如何在线批量将JPG图片转Word文件
  17. Windows系统内置测试工具(winsat)
  18. bootstrap 4 在VS中的使用
  19. html折叠新闻网页版本号,数字报纸HTML版本
  20. 报错:Now you can provide attr `wx:key` for a `wx:for` to improve performance

热门文章

  1. 以阿尔兹海默症为例:深度解析AI+慢病商业模式
  2. 软件工程中英对照术语表
  3. 三维空间坐标系变换——旋转矩阵
  4. 阿里云数据库迁移手记
  5. 《Python语言程序设计基础》嵩天著-第5章程序全练习题答案
  6. 比亚迪半导体IPO再生波折:又被中止审核 红杉小米是股东
  7. qq服务器维护到什么时候,qq扩列功能怎么找不到了2021
  8. MySQL主从配置(Django实现主从配置读写分离)
  9. mysql主从配置(超简单)
  10. 2048游戏回顾三:自定义Dialog和ProgressBar