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

头文件md5.h

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

源文件md5.c

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

测试代码test.c

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include "md5.h"
    4. int main(int argc, char *argv[])
    5. {
    6. int i;
    7. unsigned char encrypt[] ="admin";//21232f297a57a5a743894a0e4a801fc3
    8. unsigned char decrypt[16];
    9. MD5_CTX md5;
    10. MD5Init(&md5);
    11. MD5Update(&md5,encrypt,strlen((char *)encrypt));
    12. MD5Final(&md5,decrypt);
    13. printf("加密前:%s\n加密后:",encrypt);
    14. for(i=0;i<16;i++)
    15. {
    16. printf("%02x",decrypt[i]);
    17. }
    18. getchar();
    19. return 0;
    20. }

C语言实现md5函数代码的更多相关文章

  1. 经常使用MD5算法代码

    经常使用的MD5算法代码日期: 2014年8月4日作者: 铁锚 MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请參考 维基百科:MD5  MD5加密后 ...

  2. [转]SQLITE3 C语言接口 API 函数简介

    SQLITE3 C语言接口 API 函数简介 说明:本说明文档属作者从接触 SQLite 开始认识的 API 函数的使用方法, 由本人翻译, 不断更新. /* 2012-05-25 */ int sq ...

  3. (转)PHP的语言结构和函数的区别

    相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等. 例子: if ( isset($user) ) { //do some thi ...

  4. Java之--Java语言基础组成—函数

    Java语言基础组成-函数 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的函数,函数 ...

  5. C语言中的函数

    C语言中的函数 目录 概述——对函数的理解 C语言中函数的定义和声明 函数允许的参数类型 函数允许的返回类型 递归 概述 由于有些代码段在编写程序的时候经常会用到,此时我们为了减少代码文件的长度和增加 ...

  6. javascript中使用md5函数

    javascript中使用md5函数 这对于js来讲本来是没有的,现在可以自己定义一个md5的函数,达到加密效果. var hexcase = 0; function hex_md5(a) { if ...

  7. 函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)

    记得刚开始工作时,一位高手告诉我说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后 ...

  8. C语言中的函数指针

    C语言中的函数指针 函数指针的概念:   函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...

  9. php入门 数据类型 运算符 语言结构语句 函数 类与面向对象

    php PHP-enabled web pages are treated just like regular HTML pages and you can create and edit them ...

随机推荐

  1. SVN的学习以及使用!

    什么是版本控制? 版本控制是记录一个或若干文件内容变化的系统.以便将来查阅特定版本修订情况. 版本控制,就像是一本历史书,记录了软件版本的迭代过程. 为什么需要"版本控制" 需要清 ...

  2. Oracle技术整理(转载)

  3. spark介绍

    什么是Spark Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hado ...

  4. hdu_5777_domino(贪心)

    题目链接:hdu_5777_domino 题意: 小白在玩一个游戏.桌子上有n张多米诺骨牌排成一列.它有k次机会,每次可以选一个还没有倒的骨牌,向左或者向右推倒.每个骨 牌倒下的时候,若碰到了未倒下的 ...

  5. htaccess 实现网址缩短

    访问 :app.xxx.com/a 解析到:app.xxx.com/index.php/app/a <IfModule mod_rewrite.c> RewriteEngine on Re ...

  6. window.open页面关闭后刷新父页面

    如题 function openWin(url,text,winInfo){ var winObj = window.open(url,text,winInfo); var loop = setInt ...

  7. mysql innobackupex备份工具

    先简单介绍一下这个工具:innobackupexinnobackupex比xtarbackup有更强的功能,它整合了xtrabackup和其他的一些功能,他不但可以全量备份/恢复,还可以基于时间的增量 ...

  8. Stm32 Bootloader整理

    Stm32 Bootloader整理 一.        基本概念 1.IAP IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User ...

  9. ng-init小解

    ng-init可有多个表达式 ng-init= "a= 1;b= 2" 在这里头定义的变量会加入scope作用域 ng-init只能加入不必要的简单逻辑,输入alert() 定义数 ...

  10. ignite服务中的bean注入为空

    在写ignite服务的时候,通常服务配置在启动文件中: <bean class="org.apache.ignite.services.ServiceConfiguration&quo ...