md5.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:12k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*
  2.   Copyright (C) 1999 Aladdin Enterprises.  All rights reserved.
  3.   This software is provided 'as-is', without any express or implied
  4.   warranty.  In no event will the authors be held liable for any damages
  5.   arising from the use of this software.
  6.   Permission is granted to anyone to use this software for any purpose,
  7.   including commercial applications, and to alter it and redistribute it
  8.   freely, subject to the following restrictions:
  9.   1. The origin of this software must not be misrepresented; you must not
  10.      claim that you wrote the original software. If you use this software
  11.      in a product, an acknowledgment in the product documentation would be
  12.      appreciated but is not required.
  13.   2. Altered source versions must be plainly marked as such, and must not be
  14.      misrepresented as being the original software.
  15.   3. This notice may not be removed or altered from any source distribution.
  16.   L. Peter Deutsch
  17.   ghost@aladdin.com
  18.  */
  19. /*$Id: md5.c $ */
  20. /*
  21.   Independent implementation of MD5 (RFC 1321).
  22.   This code implements the MD5 Algorithm defined in RFC 1321.
  23.   It is derived directly from the text of the RFC and not from the
  24.   reference implementation.
  25.   The original and principal author of md5.c is L. Peter Deutsch
  26.   <ghost@aladdin.com>.  Other authors are noted in the change history
  27.   that follows (in reverse chronological order):
  28.   1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
  29.   1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
  30.   1999-05-03 lpd Original version.
  31. */
  32. //#include "KWin32.h"
  33. #include "stdafx.h"
  34. #ifndef TEST
  35. #include "stdio.h"
  36. #include "md5.h"
  37. #endif
  38. #ifdef TEST
  39. /*
  40.  * Compile with -DTEST to create a self-contained executable test program.
  41.  * The test program should print out the same values as given in section
  42.  * A.5 of RFC 1321, reproduced below.
  43.  */
  44. #include "stdio.h"
  45. #include "string.h"
  46. #include "md5.h"
  47. int main(int argc, char *argv[])
  48. {
  49.     static const char *const test[7] = {
  50. "", /*d41d8cd98f00b204e9800998ecf8427e*/
  51. "a", /*0cc175b9c0f1b6a831c399e269772661*/
  52. "abc", /*900150983cd24fb0d6963f7d28e17f72*/
  53. "message digest", /*f96b697d7cb7938d525a2f31aaf161d0*/
  54. "abcdefghijklmnopqrstuvwxyz", /*c3fcd3d76192e4007dfb496cca67e13b*/
  55. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
  56. /*d174ab98d277d9f5a5611c2c9f419d9f*/
  57. "12345678901234567890123456789012345678901234567890123456789012345678901234567890" /*57edf4a22be3c955ac49da2e2107b67a*/
  58.     };
  59.     if (argc > 1)
  60.     {
  61.         unsigned char ReadBuffer[65536];
  62.         size_t ReadBytes = 0;
  63.      md5_state_t state;
  64.     md5_byte_t digest[16];
  65.         md5_init(&state);
  66.     
  67.         FILE *fp = fopen(argv[1], "rb");
  68.         if (!fp) 
  69.             return -1;
  70.         while (true)
  71.         {
  72.             ReadBytes = fread(ReadBuffer, 1, 65536, fp);
  73.             if (ReadBytes > 0)
  74.                 md5_append(&state, (const md5_byte_t *)ReadBuffer, ReadBytes);
  75.             if (feof(fp))
  76.             {
  77.              md5_finish(&state, digest);
  78.                 break;
  79.             }
  80.         }
  81.         fclose(fp);
  82.         fp = NULL;
  83.     int i;
  84.         printf("File %s:n", argv[1]);
  85.      printf("MD5 = ");
  86.     for (i = 0; i < 16; i++)
  87.         printf("%02X ", digest[i]);
  88.     printf("n");
  89.      printf("MD5 = ");
  90.     for (i = 0; i < 16; i++)
  91.         printf("%02X", digest[i]);
  92.     printf("n");
  93.         
  94.         return 0;
  95.     }
  96.         
  97.                         
  98.     int i;
  99.     for (i = 0; i < 7; ++i) {
  100. md5_state_t state;
  101. md5_byte_t digest[16];
  102. int di;
  103. md5_init(&state);
  104. md5_append(&state, (const md5_byte_t *)test[i], strlen(test[i]));
  105. md5_finish(&state, digest);
  106. printf("MD5 ("%s") = ", test[i]);
  107. for (di = 0; di < 16; ++di)
  108.     printf("%02x ", digest[di]);
  109. printf("n");
  110.     }
  111.     return 0;
  112. }
  113. #endif /* TEST */
  114. /*
  115.  * For reference, here is the program that computed the T values.
  116.  */
  117. #if 0
  118. #include <math.h>
  119. main()
  120. {
  121.     int i;
  122.     for (i = 1; i <= 64; ++i) {
  123. unsigned long v = (unsigned long)(4294967296.0 * fabs(sin((double)i)));
  124. printf("#define T%d 0x%08lxn", i, v);
  125.     }
  126.     return 0;
  127. }
  128. #endif
  129. /*
  130.  * End of T computation program.
  131.  */
  132. #define T1 0xd76aa478
  133. #define T2 0xe8c7b756
  134. #define T3 0x242070db
  135. #define T4 0xc1bdceee
  136. #define T5 0xf57c0faf
  137. #define T6 0x4787c62a
  138. #define T7 0xa8304613
  139. #define T8 0xfd469501
  140. #define T9 0x698098d8
  141. #define T10 0x8b44f7af
  142. #define T11 0xffff5bb1
  143. #define T12 0x895cd7be
  144. #define T13 0x6b901122
  145. #define T14 0xfd987193
  146. #define T15 0xa679438e
  147. #define T16 0x49b40821
  148. #define T17 0xf61e2562
  149. #define T18 0xc040b340
  150. #define T19 0x265e5a51
  151. #define T20 0xe9b6c7aa
  152. #define T21 0xd62f105d
  153. #define T22 0x02441453
  154. #define T23 0xd8a1e681
  155. #define T24 0xe7d3fbc8
  156. #define T25 0x21e1cde6
  157. #define T26 0xc33707d6
  158. #define T27 0xf4d50d87
  159. #define T28 0x455a14ed
  160. #define T29 0xa9e3e905
  161. #define T30 0xfcefa3f8
  162. #define T31 0x676f02d9
  163. #define T32 0x8d2a4c8a
  164. #define T33 0xfffa3942
  165. #define T34 0x8771f681
  166. #define T35 0x6d9d6122
  167. #define T36 0xfde5380c
  168. #define T37 0xa4beea44
  169. #define T38 0x4bdecfa9
  170. #define T39 0xf6bb4b60
  171. #define T40 0xbebfbc70
  172. #define T41 0x289b7ec6
  173. #define T42 0xeaa127fa
  174. #define T43 0xd4ef3085
  175. #define T44 0x04881d05
  176. #define T45 0xd9d4d039
  177. #define T46 0xe6db99e5
  178. #define T47 0x1fa27cf8
  179. #define T48 0xc4ac5665
  180. #define T49 0xf4292244
  181. #define T50 0x432aff97
  182. #define T51 0xab9423a7
  183. #define T52 0xfc93a039
  184. #define T53 0x655b59c3
  185. #define T54 0x8f0ccc92
  186. #define T55 0xffeff47d
  187. #define T56 0x85845dd1
  188. #define T57 0x6fa87e4f
  189. #define T58 0xfe2ce6e0
  190. #define T59 0xa3014314
  191. #define T60 0x4e0811a1
  192. #define T61 0xf7537e82
  193. #define T62 0xbd3af235
  194. #define T63 0x2ad7d2bb
  195. #define T64 0xeb86d391
  196. static void
  197. md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
  198. {
  199.     md5_word_t
  200. a = pms->abcd[0], b = pms->abcd[1],
  201. c = pms->abcd[2], d = pms->abcd[3];
  202.     md5_word_t t;
  203. #ifndef ARCH_IS_BIG_ENDIAN
  204. # define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */
  205. #endif
  206. #if ARCH_IS_BIG_ENDIAN
  207.     /*
  208.      * On big-endian machines, we must arrange the bytes in the right
  209.      * order.  (This also works on machines of unknown byte order.)
  210.      */
  211.     md5_word_t X[16];
  212.     const md5_byte_t *xp = data;
  213.     int i;
  214.     for (i = 0; i < 16; ++i, xp += 4)
  215. X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
  216. #else  /* !ARCH_IS_BIG_ENDIAN */
  217.     /*
  218.      * On little-endian machines, we can process properly aligned data
  219.      * without copying it.
  220.      */
  221.     md5_word_t xbuf[16];
  222.     const md5_word_t *X;
  223.     if (!((data - (const md5_byte_t *)0) & 3)) {
  224. /* data are properly aligned */
  225. X = (const md5_word_t *)data;
  226.     } else {
  227. /* not aligned */
  228. memcpy(xbuf, data, 64);
  229. X = xbuf;
  230.     }
  231. #endif
  232. #undef SET
  233. #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
  234.     /* Round 1. */
  235.     /* Let [abcd k s i] denote the operation
  236.        a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
  237. #define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
  238. #define SET(a, b, c, d, k, s, Ti)
  239.   t = a + F(b,c,d) + X[k] + Ti;
  240.   a = ROTATE_LEFT(t, s) + b
  241.     /* Do the following 16 operations. */
  242.     SET(a, b, c, d,  0,  7,  T1);
  243.     SET(d, a, b, c,  1, 12,  T2);
  244.     SET(c, d, a, b,  2, 17,  T3);
  245.     SET(b, c, d, a,  3, 22,  T4);
  246.     SET(a, b, c, d,  4,  7,  T5);
  247.     SET(d, a, b, c,  5, 12,  T6);
  248.     SET(c, d, a, b,  6, 17,  T7);
  249.     SET(b, c, d, a,  7, 22,  T8);
  250.     SET(a, b, c, d,  8,  7,  T9);
  251.     SET(d, a, b, c,  9, 12, T10);
  252.     SET(c, d, a, b, 10, 17, T11);
  253.     SET(b, c, d, a, 11, 22, T12);
  254.     SET(a, b, c, d, 12,  7, T13);
  255.     SET(d, a, b, c, 13, 12, T14);
  256.     SET(c, d, a, b, 14, 17, T15);
  257.     SET(b, c, d, a, 15, 22, T16);
  258. #undef SET
  259.      /* Round 2. */
  260.      /* Let [abcd k s i] denote the operation
  261.           a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
  262. #define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
  263. #define SET(a, b, c, d, k, s, Ti)
  264.   t = a + G(b,c,d) + X[k] + Ti;
  265.   a = ROTATE_LEFT(t, s) + b
  266.      /* Do the following 16 operations. */
  267.     SET(a, b, c, d,  1,  5, T17);
  268.     SET(d, a, b, c,  6,  9, T18);
  269.     SET(c, d, a, b, 11, 14, T19);
  270.     SET(b, c, d, a,  0, 20, T20);
  271.     SET(a, b, c, d,  5,  5, T21);
  272.     SET(d, a, b, c, 10,  9, T22);
  273.     SET(c, d, a, b, 15, 14, T23);
  274.     SET(b, c, d, a,  4, 20, T24);
  275.     SET(a, b, c, d,  9,  5, T25);
  276.     SET(d, a, b, c, 14,  9, T26);
  277.     SET(c, d, a, b,  3, 14, T27);
  278.     SET(b, c, d, a,  8, 20, T28);
  279.     SET(a, b, c, d, 13,  5, T29);
  280.     SET(d, a, b, c,  2,  9, T30);
  281.     SET(c, d, a, b,  7, 14, T31);
  282.     SET(b, c, d, a, 12, 20, T32);
  283. #undef SET
  284.      /* Round 3. */
  285.      /* Let [abcd k s t] denote the operation
  286.           a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
  287. #define H(x, y, z) ((x) ^ (y) ^ (z))
  288. #define SET(a, b, c, d, k, s, Ti)
  289.   t = a + H(b,c,d) + X[k] + Ti;
  290.   a = ROTATE_LEFT(t, s) + b
  291.      /* Do the following 16 operations. */
  292.     SET(a, b, c, d,  5,  4, T33);
  293.     SET(d, a, b, c,  8, 11, T34);
  294.     SET(c, d, a, b, 11, 16, T35);
  295.     SET(b, c, d, a, 14, 23, T36);
  296.     SET(a, b, c, d,  1,  4, T37);
  297.     SET(d, a, b, c,  4, 11, T38);
  298.     SET(c, d, a, b,  7, 16, T39);
  299.     SET(b, c, d, a, 10, 23, T40);
  300.     SET(a, b, c, d, 13,  4, T41);
  301.     SET(d, a, b, c,  0, 11, T42);
  302.     SET(c, d, a, b,  3, 16, T43);
  303.     SET(b, c, d, a,  6, 23, T44);
  304.     SET(a, b, c, d,  9,  4, T45);
  305.     SET(d, a, b, c, 12, 11, T46);
  306.     SET(c, d, a, b, 15, 16, T47);
  307.     SET(b, c, d, a,  2, 23, T48);
  308. #undef SET
  309.      /* Round 4. */
  310.      /* Let [abcd k s t] denote the operation
  311.           a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
  312. #define I(x, y, z) ((y) ^ ((x) | ~(z)))
  313. #define SET(a, b, c, d, k, s, Ti)
  314.   t = a + I(b,c,d) + X[k] + Ti;
  315.   a = ROTATE_LEFT(t, s) + b
  316.      /* Do the following 16 operations. */
  317.     SET(a, b, c, d,  0,  6, T49);
  318.     SET(d, a, b, c,  7, 10, T50);
  319.     SET(c, d, a, b, 14, 15, T51);
  320.     SET(b, c, d, a,  5, 21, T52);
  321.     SET(a, b, c, d, 12,  6, T53);
  322.     SET(d, a, b, c,  3, 10, T54);
  323.     SET(c, d, a, b, 10, 15, T55);
  324.     SET(b, c, d, a,  1, 21, T56);
  325.     SET(a, b, c, d,  8,  6, T57);
  326.     SET(d, a, b, c, 15, 10, T58);
  327.     SET(c, d, a, b,  6, 15, T59);
  328.     SET(b, c, d, a, 13, 21, T60);
  329.     SET(a, b, c, d,  4,  6, T61);
  330.     SET(d, a, b, c, 11, 10, T62);
  331.     SET(c, d, a, b,  2, 15, T63);
  332.     SET(b, c, d, a,  9, 21, T64);
  333. #undef SET
  334.      /* Then perform the following additions. (That is increment each
  335.         of the four registers by the value it had before this block
  336.         was started.) */
  337.     pms->abcd[0] += a;
  338.     pms->abcd[1] += b;
  339.     pms->abcd[2] += c;
  340.     pms->abcd[3] += d;
  341. }
  342. void
  343. md5_init(md5_state_t *pms)
  344. {
  345.     pms->count[0] = pms->count[1] = 0;
  346.     pms->abcd[0] = 0x67452301;
  347.     pms->abcd[1] = 0xefcdab89;
  348.     pms->abcd[2] = 0x98badcfe;
  349.     pms->abcd[3] = 0x10325476;
  350. }
  351. void
  352. md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
  353. {
  354.     const md5_byte_t *p = data;
  355.     int left = nbytes;
  356.     int offset = (pms->count[0] >> 3) & 63;
  357.     md5_word_t nbits = (md5_word_t)(nbytes << 3);
  358.     if (nbytes <= 0)
  359. return;
  360.     /* Update the message length. */
  361.     pms->count[1] += nbytes >> 29;
  362.     pms->count[0] += nbits;
  363.     if (pms->count[0] < nbits)
  364. pms->count[1]++;
  365.     /* Process an initial partial block. */
  366.     if (offset) {
  367. int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
  368. memcpy(pms->buf + offset, p, copy);
  369. if (offset + copy < 64)
  370.     return;
  371. p += copy;
  372. left -= copy;
  373. md5_process(pms, pms->buf);
  374.     }
  375.     /* Process full blocks. */
  376.     for (; left >= 64; p += 64, left -= 64)
  377. md5_process(pms, p);
  378.     /* Process a final partial block. */
  379.     if (left)
  380. memcpy(pms->buf, p, left);
  381. }
  382. void
  383. md5_finish(md5_state_t *pms, md5_byte_t digest[16])
  384. {
  385.     static const md5_byte_t pad[64] = {
  386. 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  387. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  388. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  389. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  390.     };
  391.     md5_byte_t data[8];
  392.     int i;
  393.     /* Save the length before padding. */
  394.     for (i = 0; i < 8; ++i)
  395. data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
  396.     /* Pad to 56 bytes mod 64. */
  397.     md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
  398.     /* Append the length. */
  399.     md5_append(pms, data, 8);
  400.     for (i = 0; i < 16; ++i)
  401. digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
  402. }