md5ex1.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include "md5ex1.h"
  2. #include <string.h>
  3. #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
  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. #define FF(a, b, c, d, x, s, ac) \
  9. { (a) += F((b), (c), (d)) + (x) + (uint32_t)(ac); \
  10. (a) = ROTATE_LEFT((a), (s)); \
  11. (a) += (b); }
  12. #define GG(a, b, c, d, x, s, ac) \
  13. { (a) += G((b), (c), (d)) + (x) + (uint32_t)(ac); \
  14. (a) = ROTATE_LEFT((a), (s)); \
  15. (a) += (b); }
  16. #define HH(a, b, c, d, x, s, ac) \
  17. { (a) += H((b), (c), (d)) + (x) + (uint32_t)(ac); \
  18. (a) = ROTATE_LEFT((a), (s)); \
  19. (a) += (b); }
  20. #define II(a, b, c, d, x, s, ac) \
  21. { (a) += I((b), (c), (d)) + (x) + (uint32_t)(ac); \
  22. (a) = ROTATE_LEFT((a), (s)); \
  23. (a) += (b); }
  24. // v41.2 修复警告:将block参数改为指针,修复-Wstringop-overread警告
  25. static void MD5_TransformEx1(uint32_t state[4], const uint8_t* block) {
  26. uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16];
  27. // v41.2 修复:从指针正确读取64字节
  28. const uint8_t* p = (const uint8_t*)block;
  29. for (int i = 0; i < 16; i++) {
  30. x[i] = (uint32_t)p[0] | ((uint32_t)p[1] << 8) |
  31. ((uint32_t)p[2] << 16) | ((uint32_t)p[3] << 24);
  32. p += 4;
  33. }
  34. FF(a, b, c, d, x[0], 7, 0xD76AA478);
  35. FF(d, a, b, c, x[1], 12, 0xE8C7B756);
  36. FF(c, d, a, b, x[2], 17, 0x242070DB);
  37. FF(b, c, d, a, x[3], 22, 0xC1BDCEEE);
  38. FF(a, b, c, d, x[4], 7, 0xF57C0FAF);
  39. FF(d, a, b, c, x[5], 12, 0x4787C62A);
  40. FF(c, d, a, b, x[6], 17, 0xA8304613);
  41. FF(b, c, d, a, x[7], 22, 0xFD469501);
  42. FF(a, b, c, d, x[8], 7, 0x698098D8);
  43. FF(d, a, b, c, x[9], 12, 0x8B44F7AF);
  44. FF(c, d, a, b, x[10], 17, 0xFFFF5BB1);
  45. FF(b, c, d, a, x[11], 22, 0x895CD7BE);
  46. FF(a, b, c, d, x[12], 7, 0x6B901122);
  47. FF(d, a, b, c, x[13], 12, 0xFD987193);
  48. FF(c, d, a, b, x[14], 17, 0xA679438E);
  49. FF(b, c, d, a, x[15], 22, 0x49B40821);
  50. GG(a, b, c, d, x[1], 5, 0xF61E2562);
  51. GG(d, a, b, c, x[6], 9, 0xC040B340);
  52. GG(c, d, a, b, x[11], 14, 0x265E5A51);
  53. GG(b, c, d, a, x[0], 20, 0xE9B6C7AA);
  54. GG(a, b, c, d, x[5], 5, 0xD62F105D);
  55. GG(d, a, b, c, x[10], 9, 0x02441453);
  56. GG(c, d, a, b, x[15], 14, 0xD8A1E681);
  57. GG(b, c, d, a, x[4], 20, 0xE7D3FBC8);
  58. GG(a, b, c, d, x[9], 5, 0x21E1CDE6);
  59. GG(d, a, b, c, x[14], 9, 0xC33707D6);
  60. GG(c, d, a, b, x[3], 14, 0xF4D50D87);
  61. GG(b, c, d, a, x[8], 20, 0x455A14ED);
  62. GG(a, b, c, d, x[13], 5, 0xA9E3E905);
  63. GG(d, a, b, c, x[2], 9, 0xFCEFA3F8);
  64. GG(c, d, a, b, x[7], 14, 0x676F02D9);
  65. GG(b, c, d, a, x[12], 20, 0x8D2A4C8A);
  66. HH(a, b, c, d, x[5], 4, 0xFFFA3942);
  67. HH(d, a, b, c, x[8], 11, 0x8771F681);
  68. HH(c, d, a, b, x[11], 16, 0x6D9D6122);
  69. HH(b, c, d, a, x[14], 23, 0xFDE5380C);
  70. HH(a, b, c, d, x[1], 4, 0xA4BEEA44);
  71. HH(d, a, b, c, x[4], 11, 0x4BDECFA9);
  72. HH(c, d, a, b, x[7], 16, 0xF6BB4B60);
  73. HH(b, c, d, a, x[10], 23, 0xBEBFBC70);
  74. HH(a, b, c, d, x[13], 4, 0x289B7EC6);
  75. HH(d, a, b, c, x[0], 11, 0xEAA127FA);
  76. HH(c, d, a, b, x[3], 16, 0xD4EF3085);
  77. HH(b, c, d, a, x[6], 23, 0x04881D05);
  78. HH(a, b, c, d, x[9], 4, 0xD9D4D039);
  79. HH(d, a, b, c, x[12], 11, 0xE6DB99E5);
  80. HH(c, d, a, b, x[15], 16, 0x1FA27CF8);
  81. HH(b, c, d, a, x[2], 23, 0xC4AC5665);
  82. II(a, b, c, d, x[0], 6, 0xF4292244);
  83. II(d, a, b, c, x[7], 10, 0x432AFF97);
  84. II(c, d, a, b, x[14], 15, 0xAB9423A7);
  85. II(b, c, d, a, x[5], 21, 0xFC93A039);
  86. II(a, b, c, d, x[12], 6, 0x655B59C3);
  87. II(d, a, b, c, x[3], 10, 0x8F0CCC92);
  88. II(c, d, a, b, x[10], 15, 0xFFEFF47D);
  89. II(b, c, d, a, x[1], 21, 0x85845DD1);
  90. II(a, b, c, d, x[8], 6, 0x6FA87E4F);
  91. II(d, a, b, c, x[15], 10, 0xFE2CE6E0);
  92. II(c, d, a, b, x[6], 15, 0xA3014314);
  93. II(b, c, d, a, x[13], 21, 0x4E0811A1);
  94. II(a, b, c, d, x[4], 6, 0xF7537E82);
  95. II(d, a, b, c, x[11], 10, 0xBD3AF235);
  96. II(c, d, a, b, x[2], 15, 0x2AD7D2BB);
  97. II(b, c, d, a, x[9], 21, 0xEB86D391);
  98. state[0] += a;
  99. state[1] += b;
  100. state[2] += c;
  101. state[3] += d;
  102. }
  103. void MD5_InitEx1(MD5_CTXEx1* ctx) {
  104. ctx->count[0] = ctx->count[1] = 0;
  105. ctx->state[0] = 0x67452301;
  106. ctx->state[1] = 0xEFCDAB89;
  107. ctx->state[2] = 0x98BADCFE;
  108. ctx->state[3] = 0x10325476;
  109. }
  110. void MD5_UpdateEx1(MD5_CTXEx1* ctx, const uint8_t* input, size_t len) {
  111. size_t i, index, partLen;
  112. index = (ctx->count[0] >> 3) & 0x3F;
  113. ctx->count[0] += (uint32_t)(len << 3);
  114. if (ctx->count[0] < (len << 3)) ctx->count[1]++;
  115. ctx->count[1] += (uint32_t)(len >> 29);
  116. partLen = MD5_BLOCK_SIZE - index;
  117. if (len >= partLen) {
  118. memcpy(&ctx->buffer[index], input, partLen);
  119. MD5_TransformEx1(ctx->state, ctx->buffer);
  120. // v41.2 修复警告:使用临时缓冲区确保64字节对齐
  121. uint8_t block[MD5_BLOCK_SIZE];
  122. for (i = partLen; i + MD5_BLOCK_SIZE <= len; i += MD5_BLOCK_SIZE) {
  123. memcpy(block, &input[i], MD5_BLOCK_SIZE);
  124. MD5_TransformEx1(ctx->state, block);
  125. }
  126. index = 0;
  127. }
  128. else {
  129. i = 0;
  130. }
  131. memcpy(&ctx->buffer[index], &input[i], len - i);
  132. }
  133. void MD5_FinalEx1(uint8_t digest[MD5_DIGEST_SIZE], MD5_CTXEx1* ctx) {
  134. uint8_t bits[8];
  135. size_t index, padLen;
  136. static const uint8_t PADDING[MD5_BLOCK_SIZE] = { 0x80 };
  137. for (int i = 0; i < 8; i++)
  138. bits[i] = (ctx->count[i >> 2] >> ((i & 3) << 3)) & 0xFF;
  139. index = (ctx->count[0] >> 3) & 0x3F;
  140. padLen = (index < 56) ? (56 - index) : (120 - index);
  141. MD5_UpdateEx1(ctx, PADDING, padLen);
  142. MD5_UpdateEx1(ctx, bits, 8);
  143. for (int i = 0; i < MD5_DIGEST_SIZE; i++)
  144. digest[i] = (ctx->state[i >> 2] >> ((i & 3) << 3)) & 0xFF;
  145. }
  146. // 字节数组转16进制字符串
  147. void bytes_to_hexEx1(const uint8_t* bytes, size_t len, char* hex_str) {
  148. const char hex_chars[] = "0123456789abcdef";
  149. for (size_t i = 0; i < len; i++) {
  150. hex_str[i * 2] = hex_chars[(bytes[i] >> 4) & 0xF];
  151. hex_str[i * 2 + 1] = hex_chars[bytes[i] & 0xF];
  152. }
  153. hex_str[len * 2] = '\0';
  154. }
  155. // MD5 哈希字符串,输出16进制
  156. void md5_hexEx1(const char* input, char* output) {
  157. MD5_CTXEx1 ctx;
  158. uint8_t digest[MD5_DIGEST_SIZE];
  159. MD5_InitEx1(&ctx);
  160. MD5_UpdateEx1(&ctx, (const uint8_t*)input, strlen(input));
  161. MD5_FinalEx1(digest, &ctx);
  162. bytes_to_hexEx1(digest, MD5_DIGEST_SIZE, output);
  163. }
  164. // MD5 哈希字节数组,输出16进制
  165. void md5_bytesEx1(const uint8_t* input, size_t len, char* output) {
  166. MD5_CTXEx1 ctx;
  167. uint8_t digest[MD5_DIGEST_SIZE];
  168. MD5_InitEx1(&ctx);
  169. MD5_UpdateEx1(&ctx, input, len);
  170. MD5_FinalEx1(digest, &ctx);
  171. bytes_to_hexEx1(digest, MD5_DIGEST_SIZE, output);
  172. }
  173. // 三次 MD5 加密(只返回最终结果)
  174. void md5_tripleEx1(const char* input, char* output) {
  175. char temp[33];
  176. md5_hexEx1(input, temp); // 第一次
  177. md5_hexEx1(temp, output); // 第二次
  178. strcpy(temp, output);
  179. md5_hexEx1(temp, output); // 第三次
  180. }