`
923723914
  • 浏览: 632641 次
文章分类
社区版块
存档分类
最新评论

md5函数C语言实现

 
阅读更多

头文件md5.h

  1. #ifndefMD5_H
  2. #defineMD5_H
  3. typedefstruct
  4. {
  5. unsignedintcount[2];
  6. unsignedintstate[4];
  7. unsignedcharbuffer[64];
  8. }MD5_CTX;
  9. #defineF(x,y,z)((x&y)|(~x&z))
  10. #defineG(x,y,z)((x&z)|(y&~z))
  11. #defineH(x,y,z)(x^y^z)
  12. #defineI(x,y,z)(y^(x|~z))
  13. #defineROTATE_LEFT(x,n)((x<<n)|(x>>(32-n)))
  14. #defineFF(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. #defineGG(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. #defineHH(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. #defineII(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. voidMD5Init(MD5_CTX*context);
  39. voidMD5Update(MD5_CTX*context,unsignedchar*input,unsignedintinputlen);
  40. voidMD5Final(MD5_CTX*context,unsignedchardigest[16]);
  41. voidMD5Transform(unsignedintstate[4],unsignedcharblock[64]);
  42. voidMD5Encode(unsignedchar*output,unsignedint*input,unsignedintlen);
  43. voidMD5Decode(unsignedint*output,unsignedchar*input,unsignedintlen);
  44. #endif

C语言文件md5.c

  1. #include<memory.h>
  2. #include"md5.h"
  3. unsignedcharPADDING[]={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. voidMD5Init(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. voidMD5Update(MD5_CTX*context,unsignedchar*input,unsignedintinputlen)
  17. {
  18. unsignedinti=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. voidMD5Final(MD5_CTX*context,unsignedchardigest[16])
  40. {
  41. unsignedintindex=0,padlen=0;
  42. unsignedcharbits[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. voidMD5Encode(unsignedchar*output,unsignedint*input,unsignedintlen)
  51. {
  52. unsignedinti=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. voidMD5Decode(unsignedint*output,unsignedchar*input,unsignedintlen)
  64. {
  65. unsignedinti=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. voidMD5Transform(unsignedintstate[4],unsignedcharblock[64])
  77. {
  78. unsignedinta=state[0];
  79. unsignedintb=state[1];
  80. unsignedintc=state[2];
  81. unsignedintd=state[3];
  82. unsignedintx[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. /*Round2*/
  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. /*Round3*/
  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. /*Round4*/
  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. }

md5函数测试代码文件

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

MD5加密常用字符

7a57a5a743894a0eadmin(16位MD5小写加密)
972130B75066C825ADMIN(16位MD5大写加密)
21232f297a57a5a743894a0e4a801fc3admin(32位MD5小写加密)
73ACD9A5972130B75066C82595A1FAE3ADMIN(32位MD5大写加密)
49ba59abbe56e057123456(16位MD5小写加密)
e10adc3949ba59abbe56e057f20f883e123456(32位MD5小写加密)
469e80d32c0559f8admin888(16位MD5小写加密)
2299413865C28A35ADMIN888(16位MD5大写加密)
7fef6171469e80d32c0559f88b377245admin888(32位MD5小写加密)
A1F63A962299413865C28A3593D359B0ADMIN888(32位MD5大写加密)


PS.md5知识扫盲

MD5:是一个具体的算法,散列算法,哈西算法,但非加密算法(因为没有密钥),可用于加密(不可逆)
MD5是一种单向散列函数,单向散列函数的作用是将任何长度的一段数据散列成固定长度。常用于生成消息认证码等等,可以与非对称算法一起用于数字签名。
标准见http://www.ietf.org/rfc/rfc1321.txt
MD5好象被国内的一个教授破解了,顺便给大家一个地址http://www.cmd5.com/,有时候应该会很方便的.:)

分享到:
评论

相关推荐

    用C语言实现MD5哈希函数

    用C语言实现MD5哈希函数,它是将文件的每一行进行MD5加密,输出一个128位的哈希值。

    md5加密算法 C语言(经过测试验证完整版)

    md5加密算法 C语言(经过测试验证完整版) 经过调试验证,与工具结果一致 MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash...

    linux c语言实现的md5加密

    linux c语言 实现的md5加密函数

    C语言实现的md5算法

    C语言实现的md5算法,可以直接使用已经封装好的函数,传出的参数为16位的字符串数组

    MD5 小写 C语言

    是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。 MD5算法具有以下特点: 1...

    C语言MD5算法实现

    C语言实现MD5,经测试验证,散列过程完全正确,可供开发者使用!

    linux下C语言实现MD5计算源码100行代码

    linux下C语言实现MD5计算源码100行代码 int main() { char md5_str[40]={0}; get_md5("./main.c",md5_str); printf("=============&gt;%s\n",md5_str); return 0; }

    C语言版本Linux环境下MD5加密函数

    C语言版本Linux环境下MD5加密函数,需要在Linux换进下运行。经测试验证,完全正确,内附带使用说明,谢谢

    C语言实现MD5加密.zip

    MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位... 本资源使用C语言实现MD5加密,可以实现数据的加密和文件的加密,不借助任何的第三方工具,便于移植。

    MD5算法实现C语言代码

    MD5算法的实现,经过测试成立,使用C语言实现,编译通过。

    用C语言实现MD4加密

    用C语言实现MD4哈希函数,它是将文件的每一行进行加密,输出一个128位的哈希值

    C语言MD5算法STM32单片机亲测可用

    lwip协议栈源码提取 链接:https://pan.baidu.com/s/1Lcwap2cC0fNd7FhY44JhPQ 提取码:w74p

    Md5加密算法_c语言

    c语言实现,md5加密算法, 加密函数:void GetMd5FromString(const char *s,char *resStr)

    c语言编写的MD5算法

    c语言编写的MD5加密,封装好的函数库,可以作为库函数使用。

    md5实现源码

    哈希函数md5 C语言实现。

    md5.zip_C语言 调用 md5_LibTomCrypt

    通过C语言编程调用libtomcrypt函数库实现MD5加密

    MD5源码(C++)

    MD5的全称是Message-digest Algorithm 5(信息-摘要算法),用于确保信息传输... MD5用的是哈希函数,在计算机网络中应用较多的不可逆加密算法有RSA公司发明的MD5算法和由美国国家技术标准研究所建议的安全散列算法SHA.

    FGL调用C语言MD5加密数据

    FGL程序调用C语言编写的函数进行MD5加密数据

    MD5加密算法(c语言)

    个人编的MD5加密程序,要想了解具体算法说明或者其他加密算法请关注我的博客----适合任何对算法理解不透彻的密码初学者和爱好者。

    C语言函数调用栈实例分析.md

    C语言函数调用栈实例分析.md

Global site tag (gtag.js) - Google Analytics