计算字符串的MD5值和MD5文件摘要

举报
鱼酱 发表于 2022/01/06 23:49:43 2022/01/06
【摘要】 md5.h #ifndef __MD5_INCLUDED__#define __MD5_INCLUDED__ //MD5摘要值结构体typedef struct MD5VAL_STRUCT{ unsigned int a; unsigned int b; unsigned int c; unsigned int d;} MD...

md5.h



  
  1. #ifndef __MD5_INCLUDED__
  2. #define __MD5_INCLUDED__
  3. //MD5摘要值结构体
  4. typedef struct MD5VAL_STRUCT
  5. {
  6. unsigned int a;
  7. unsigned int b;
  8. unsigned int c;
  9. unsigned int d;
  10. } MD5VAL;
  11. //计算字符串的MD5值(若不指定长度则由函数计算)
  12. MD5VAL md5(char * str, unsigned int size=0);
  13. //MD5文件摘要
  14. MD5VAL md5File(FILE * fpin);
  15. #endif







Md5.cpp


  
  1. //DEFINES for MD5
  2. #define UINT4 unsigned int
  3. /* F, G, H and I are basic MD5 functions. */
  4. #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
  5. #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
  6. #define H(x, y, z) ((x) ^ (y) ^ (z))
  7. #define I(x, y, z) ((y) ^ ((x) | (~z)))
  8. /* ROTATE_LEFT rotates x left n bits. */
  9. #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
  10. /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
  11. Rotation is separate from addition to prevent recomputation. */
  12. #define FF(a, b, c, d, x, s, ac) { \
  13. (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
  14. (a) = ROTATE_LEFT ((a), (s)); \
  15. (a) += (b); \
  16. }
  17. #define GG(a, b, c, d, x, s, ac) { \
  18. (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
  19. (a) = ROTATE_LEFT ((a), (s)); \
  20. (a) += (b); \
  21. }
  22. #define HH(a, b, c, d, x, s, ac) { \
  23. (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
  24. (a) = ROTATE_LEFT ((a), (s)); \
  25. (a) += (b); \
  26. }
  27. #define II(a, b, c, d, x, s, ac) { \
  28. (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
  29. (a) = ROTATE_LEFT ((a), (s)); \
  30. (a) += (b); \
  31. }
  32. // Constants for MD5 Transform routine.
  33. #define S11 7
  34. #define S12 12
  35. #define S13 17
  36. #define S14 22
  37. #define S21 5
  38. #define S22 9
  39. #define S23 14
  40. #define S24 20
  41. #define S31 4
  42. #define S32 11
  43. #define S33 16
  44. #define S34 23
  45. #define S41 6
  46. #define S42 10
  47. #define S43 15
  48. #define S44 21
  49. //===============
  50. #include <stdio.h>
  51. #include <string.h>
  52. #include "md5.h"
  53. //MD5摘要
  54. MD5VAL md5(char * str, unsigned int size)
  55. {
  56. if(size==0)
  57. size=strlen(str);
  58. unsigned int m=size%64;
  59. unsigned int lm=size-m; //数据整块长度
  60. unsigned int ln; //数据补位后长度
  61. if(m<56)
  62. ln=lm+64;
  63. else
  64. ln=lm+128;
  65. char * strw=new char[ln];
  66. unsigned int i;
  67. //复制原字串到缓冲区strw
  68. for(i=0;i<size;i++)
  69. strw[i]=str[i];
  70. //补位
  71. strw[i++]=(char)0x80;
  72. for(i;i<ln-8;i++)
  73. strw[i]=0x00;
  74. //补长度
  75. unsigned int * x=(unsigned int *)(strw+i);
  76. *(x++)=size<<3;
  77. *(x++)=size>>29;
  78. //初始化MD5参数
  79. MD5VAL val={0x67452301,0xefcdab89,0x98badcfe,0x10325476};
  80. unsigned int &a=val.a, &b=val.b, &c=val.c, &d=val.d;
  81. unsigned int aa,bb,cc,dd;
  82. for(i=0;i<ln;i+=64)
  83. {
  84. x=(unsigned int *)(strw+i);
  85. // Save the values
  86. aa=a; bb=b; cc=c; dd=d;
  87. // Round 1
  88. FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
  89. FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
  90. FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
  91. FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
  92. FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
  93. FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
  94. FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
  95. FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
  96. FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
  97. FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
  98. FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
  99. FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
  100. FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
  101. FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
  102. FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
  103. FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
  104. // Round 2
  105. GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
  106. GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
  107. GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
  108. GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
  109. GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
  110. GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
  111. GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
  112. GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
  113. GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
  114. GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
  115. GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
  116. GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
  117. GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
  118. GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
  119. GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
  120. GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
  121. // Round 3
  122. HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
  123. HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
  124. HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
  125. HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
  126. HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
  127. HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
  128. HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
  129. HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
  130. HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
  131. HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
  132. HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
  133. HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
  134. HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
  135. HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
  136. HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
  137. HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
  138. // Round 4 */
  139. II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
  140. II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
  141. II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
  142. II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
  143. II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
  144. II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
  145. II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
  146. II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
  147. II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
  148. II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
  149. II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
  150. II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
  151. II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
  152. II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
  153. II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
  154. II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
  155. // Add the original values
  156. a+=aa;
  157. b+=bb;
  158. c+=cc;
  159. d+=dd;
  160. }
  161. delete[] strw;
  162. return val;
  163. }
  164. #define BUFFER_SIZE 4096 //必须是64的倍数
  165. static char * Buffer=NULL;
  166. //MD5文件摘要
  167. MD5VAL md5File(FILE * fpin)
  168. {
  169. if(!Buffer)
  170. Buffer=new char[BUFFER_SIZE+64];
  171. char * buf=Buffer;
  172. MD5VAL val={0x67452301,0xefcdab89,0x98badcfe,0x10325476};
  173. unsigned int &a=val.a, &b=val.b, &c=val.c, &d=val.d;
  174. unsigned int aa,bb,cc,dd;
  175. unsigned int i,j,count,co;
  176. unsigned int * x;
  177. i=0;
  178. do
  179. {
  180. count=fread(buf,1,BUFFER_SIZE,fpin);
  181. i+=count;
  182. if(count==BUFFER_SIZE)
  183. co=BUFFER_SIZE;
  184. else
  185. {
  186. j=count;
  187. buf[j++]=(char)0x80;
  188. for(j;j%64!=56;j++)
  189. buf[j]=0x00;
  190. *(unsigned int *)(buf+j)=i<<3; j+=4;
  191. *(unsigned int *)(buf+j)=i>>29; j+=4;
  192. co=j;
  193. }
  194. for(j=0;j<co;j+=64)
  195. {
  196. x=(unsigned int *)(buf+j);
  197. // Save the values
  198. aa=a; bb=b; cc=c; dd=d;
  199. // Round 1
  200. FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
  201. FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
  202. FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
  203. FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
  204. FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
  205. FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
  206. FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
  207. FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
  208. FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
  209. FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
  210. FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
  211. FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
  212. FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
  213. FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
  214. FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
  215. FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
  216. // Round 2
  217. GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
  218. GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
  219. GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
  220. GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
  221. GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
  222. GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
  223. GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
  224. GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
  225. GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
  226. GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
  227. GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
  228. GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
  229. GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
  230. GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
  231. GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
  232. GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
  233. // Round 3
  234. HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
  235. HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
  236. HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
  237. HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
  238. HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
  239. HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
  240. HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
  241. HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
  242. HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
  243. HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
  244. HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
  245. HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
  246. HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
  247. HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
  248. HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
  249. HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
  250. // Round 4 */
  251. II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
  252. II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
  253. II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
  254. II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
  255. II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
  256. II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
  257. II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
  258. II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
  259. II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
  260. II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
  261. II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
  262. II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
  263. II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
  264. II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
  265. II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
  266. II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
  267. // Add the original values
  268. a+=aa;
  269. b+=bb;
  270. c+=cc;
  271. d+=dd;
  272. }
  273. } while(count==BUFFER_SIZE);
  274. return val;
  275. }


文章来源: yujiang.blog.csdn.net,作者:鱼酱2333,版权归原作者所有,如需转载,请联系作者。

原文链接:yujiang.blog.csdn.net/article/details/54616359

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。