网上找到的实现md5函数代码,包括一个头文件md5.h和一个源文件md5.c,用下面的测试代码test.c测试通过,各文件依次如下:

.h文件——md5.h

#ifndef MD5_H
#define MD5_Htypedef struct
{unsigned int count[2];unsigned int state[4];unsigned char buffer[64];
}MD5_CTX;#define F(x,y,z) ((x & y) | (~x & z))
#define G(x,y,z) ((x & z) | (y & ~z))
#define H(x,y,z) (x^y^z)
#define I(x,y,z) (y ^ (x | ~z))
#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))
#define FF(a,b,c,d,x,s,ac) \{ \a += F(b,c,d) + x + ac; \a = ROTATE_LEFT(a,s); \a += b; \}
#define GG(a,b,c,d,x,s,ac) \{ \a += G(b,c,d) + x + ac; \a = ROTATE_LEFT(a,s); \a += b; \}
#define HH(a,b,c,d,x,s,ac) \{ \a += H(b,c,d) + x + ac; \a = ROTATE_LEFT(a,s); \a += b; \}
#define II(a,b,c,d,x,s,ac) \{ \a += I(b,c,d) + x + ac; \a = ROTATE_LEFT(a,s); \a += b; \}
void MD5Init(MD5_CTX *context);
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);
void MD5Final(MD5_CTX *context,unsigned char digest[16]);
void MD5Transform(unsigned int state[4],unsigned char block[64]);
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len);
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len);#endif

.c文件——md5.c

#include <memory.h>
#include "md5.h"unsigned char PADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};void MD5Init(MD5_CTX *context)
{context->count[0] = 0;context->count[1] = 0;context->state[0] = 0x67452301;context->state[1] = 0xEFCDAB89;context->state[2] = 0x98BADCFE;context->state[3] = 0x10325476;
}
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen)
{unsigned int i = 0,index = 0,partlen = 0;index = (context->count[0] >> 3) & 0x3F;partlen = 64 - index;context->count[0] += inputlen << 3;if(context->count[0] < (inputlen << 3))context->count[1]++;context->count[1] += inputlen >> 29;if(inputlen >= partlen){memcpy(&context->buffer[index],input,partlen);MD5Transform(context->state,context->buffer);for(i = partlen;i+64 <= inputlen;i+=64)MD5Transform(context->state,&input[i]);index = 0;        }  else{i = 0;}memcpy(&context->buffer[index],&input[i],inputlen-i);
}
void MD5Final(MD5_CTX *context,unsigned char digest[16])
{unsigned int index = 0,padlen = 0;unsigned char bits[8];index = (context->count[0] >> 3) & 0x3F;padlen = (index < 56)?(56-index):(120-index);MD5Encode(bits,context->count,8);MD5Update(context,PADDING,padlen);MD5Update(context,bits,8);MD5Encode(digest,context->state,16);
}
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len)
{unsigned int i = 0,j = 0;while(j < len){output[j] = input[i] & 0xFF;  output[j+1] = (input[i] >> 8) & 0xFF;output[j+2] = (input[i] >> 16) & 0xFF;output[j+3] = (input[i] >> 24) & 0xFF;i++;j+=4;}
}
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len)
{unsigned int i = 0,j = 0;while(j < len){output[i] = (input[j]) |(input[j+1] << 8) |(input[j+2] << 16) |(input[j+3] << 24);i++;j+=4; }
}
void MD5Transform(unsigned int state[4],unsigned char block[64])
{unsigned int a = state[0];unsigned int b = state[1];unsigned int c = state[2];unsigned int d = state[3];unsigned int x[64];MD5Decode(x,block,64);FF(a, b, c, d, x[ 0], 7, 0xd76aa478); /* 1 */FF(d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */FF(c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */FF(b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */FF(a, b, c, d, x[ 4], 7, 0xf57c0faf); /* 5 */FF(d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */FF(c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */FF(b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */FF(a, b, c, d, x[ 8], 7, 0x698098d8); /* 9 */FF(d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 *//* Round 2 */GG(a, b, c, d, x[ 1], 5, 0xf61e2562); /* 17 */GG(d, a, b, c, x[ 6], 9, 0xc040b340); /* 18 */GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */GG(b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /* 20 */GG(a, b, c, d, x[ 5], 5, 0xd62f105d); /* 21 */GG(d, a, b, c, x[10], 9,  0x2441453); /* 22 */GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */GG(b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /* 24 */GG(a, b, c, d, x[ 9], 5, 0x21e1cde6); /* 25 */GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */GG(c, d, a, b, x[ 3], 14, 0xf4d50d87); /* 27 */GG(b, c, d, a, x[ 8], 20, 0x455a14ed); /* 28 */GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */GG(d, a, b, c, x[ 2], 9, 0xfcefa3f8); /* 30 */GG(c, d, a, b, x[ 7], 14, 0x676f02d9); /* 31 */GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 *//* Round 3 */HH(a, b, c, d, x[ 5], 4, 0xfffa3942); /* 33 */HH(d, a, b, c, x[ 8], 11, 0x8771f681); /* 34 */HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */HH(a, b, c, d, x[ 1], 4, 0xa4beea44); /* 37 */HH(d, a, b, c, x[ 4], 11, 0x4bdecfa9); /* 38 */HH(c, d, a, b, x[ 7], 16, 0xf6bb4b60); /* 39 */HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */HH(d, a, b, c, x[ 0], 11, 0xeaa127fa); /* 42 */HH(c, d, a, b, x[ 3], 16, 0xd4ef3085); /* 43 */HH(b, c, d, a, x[ 6], 23,  0x4881d05); /* 44 */HH(a, b, c, d, x[ 9], 4, 0xd9d4d039); /* 45 */HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */HH(b, c, d, a, x[ 2], 23, 0xc4ac5665); /* 48 *//* Round 4 */II(a, b, c, d, x[ 0], 6, 0xf4292244); /* 49 */II(d, a, b, c, x[ 7], 10, 0x432aff97); /* 50 */II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */II(b, c, d, a, x[ 5], 21, 0xfc93a039); /* 52 */II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */II(d, a, b, c, x[ 3], 10, 0x8f0ccc92); /* 54 */II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */II(b, c, d, a, x[ 1], 21, 0x85845dd1); /* 56 */II(a, b, c, d, x[ 8], 6, 0x6fa87e4f); /* 57 */II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */II(c, d, a, b, x[ 6], 15, 0xa3014314); /* 59 */II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */II(a, b, c, d, x[ 4], 6, 0xf7537e82); /* 61 */II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */II(c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /* 63 */II(b, c, d, a, x[ 9], 21, 0xeb86d391); /* 64 */state[0] += a;state[1] += b;state[2] += c;state[3] += d;
}

测试文件——test.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "md5.h"int main(int argc, char *argv[])
{int i;unsigned char encrypt[] ="admin";//21232f297a57a5a743894a0e4a801fc3unsigned char decrypt[16];    MD5_CTX md5;MD5Init(&md5);               MD5Update(&md5,encrypt,strlen((char *)encrypt));MD5Final(&md5,decrypt);        printf("加密前:%s\n加密后:",encrypt);for(i=0;i<16;i++){printf("%02x",decrypt[i]);}getchar();return 0;
}

亲身测试,发现一下问题:
1、test文件内有strlen()函数,头文件中应该引用响应的函数库#include <string.h>

执行命令:

[root@localhost md5]# gcc -g test.c md5.c -o md5

执行结果:

温馨提示:
可以用md5在线解密破解,md5解密加密网址进行测试,结果的正确与否。

参考链接:https://blog.csdn.net/xhhjin/article/details/8450686

MD5算法 —— C语言实现(字符串的加密)相关推荐

  1. openssl md5算法 —— Linux下(字符串加密、文件加密)

    理解openssl md5: OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. OpenSSL被曝出现 ...

  2. C语言实现字符串的加密和解密

    C语言文章更新目录 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C语言基础-第一个C程序 C语言基础-简单程序分 ...

  3. MD5算法C语言实现

    转自https://blog.csdn.net/wqvbjhc/article/details/7102581,作者也是网上转载的,但没标明出处. 网上找到的md5函数的代码,试了一下,可以用,记录一 ...

  4. sunday算法c语言实现,字符串搜索的Sunday算法

    比起流行的kmp算法,  Sunday不仅搜索效率上要高很多, 而且原理还特别简单易理解,  也容易实现. 字符串匹配--Sunday算法 基本思想及举例 Sunday算法由Daniel M.Sund ...

  5. c语言实现单链表逆序算法,C语言解字符串逆序和单向链表逆序问题的代码示例...

    字符串逆序上次面试碰到一个单向链表逆序的题目,幸好对字符串逆序比较熟悉,类比做出来了.字符串逆序比较简单,直接上代码: void stringReverse(char* p1,char* p2) { ...

  6. 算法 C语言 压缩字符串

    题目 给定一个字符数组chars,请使用下述算法压缩: 1.如果这个字符长度位1,直接返回 2.否则以字符+个数的形式 压缩后得到的字符出不直接返回,需要直接转储到字符数组chars中,返回该数组的新 ...

  7. 密码学系列——MD5算法理解记录

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 密码学系列--MD5算法理解记录 前言 MD5算法流程 总结 前言 主要是为了快速回忆之前工作的一些记录,不至于完全忘记.因此此处不会 ...

  8. c 语言简单字符加密,C字符串简易加密解密算法

    一. 问题描述 对一个指定的字符串进行加密之后,利用解密函数能后对密文解密显示明文信息,这里定义加密的规则:是将字符串中每个字符加上它在字符串中的位置和一个偏移值.例如:将字符串"mrsof ...

  9. c语言压缩并加密算法,C语言压缩文件和用MD5算法校验文件完整性的实例教程

    使用lzma SDK对7z文件简单解压缩有时候我们只需要单纯对lzma算法压缩的7z文件进行解压,有时需要在嵌入式设备上解压,使用p7zip虽然支持多种格式,但是不容易裁剪,使用lzma SDK是首选 ...

最新文章

  1. Leangoo敏捷项目管理软件 6.3.2卡片关联支持链接
  2. linux 卸载模块命令,Linux中module模块的编译、加载、卸载
  3. mllib java怎么调用_如何准备mllib中的训练数据
  4. 读书笔记—写给大家看的PPT设计书
  5. [Linux] 编写Dockerfile文件自动构建镜像
  6. ssm使用全注解实现增删改查案例——IDeptService
  7. DotNetNuke 框架总揽
  8. 【iCore1S 双核心板_FPGA】例程十:乘法器实验——乘法器的使用
  9. 改变维度_一个人的各种维度,哪些是可以改变的?
  10. Java的LocalDateTime与mysq的datatime数据类型匹配不了
  11. 电脑显示your pc android,新版DeX模式不再强调手机变PC,而是让Android融合PC
  12. iOS弱引用表 SideTable weak_table_t weak_entry_t
  13. 求导四则运算以及三角函数求导 Derivative formulas
  14. HQChart使用教程60-新版k线训练使用教程
  15. 自适应情侣纪念日记录网站源码
  16. 电脑打开“我的电脑”、“资源管理器”很慢的解决办法。
  17. C语言 水仙花数两种算法
  18. html cache control 设置,关于 浏览器 Cache-Control 不能设置问题。
  19. SVN使用教程:一:安装及使用
  20. Javamail使用IMAP同步QQ自定义文件夹问题

热门文章

  1. nginx中的数组结构ngx_array_t
  2. 树莓派_FTP服务器的搭建
  3. 阿里P9架构师讲解从单机至亿级流量大型网站系统架构的演进过程
  4. 聊一聊IAR的workspace文件组织
  5. 【转】秒杀系统架构分析与实战
  6. Java系列: JAVA字符串格式化-String.format()的使用(zz)
  7. Android的NDK开发(3)————JNI数据类型的详解
  8. Sumline常用快捷操作
  9. linux内核网络协议栈--linux bridge(十九)
  10. 变压器符号_变压器电路图符号大全