MD5(Message Digest Algorithm 5)是一种广泛使用的加密散列函数,用于生成数据的128位(16字节)哈希值。它最初由Ronald Rivest在1992年设计,并被广泛用于确保数据完整性和验证数据一致性。,,以下是一个简单的C语言实现的MD5算法示例:,,“`c,#include,#include,#include,#include,,// MD5 context.,typedef struct {, uint32_t state[4]; // state (ABCD), uint32_t count[2]; // number of bits, modulo 2^64 (lsb first), unsigned char buffer[64]; // input buffer,} MD5_CTX;,,void MD5Init(MD5_CTX* context);,void MD5Update(MD5_CTX* context, unsigned char* input, unsigned int length);,void MD5Final(unsigned char[16], MD5_CTX* context);,void Transform(uint32_t block[4], uint32_t const in[16]);,,unsigned char* MD5(const unsigned char* d, size_t n, unsigned char* md);,,// The main function to test the MD5 implementation.,int main() {, unsigned char digest[16];, const char* string = “hello world”;, MD5((unsigned char*)string, strlen(string), digest);, char mdString[33];, for (int i = 0; i< 16; i++), sprintf(mdString + i * 2, "%02x", (unsigned int)digest[i]);, printf("MD5 digest: %s,", mdString);, return 0;,},,// Function to copy a byte array into a hexadecimal string.,void binToHexStr(unsigned char* src, char* dst, int len) {, char* dp = dst;, while (len) {, sprintf(dp, "%02x", *src++);, dp += 2;, }, *dp = ' ';,},,unsigned char* MD5(const unsigned char* d, size_t n, unsigned char* md) {, MD5_CTX c;, MD5Init(&c);, MD5Update(&c, d, n);, MD5Final(md, &c);, return md;,},,void MD5Init(MD5_CTX* context) {, context>count[0] = context>count[1] = 0;, // Load magic initialization constants., context>state[0] = 0x67452301;, context>state[1] = 0xefcdab89;, context>state[2] = 0x98badcfe;, context>state[3] = 0x10325476;,},,void MD5Update(MD5_CTX* context, unsigned char* input, unsigned int length) {, size_t index = context>count[0] >> 3 & 0x3f; // Index into the buffer., if (index + length >= 64) {, memcpy(context>buffer + index, input, 64 index);, Transform(context>state, context>buffer);, input += 64 index;, length = 64 index;, index = 0;, }, while (length >= 64) {, Transform(context>state, input);, input += 64;, length = 64;, }, memcpy(context>buffer + index, input, length);, context>count[0] += (lengthcount[1] += (length >> 29);,},,void MD5Final(unsigned char[16], MD5_CTX* context) {, unsigned char pad[64];, size_t index = context>count[0] >> 3 & 0x3f; // Index into the buffer., unsigned int padLen = (index< 56) ? (56 index) : (120 index);, pad[0] = 0x80; // Padding value., memset(pad + 1, 0, padLen 1); // Padding bytes., MD5Update(context, pad, padLen);, // Store state in array., unsigned char* state = (unsigned char*)context>state;, // Littleendian convention is used here., unsigned char digest[16];, memcpy(digest, state, 16);, memset(state, 0, 64); // Clear the state., // Save the final count., context>count[0] = ~context>count[0];, context>count[1] = ~context>count[1];, MD5Update(context, (unsigned char*)context>count, 8);, // Save the final state., memcpy(digest + 16, state, 16);, // Encode the result as a string of hex digits., binToHexStr(digest, (char*)digest, 32);,},,void Transform(uint32_t block[4], uint32_t const in[16]) {, uint32_t a = block[0], b = block[1], c = block[2], d = block[3], x[16];, uint32_t temp;, memcpy(x, in, 64);, // Round 1, temp = (b & c) | (~b & d);, a += temp + x[ 0];, temp = (d & a) | (~d & c);, a += temp + x[ 4];, temp = b ^ c ^ d;, a += temp + x[ 8];, temp = c ^ d ^ a;, a += temp + x[12];, temp = (a & b) | (a & c) | (b & c);, a += temp + x[ 1];, temp = (a & d) | (b & d) | (c & d);, a += temp + x[ 5];, temp = a ^ b ^ c ^ d;, a += temp + x[ 9];, temp = (a & b) | (a & c) | (b & c);, a += temp + x[2];, temp = (a & d) | (b & d) | (c & d);, a += temp + x[ 6];, temp = a ^ b ^ c ^ d;, a += temp + x[10];, temp = (a & b) | (a & c) | (b & c);, a += temp + x[ 3];, temp = (a & d) | (b & d) | (c & d);, a += temp + x[ 7];, temp = a ^ b ^ c ^ d;, a += temp + x[11];, temp = (a & b) | (a & c) | (b & c);, a += temp + x[ 4];, temp = (a & d) | (b & d) | (c & d);, a += temp + x[12];, temp = a ^ b ^ c ^ d;, a += temp + x[13];, temp = (a & b) | (a & c) | (b & c);, a += temp + x[ 5];, temp = (a & d) | (b & d) | (c & d);, a += temp + x[14];, temp = a ^ b ^ c ^ d;, a += temp + x[ 8];, temp = (a & b) | (a & c) | (b & c);, a += temp + x[ 6];, temp = (a & d) | (b & d) | (c & d);, a += temp + x[15];, temp = a ^ b ^ c ^ d;, a += temp + x[ 9];, temp = (a & b) | (a & c) | (b & d);, a += temp + x[10];, temp = (a & c) | (a & d) | (a & b);, a += temp + x[14];, temp = (a & d) | (a & b) | (a & c);, a += temp + x[13];, temp = (a & b) | (a & c) | (a & d);, a += temp + x[12];, temp = (a & c) | (a & d) | (a & b);, a += temp + x[11];, temp = (a & d) | (a & b) | (a & c);, a += temp + x[15];, temp = (a & b) | (a & c) | (a & d);, a += temp + x[ 8];, temp = (a & c) | (a & d) | (a & b);, a += temp + x[ 7];, temp = (a & d) | (a & b) | (a & c);, a += temp + x[ 6];, temp = (a & b) | (a & c) | (a & d);, a += temp + x[ 5];, temp = (a & c) | (a & d) | (a & b);, a += temp + x[4];, temp = (a & d) | (a & b) | (a & c);, a += temp + x[3];, temp = (a & b) | (a & c) | (a & d);, a += temp + x[2];, temp = (a & c) | (a & d) | (a & b);, a += temp + x[1];, block[0] += a;, block[1] += b;, block[2] += c;, block[3] += d;,},,
#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/1127308.html