MD5是一种广泛使用的加密哈希函数,其C语言实现源码可以在RFC 1321中找到。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> // 左移操作宏定义 #define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 (c)))) // MD5算法中的四个非线性函数 #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) // MD5算法的主循环 void md5_main_loop(uint32_t state[4], uint32_t count[2], uint8_t buffer[64]) { uint32_t a, b, c, d, f, g, temp; uint32_t *x = (uint32_t *)buffer; a = state[0]; b = state[1]; c = state[2]; d = state[3]; for (int i = 0; i < 64; i++) { if (i < 16) { f = F(b, c, d); g = i; } else if (i < 32) { f = G(b, c, d); g = (5 * i + 1) % 16; } else if (i < 48) { f = H(b, c, d); g = (3 * i + 5) % 16; } else { f = I(b, c, d); g = (7 * i) % 16; } temp = d; d = c; c = b; b = b + LEFTROTATE((a + f + k[i] + x[g]), r[i]); a = temp; } state[0] += a; state[1] += b; state[2] += c; state[3] += d; } // MD5算法初始化 void md5_init(uint32_t state[4], uint32_t count[2]) { state[0] = 0x67452301; state[1] = 0xefcdab89; state[2] = 0x98badcfe; state[3] = 0x10325476; count[0] = count[1] = 0; } // MD5算法处理数据块 void md5_process_block(uint32_t state[4], uint32_t count[2], uint8_t data[64]) { uint32_t n = (count[0] >> 3) & 0x3F; uint8_t *p = data + n * 4; uint32_t i; for (i = 0; i < 16; i++, p += 4) { state[i] = (uint32_t)(p[0]) | ((uint32_t)(p[1]) << 8) | ((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24); } md5_main_loop(state, count, data); } // MD5算法更新状态和计数器 void md5_update(uint32_t state[4], uint32_t count[2], uint8_t data[], uint32_t len) { uint32_t i, index, partlen; index = (count[0] >> 3) & 0x3F; count[0] += len << 3; if (count[0] < (len << 3)) { count[1]++; } count[1] += len >> 29; partlen = 64 index; if (len >= partlen) { memcpy(&data[index], data, partlen); md5_process_block(state, count, data); for (i = partlen; i + 63 < len; i += 64) { md5_process_block(state, count, data + i); } index = 0; } else { i = 0; } memcpy(&data[index], data + i, len i); } // MD5算法结束处理,输出结果 void md5_finish(uint32_t state[4], uint8_t digest[16]) { uint32_t i; uint8_t *p = (uint8_t *)digest; for (i = 0; i < 4; i++) { p[i] = (uint8_t)(state[i] & 0xff); p[i + 4] = (uint8_t)((state[i] >> 8) & 0xff); p[i + 8] = (uint8_t)((state[i] >> 16) & 0xff); p[i + 12] = (uint8_t)((state[i] >> 24) & 0xff); } } // MD5算法主函数 void md5(uint8_t data[], uint32_t len, uint8_t digest[16]) { uint32_t state[4], count[2]; md5_init(state, count); md5_update(state, count, data, len); md5_finish(state, digest); }
小伙伴们,上文介绍md5 c源码的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1090054.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复