【安全算法之MD5】MD5摘要运算的C语言源码实现

大家都知道,md5是一种摘要运算算法,关于更多的摘要算法,可以参考我之前的一篇文章:摘要算法汇总
今天要给大家带来的是md5摘要运算的源码实现,废话不多说,直接上源码:
先看头文件,什么了一些结构体定义和操作宏定义,以及导出的3个api接口:
#ifndef __md5_h__#define __md5_h__#ifdef __cplusplusextern c {#endif /* __cplusplus */#include typedef struct _md5_ctx_t { uint32_t count[2]; uint32_t state[4]; uint8_t buffer[64];} md5_ctx_t;#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))#define rotate_left(x,n) ((x (32-n)))#define md5_digest_len 16#define ff(a,b,c,d,x,s,ac) \{ \ a += f(b,c,d) + x + ac; \ a = rotate_left(a,s); \ a += b; \}#define gg(a,b,c,d,x,s,ac) \{ \ a += g(b,c,d) + x + ac; \ a = rotate_left(a,s); \ a += b; \}#define hh(a,b,c,d,x,s,ac) \{ \ a += h(b,c,d) + x + ac; \ a = rotate_left(a,s); \ a += b; \}#define ii(a,b,c,d,x,s,ac) \{ \ a += i(b,c,d) + x + ac; \ a = rotate_left(a,s); \ a += b; \}extern void crypto_md5_init(md5_ctx_t *ctx);extern void crypto_md5_update(md5_ctx_t *ctx, uint8_t *in, uint32_t in_len);extern void crypto_md5_final(md5_ctx_t *ctx, uint8_t digest[md5_digest_len]);#ifdef __cplusplus}#endif /* __cplusplus */#endif /*__md5_h__*/  
接下来,上实现源码:
#include #include #include md5.hstatic const unsigned char padding[] = { 0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};void crypto_md5_init(md5_ctx_t *context){ context->count[0] = 0; context->count[1] = 0; context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476;}static void crypto_md5_decode(unsigned int *output, unsigned char *input, unsigned int len){ unsigned int i = 0; unsigned int j = 0; while (j < len) { output[i] = (input[j]) | (input[j+1] << 8) | (input[j+2] << 16) | (input[j+3] > 3) & 0x3f; partlen = 64 - index; context->count[0] += inputlen > 29; if (inputlen >= partlen) { memcpy(&context->buffer[index], input,partlen); crypto_md5_transform(context->state, context->buffer); for (i = partlen; i+64 state, &input[i]); } index = 0; } else { i = 0; } memcpy(&context->buffer[index], &input[i], inputlen-i);}static void crypto_md5_encode(unsigned char *output,unsigned int *input,unsigned int len){ unsigned int i = 0; unsigned int j = 0; while (j > 8) & 0xff; output[j+2] = (input[i] >> 16) & 0xff; output[j+3] = (input[i] >> 24) & 0xff; i++; j += 4; }}void crypto_md5_final(md5_ctx_t *context, unsigned char digest[16]){ unsigned int index = 0,padlen = 0; unsigned char bits[8]; index = (context->count[0] >> 3) & 0x3f; padlen = (index count, 8); crypto_md5_update(context, (unsigned char *)padding, padlen); crypto_md5_update(context, bits, 8); crypto_md5_encode(digest, context->state, 16);}  
我们先写一段测试代码测试一下看看:
#include #include #include md5.hint main(int argc, const char *argv[]){ const char *data = c1d0f8fb4958670dba40ab1f3752ef0d; uint8_t digest_calc[md5_digest_len]; uint8_t digest_exp[md5_digest_len] = \x4c\x61\x8f\xd1\x4c\x14\x88\x1e\xfb\x13\x35\x2e\x40\x04\x73\xb1; md5_ctx_t ctx; const char *p_calc = data; uint8_t data_bytes[128]; uint16_t len_bytes; char data_str[128]; if (argc > 1) { p_calc = argv[1]; } crypto_md5_init(&ctx); crypto_md5_update(&ctx, (uint8_t *)p_calc, strlen(p_calc)); crypto_md5_final(&ctx, digest_calc); if (!memcmp(digest_calc, digest_exp, sizeof(digest_calc))) { printf(md5 digest test ok\n); } else { //log_hexdump(digest_calc, digest_calc, sizeof(digest_calc)); //log_hexdump(digest_exp, digest_exp, sizeof(digest_exp)); printf(md5 digest test fail\n); } return 0;} 这个测试案例,是计算一段字符串:c1d0f8fb4958670dba40ab1f3752ef0d的md5摘要,然后期往的md5摘要是下面的32字节数据:
 \x4c\x61\x8f\xd1\x4c\x14\x88\x1e\xfb\x13\x35\x2e\x40\x04\x73\xb1
通过取得计算的结果与期望值进行比对,进而得出运算结果正确与否。
通过运行测试程序,可以发现,运算结果正常。
也可以跟一些算法小工具的结果做下对比,发现,结果也是没有问题的。
以上就是本次对md5源码的测试,本案例的所有源代码,均可以在我的github上面找到,对你有帮助的话,请帮忙点个star呦,先谢谢了。 
更多参考链接
[1] 【安全算法的github仓库】
[2] 【安全算法之概述】一文带你简要了解常见常用的安全算法

智能网联汽车确定通信频段,车路协同开始火爆
四款可视化工具的优缺点
vivoXplay7新机曝光:全面屏+前后双摄,领先苹果三星的屏下指纹识别,vivoxplay7必将大火?
嵌入式工控机在物流领域有着怎样的应用
音频线的接法
【安全算法之MD5】MD5摘要运算的C语言源码实现
可折叠智能手机至少在未来五年内有望继续使用UTG和CPI
红米Note8系列相比Note7系列,有哪些提升?
模数转换器ADC1001CCJ特性概述
聊聊驾驶员疲劳监测系统发展趋势
HSD连接器市场竞逐价格还是品质?
光敏传感器
酒泉卫星发射中心成功发射可重复使用试验航天器
变频器维修的几种实用方法
赣锋锂业10.75亿收购Minera Exar12.5%股权
荣耀MagicBook 14锐龙版评测 这是一台配置和性能都表现不错的轻薄本
利用PM2.5传感器,以对工厂有害颗粒物进行安全监测
2019年我国车联网的应用场景及趋势分析
分立原件组成的多谐振荡器电路解析
人工智能加入清洁行业有什么机遇和挑战