c语言md5算法

时间: 2023-07-26 08:16:17 浏览: 49
C语言中可以使用开源的MD5库实现MD5算法。以下是一个简单的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/md5.h> int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s <string>\n", argv[0]); return 1; } char *input_str = argv[1]; unsigned char digest[MD5_DIGEST_LENGTH]; MD5((unsigned char *)input_str, strlen(input_str), digest); printf("MD5 digest: "); for (int i = 0; i < MD5_DIGEST_LENGTH; i++) { printf("%02x", digest[i]); } printf("\n"); return 0; } ``` 此程序使用了OpenSSL库中的MD5函数计算输入字符串的MD5摘要,并将结果以16进制格式输出。请注意,此示例程序仅供参考,实际使用时需要注意数据安全和正确性。
相关问题

c语言 md5算法实现

以下是一个使用 C 语言实现 MD5 算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> // MD5 常量定义 #define MD5_BLOCK_SIZE 64 #define MD5_DIGEST_SIZE 16 // 循环左移操作宏定义 #define LEFT_ROTATE(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) // MD5算法上下文结构体定义 typedef struct { uint32_t state[4]; // 存储中间结果状态 uint32_t count[2]; // 存储输入数据的位数 uint8_t buffer[MD5_BLOCK_SIZE]; // 输入数据缓冲区 } MD5_CTX; // 初始化 MD5 上下文 void md5_init(MD5_CTX *ctx) { ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; ctx->count[0] = 0; ctx->count[1] = 0; } ***5 上下文 void md5_update(MD5_CTX *ctx, const uint8_t *input, size_t input_len) { size_t i, index, part_len; // 计算输入数据的字节数 index = (ctx->count[0] >> 3) % MD5_BLOCK_SIZE; // 更新位数 if ((ctx->count[0] += (input_len << 3)) < (input_len << 3)) { ctx->count[1]++; } ctx->count[1] += (input_len >> 29); // 计算需要缓冲区剩余空间的长度 part_len = MD5_BLOCK_SIZE - index; // 对输入数据进行处理 if (input_len >= part_len) { memcpy(&ctx->buffer[index], input, part_len); md5_transform(ctx, ctx->buffer); for (i = part_len; i + MD5_BLOCK_SIZE <= input_len; i += MD5_BLOCK_SIZE) { md5_transform(ctx, &input[i]); } index = 0; } // 将剩余的输入数据复制到缓冲区 memcpy(&ctx->buffer[index], &input[i], input_len - i); } // 结束 MD5 计算并输出结果 void md5_final(MD5_CTX *ctx, uint8_t *digest) { uint8_t padding[MD5_BLOCK_SIZE]; uint64_t bits_len = ctx->count[0] + (ctx->count[1] << 32); uint32_t index, pad_len; // 填充数据 padding[0] = 0x80; for (index = 1; index < MD5_BLOCK_SIZE - 8; index++) { padding[index] = 0x00; } md5_encode(&bits_len, &padding[MD5_BLOCK_SIZE - 8], 8); md5_update(ctx, padding, MD5_BLOCK_SIZE); // 输出结果 md5_encode(ctx->state, digest, MD5_DIGEST_SIZE); // 清空上下文 memset(ctx, 0, sizeof(*ctx)); } // MD5 哈希转换 void md5_transform(MD5_CTX *ctx, const uint8_t *block) { uint32_t a = ctx->state[0], b = ctx->state[1], c = ctx->state[2], d = ctx->state[3]; uint32_t x[16]; md5_decode

C语言MD5算法程序

以下是一个简单的C语言实现MD5算法的程序: ```c #include <stdio.h> #include <string.h> #include <stdint.h> #define ROTLEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) void md5(uint8_t *initial_msg, size_t initial_len, uint8_t *digest) { //定义常量 uint32_t h0, h1, h2, h3; h0 = 0x67452301; h1 = 0xEFCDAB89; h2 = 0x98BADCFE; h3 = 0x10325476; //计算消息长度 uint8_t *msg = NULL; size_t new_len, offset; uint32_t w[16]; int i; for (new_len = initial_len + 1; new_len % 64 != 56; new_len++); msg = (uint8_t*)calloc(new_len + 8, 1); memcpy(msg, initial_msg, initial_len); msg[initial_len] = 0x80; for (offset = initial_len + 1; offset < new_len; offset++); uint64_t bits_len = 8 * initial_len; memcpy(msg + offset, &bits_len, 8); //主循环 for (offset = 0; offset < new_len; offset += (512 / 8)) { //初始化 a, b, c, d uint32_t a, b, c, d; a = h0; b = h1; c = h2; d = h3; //将消息分块,每块512位 for (i = 0; i < 16; i++) { w[i] = ((uint32_t)msg[offset + i * 4]) | (((uint32_t)msg[offset + i * 4 + 1]) << 8) | (((uint32_t)msg[offset + i * 4 + 2]) << 16) | (((uint32_t)msg[offset + i * 4 + 3]) << 24); } //计算四轮循环 uint32_t f, g; for (i = 0; i < 64; i++) { if (i < 16) { f = (b & c) | ((~b) & d); g = i; } else if (i < 32) { f = (d & b) | ((~d) & c); g = (5 * i + 1) % 16; } else if (i < 48) { f = b ^ c ^ d; g = (3 * i + 5) % 16; } else { f = c ^ (b | (~d)); g = (7 * i) % 16; } uint32_t tmp = d; d = c; c = b; b = b + ROTLEFT((a + f + w[g] + 0x5A827999), 5); a = tmp; } //更新哈希值 h0 += a; h1 += b; h2 += c; h3 += d; } //拼接哈希值 memcpy(digest, &h0, sizeof(h0)); memcpy(digest + sizeof(h0), &h1, sizeof(h1)); memcpy(digest + sizeof(h0) + sizeof(h1), &h2, sizeof(h2)); memcpy(digest + sizeof(h0) + sizeof(h1) + sizeof(h2), &h3, sizeof(h3)); //释放内存 free(msg); } int main(int argc, char **argv) { //测试用例 uint8_t digest[16]; md5((uint8_t*)"hello world", strlen("hello world"), digest); //输出结果 int i; for (i = 0; i < 16; i++) { printf("%02x", digest[i]); } printf("\n"); return 0; } ``` 这个程序实现了一个简单的MD5哈希函数,可以将任意长度的输入消息转换为一个128位(16字节)的哈希值。在主函数中,我们对字符串“hello world”进行哈希,然后输出哈希结果。

相关推荐

最新推荐

recommend-type

C语言压缩文件和用MD5算法校验文件完整性的实例教程

主要介绍了C语言压缩文件和用MD5算法校验文件完整性的实例教程,这里演示了Windows下将文件压缩为7z格式以及MD5检验文件和密码的方法,需要的朋友可以参考下
recommend-type

MD5加密算法-c源代码

MD5加密算法-c源代码 MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。 MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为...
recommend-type

野狗优化算法DOA MATLAB源码, 应用案例为函数极值求解以及优化svm进行分类,代码注释详细,可结合自身需求进行应用

野狗优化算法DOA MATLAB源码, 应用案例为函数极值求解以及优化svm进行分类,代码注释详细,可结合自身需求进行应用
recommend-type

2107381120 王孟丽 实验2 (1).docx

2107381120 王孟丽 实验2 (1).docx
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

可见光定位LED及其供电硬件具体型号,广角镜头和探测器,实验设计具体流程步骤,

1. 可见光定位LED型号:一般可使用5mm或3mm的普通白色LED,也可以选择专门用于定位的LED,例如OSRAM公司的SFH 4715AS或Vishay公司的VLMU3500-385-120。 2. 供电硬件型号:可以使用常见的直流电源供电,也可以选择专门的LED驱动器,例如Meanwell公司的ELG-75-C或ELG-150-C系列。 3. 广角镜头和探测器型号:一般可采用广角透镜和CMOS摄像头或光电二极管探测器,例如Omron公司的B5W-LA或Murata公司的IRS-B210ST01。 4. 实验设计流程步骤: 1)确定实验目的和研究对象,例如车辆或机器人的定位和导航。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依