适合单片机的MD5源码

时间: 2023-08-05 08:05:00 浏览: 37
以下是适用于单片机的MD5算法的C语言源代码示例: ``` #include <stdint.h> #define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c)))) void md5_transform(uint32_t state[4], const uint8_t block[64]) { uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16]; for (int i = 0; i < 16; i++) { x[i] = (uint32_t)block[i * 4] | ((uint32_t)block[i * 4 + 1] << 8) | ((uint32_t)block[i * 4 + 2] << 16) | ((uint32_t)block[i * 4 + 3] << 24); } // Round 1 for (int i = 0; i < 16; i++) { uint32_t f = (b & c) | ((~b) & d); int g = i; uint32_t tmp = d; d = c; c = b; b = b + LEFTROTATE((a + f + x[g]), 7); a = tmp; } // Round 2 for (int i = 0; i < 16; i++) { uint32_t f = (d & b) | ((~d) & c); int g = (5 * i + 1) % 16; uint32_t tmp = d; d = c; c = b; b = b + LEFTROTATE((a + f + x[g] + 0x5A827999), 12); a = tmp; } // Round 3 for (int i = 0; i < 16; i++) { uint32_t f = b ^ c ^ d; int g = (3 * i + 5) % 16; uint32_t tmp = d; d = c; c = b; b = b + LEFTROTATE((a + f + x[g] + 0x6ED9EBA1), 17); a = tmp; } // Round 4 for (int i = 0; i < 16; i++) { uint32_t f = c ^ (b | (~d)); int g = (7 * i) % 16; uint32_t tmp = d; d = c; c = b; b = b + LEFTROTATE((a + f + x[g] + 0x8F1BBCDC), 22); a = tmp; } state[0] += a; state[1] += b; state[2] += c; state[3] += d; } void md5(const uint8_t *initial_msg, size_t initial_len, uint8_t *digest) { // These vars will contain the hash uint32_t h0, h1, h2, h3; // Initialize variables - simple count in nibbles: h0 = 0x67452301; h1 = 0xEFCDAB89; h2 = 0x98BADCFE; h3 = 0x10325476; // Pre-processing: uint8_t *msg = NULL; size_t new_len, offset; 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; // append the "1" bit; most significant bit is "first" for (offset = 0; offset < 8; offset++) { msg[new_len + offset] = initial_len >> (offset * 8); // append length in bits } // Process the message in successive 512-bit chunks: for (int i = 0; i < new_len; i += 64) { md5_transform((uint32_t*)(msg + i), h0, h1, h2, h3); } // Produce the final hash value (little-endian): uint8_t buf[16]; memcpy(buf, &h0, 4); memcpy(buf + 4, &h1, 4); memcpy(buf + 8, &h2, 4); memcpy(buf + 12, &h3, 4); memcpy(digest, buf, 16); free(msg); } ``` 这段代码实现了MD5算法的核心部分,可以在单片机上使用。需要注意的是,这段代码只提供了算法的核心部分,需要结合具体的应用场景和需求进行修改和补充。

相关推荐

最新推荐

recommend-type

51单片机与上位机串口通讯单片机.(包含51单片机和上位机的源码)

51单片机与上位机串口通讯,通过上位机发送ASCII给51单片机,51单片机数码管显示ASCCII值(包括课程设计文档,上位机和51单片机的源码,可直接使用)
recommend-type

适合单片机实时处理的简单FIR滤波器设计

本滤波器结构简单、占用资源少、滤波效果好,非常适用于嵌入式便携设备中的信号滤波。同时,该滤波器的计方法也可以推广到其他相似性能指标的滤波器设计中在科研实践中一定会有较大的发展前途。
recommend-type

基于51单片机的十字路口交通灯控制系统设计(含源码及仿真图)

基于51单片机的十字路口交通灯控制系统设计(含源码及仿真图) (1)东西、南北方向各设有一个绿、黄、红指示灯,两个显示数码管。 (2)两个方向交替允许通行,基本放行时间为25s,另外有黄灯闪烁5s。 (3)控制人员可以...
recommend-type

免费下载基于51单片机的直流电机调速系统+Proteus源码+部分代码实现.pdf

本此课程设计选择STC89C52单片机作为主控芯片,选取带有光电编码器的直流电机作为被控对象,利用单片机的T0定时器产生PWM信号并送到直流电机。在Proteus仿真环境下搭建了L298N直流电机驱动电路、矩阵键盘扫描电路...
recommend-type

单片机功耗的计算办法  

单片机的功耗是非常难算的,而且在高温下,单片机的功耗还是一个特别重要的参数。
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

spring添加xml配置文件

1. 创建一个新的Spring配置文件,例如"applicationContext.xml"。 2. 在文件头部添加XML命名空间和schema定义,如下所示: ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
recommend-type

JSBSim Reference Manual

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