基于STM32的MD5校验

  • 引言
  • 介绍
    • MD5简介及使用场景
    • MD5原理
  • 软件实现
    • 压缩函数
    • 分组读取
    • 应用函数
    • 完整程序
  • MD5工具
  • 后续

引言

我们在嵌入式及单片机的产品开发时,往往需要对一些文件进行检验,来保证此文件是在传输的过程没有被修改或者损坏。比如IAP升级程序时,往往就需要对升级固件进行校验。MD5是其中非常常用的一种检验方式。本文通过使用MD5检验程序,对STM32的Flash中的某一段数据进行检验,检验后存放到字符串里,可用来比对或者输出。

介绍

MD5简介及使用场景

MD5校验(checksum)是通过对接收的传输数据执行散列运算来检查数据的正确性。一个散列函数,比如 MD5,是一个将任意长度的数据字符串转化成短的固定长度的值的单向操作。任意两个字符串不应有相同的散列值(即,有“很大可能”是不一样的,并且要人为地创造出来两个散列值相同的字符串应该是困难的)。
一个 MD5 校验和(checksum)通过对接收的传输数据执行散列运算来检查数据的正确性。计算出的散列值拿来和随数据传输的散列值比较。如果两个值相同,说明传输的数据完整无误、没有被窜改过(前提是散列值没有被窜改),从而可以放心使用。
MD5校验可以应用多个领域,比如说机密资料的检验,下载文件的检验,明文密码的加密等。

MD5原理

MD5的加密过程,整体来看,就是先定义四个值,然后用这四个值,对原文信息进行计算,并得到新的四个值,然后再对原文进行计算,再得到新的四个值,如此循环一定次数,最终对最后的这四个值进行简单的字符串拼接,就得到了最终的密文。
主要就是下面这3步:

  1. 填补信息
    用原文长度位数对512求余,如果结果不为448,就填充到448位。填充是第一位填1,后面填0。512-448=64,用这剩余的64位,记录原文长度。
    最终得到一个填补完的信息(总长=原文长度+512位)
  2. 拿到初始值
    四个初始值,是MD5这个算法提前定义好的,分别是4个32位的值,总共刚好128位。
    我们用ABCD命名:
    A=0xefcdab89
    B=0x89ABCDEF
    C=0x98badcfe
    D=0x10325476
    3、真正的计算
    计算分为多次循环,每次循环,都是用ABCD和原文在第一步填补完的信息,进行计算,最终得到新的ABCD。最后将最后一次ABCD拼成字符串,就是最终的密文。
    循环先分为主循环,每个主循环中又套有子循环。
    主循环次数 = 原文长度/512。
    子循环次数 = 64次。

软件实现

网络上的MD5检验程序有很多,但实现在STM32上的其实并没有几个能用的。本文的程序为我自主编写,并检验使用过的。

压缩函数

    a = A, b = B, c = C, d = D;FF(a, b, c, d, x[0], 7, 0xd76aa478);FF(d, a, b, c, x[1], 12, 0xe8c7b756);FF(c, d, a, b, x[2], 17, 0x242070db);FF(b, c, d, a, x[3], 22, 0xc1bdceee);FF(a, b, c, d, x[4], 7, 0xf57c0faf);FF(d, a, b, c, x[5], 12, 0x4787c62a);FF(c, d, a, b, x[6], 17, 0xa8304613);FF(b, c, d, a, x[7], 22, 0xfd469501);FF(a, b, c, d, x[8], 7, 0x698098d8);FF(d, a, b, c, x[9], 12, 0x8b44f7af);FF(c, d, a, b, x[10], 17, 0xffff5bb1);FF(b, c, d, a, x[11], 22, 0x895cd7be);FF(a, b, c, d, x[12], 7, 0x6b901122);FF(d, a, b, c, x[13], 12, 0xfd987193);FF(c, d, a, b, x[14], 17, 0xa679438e);FF(b, c, d, a, x[15], 22, 0x49b40821);GG(a, b, c, d, x[1], 5, 0xf61e2562);GG(d, a, b, c, x[6], 9, 0xc040b340);GG(c, d, a, b, x[11], 14, 0x265e5a51);GG(b, c, d, a, x[0], 20, 0xe9b6c7aa);GG(a, b, c, d, x[5], 5, 0xd62f105d);GG(d, a, b, c, x[10], 9, 0x02441453);GG(c, d, a, b, x[15], 14, 0xd8a1e681);GG(b, c, d, a, x[4], 20, 0xe7d3fbc8);GG(a, b, c, d, x[9], 5, 0x21e1cde6);GG(d, a, b, c, x[14], 9, 0xc33707d6);GG(c, d, a, b, x[3], 14, 0xf4d50d87);GG(b, c, d, a, x[8], 20, 0x455a14ed);GG(a, b, c, d, x[13], 5, 0xa9e3e905);GG(d, a, b, c, x[2], 9, 0xfcefa3f8);GG(c, d, a, b, x[7], 14, 0x676f02d9);GG(b, c, d, a, x[12], 20, 0x8d2a4c8a);HH(a, b, c, d, x[5], 4, 0xfffa3942);HH(d, a, b, c, x[8], 11, 0x8771f681);HH(c, d, a, b, x[11], 16, 0x6d9d6122);HH(b, c, d, a, x[14], 23, 0xfde5380c);HH(a, b, c, d, x[1], 4, 0xa4beea44);HH(d, a, b, c, x[4], 11, 0x4bdecfa9);HH(c, d, a, b, x[7], 16, 0xf6bb4b60);HH(b, c, d, a, x[10], 23, 0xbebfbc70);HH(a, b, c, d, x[13], 4, 0x289b7ec6);HH(d, a, b, c, x[0], 11, 0xeaa127fa);HH(c, d, a, b, x[3], 16, 0xd4ef3085);HH(b, c, d, a, x[6], 23, 0x04881d05);HH(a, b, c, d, x[9], 4, 0xd9d4d039);HH(d, a, b, c, x[12], 11, 0xe6db99e5);HH(c, d, a, b, x[15], 16, 0x1fa27cf8);HH(b, c, d, a, x[2], 23, 0xc4ac5665);II(a, b, c, d, x[0], 6, 0xf4292244);II(d, a, b, c, x[7], 10, 0x432aff97);II(c, d, a, b, x[14], 15, 0xab9423a7);II(b, c, d, a, x[5], 21, 0xfc93a039);II(a, b, c, d, x[12], 6, 0x655b59c3);II(d, a, b, c, x[3], 10, 0x8f0ccc92);II(c, d, a, b, x[10], 15, 0xffeff47d);II(b, c, d, a, x[1], 21, 0x85845dd1);II(a, b, c, d, x[8], 6, 0x6fa87e4f);II(d, a, b, c, x[15], 10, 0xfe2ce6e0);II(c, d, a, b, x[6], 15, 0xa3014314);II(b, c, d, a, x[13], 21, 0x4e0811a1);II(a, b, c, d, x[4], 6, 0xf7537e82);II(d, a, b, c, x[11], 10, 0xbd3af235);II(c, d, a, b, x[2], 15, 0x2ad7d2bb);II(b, c, d, a, x[9], 21, 0xeb86d391);A += a;B += b;C += c;D += d;

分组读取

 uint8_t j, k;memset(x, 0, 64);ulSampleIndex = 0;for (j = 0; j < 16; j++){for (k = 0; k < 4; k++){if ((ulReadCnt >= ulFlieLength / 1024) && (ulDataIndex >= ulFlieLength % 1024))break;((char *)x)[ulSampleIndex] = ucaFlashBuf[ulDataIndex];ulDataIndex++;ulSampleIndex++;}}

应用函数

    uint16_t usCnt = 0;uint32_t ulFileLen[2] = {0};/* 计算整数部分 */for (ulReadCnt = 0; ulReadCnt < ulFlieLength / 1024; ulReadCnt++){读取你的文件的 1024字节;ulFlashAdd += 1024;for (usCnt = 0; usCnt < 16; usCnt++){ReadGroupTempBuf(ulFlieLength);MD5();}ulDataIndex = 0;}/* 计算余数部分 */memset(ucaFlashBuf, 0, 1025);读取你的文件的文件长度对 1024取余后除以2个字节;ReadGroupTempBuf(ulFlieLength);for (usCnt = 0; usCnt < (ulFlieLength % 1024) / 64; usCnt++){MD5();ReadGroupTempBuf(ulFlieLength);}/* 文件结束补1,补0操作,128二进制即10000000 */((char *)x)[ulFlieLength % 64] = 128;if (ulFlieLength % 64 > 55){MD5(), memset(x, 0, 64);}/* 文件末尾加入原文件的bit长度 */ulFileLen[1] = ulFlieLength / 0x20000000;ulFileLen[0] = (ulFlieLength % 0x20000000) * 8;memcpy(x + 14, ulFileLen, 8);MD5();sprintf(pEsult, "%08X%08X%08X%08X", PP(A), PP(B), PP(C), PP(D));

完整程序

获取方式如下:

  1. #公众号:物联网知识回复:基于STM32的MD5校验
  2. https://blog.csdn.net/qq_44629109/category_11627212.html
  3. https://download.csdn.net/download/qq_44629109/85676113

MD5工具

下载下面的MD5工具,可以直接把文件的MD5转换出来,我们可以用它来测试我们程序的MD5值到底对不对。
https://download.csdn.net/download/qq_44629109/85677447
Windows下可以在命令行中输入
certutil -hashfile 文件位置/文件名 MD5

后续

欢迎关注公众号:物联网知识

基于STM32的MD5校验相关推荐

  1. 基于STM32系列芯片的 IAP实现的探索

    基于STM32系列芯片的 IAP实现的探索 什么是IAP? 如何实现IAP? 第一步:学习官方源代码 第二步:了解STM32芯片基本硬件参数 第三步.搞清除STM32内置Flash 第四步. STM3 ...

  2. 基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计

    目录 1 项目概述 1.1 项目介绍 1.2 项目开发环境 1.3 小组人员及分工 2 需求分析 2.1 系统需求分析 2.2 可行性分析 2.3 项目实施安排 3 系统硬件设计 3.1 系统整体硬件 ...

  3. 基于stm32的室内环境监测系统 9746字

    毕 业 设 计 说 明 书 课题名称 基于STM32的室内环境监测系统 院    系 计算机与软件学院 专    业 嵌入式技术与应用 班    级 嵌设1913 学    号 1902423134 ...

  4. 各种校验之MD5校验

    基于LWIP源码中的MD5校验 /************************************************************************** md5.c -- ...

  5. QT开发一款MD5校验工具

    这是一款基于QT开发的MD5校验工具,在这你可以学习到界面UI的设计方法,以及QT应对字符串的处理方法.以及如何去使用QT进行多线程的开发. 实现后的程序运行截图: MD5.pro工程文件 #---- ...

  6. 基于stm32的温湿度检测案例(一)

    系列文章目录 一.基于stm32的温度检测案例(一) 文章目录 目录 系列文章目录 一.基于stm32的温度检测案例(一) 文章目录 前言 一.实验器材简介 1.1.基于STM32F042F6P6的最 ...

  7. 基于stm32人脸识别和红外测温

    目录 一.项目功能 二.原理图 三.实物视频 四.实物图片 五.程序 资料下载地址:基于STM32人脸识别和红外测温 一.项目功能 本系统由stm32f103c8t6单片机最小系统电路+k210人脸识 ...

  8. 基于STM32的数模转换芯片AD5328驱动程序

    一个项目中需要输出4路0~5V模拟量,主控芯片为STM32F103单片机,选用了AD5328作为DAC输出: AD5328是ADI的一款DAC芯片,可输出8路模拟量,SPI通讯,自己根据AD5328数 ...

  9. python tcp黏包和struct模块解决方法,大文件传输方法及MD5校验

    https://www.cnblogs.com/zaizai1573/p/10230973.html 一.TCP协议 粘包现象 和解决方案 黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令 ...

最新文章

  1. grep及正则表达式
  2. PDF Annotator 8中文版
  3. aws实例启动失败_AWS:启动安装了APOC的Neo4j实例
  4. (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html)WebWork深入浅出
  5. 老司机 iOS 周报 #37 | 2018-09-24
  6. MooTools 1.4 源码分析 - Fx
  7. 最强代码审查工具报告
  8. 转录组测序之各类样品如何取样保存
  9. 互联网大厂数据分析面试常见问题及解法,建议收藏
  10. 俄罗斯的程序员工资高吗?
  11. 进程管理(C/C++)
  12. ABC-Endless Walk-(缩点+拓扑dp)
  13. 第 22 章 动态属性和特性
  14. 微信小程序获取位置信息基于腾讯地图实现
  15. 如何成为靠谱的DotNet/C#程序员 (sunxiunan)(zz)
  16. pve万兆网卡驱动_PVE+lede+DSM网卡硬盘直通+win10
  17. edvac是商用计算机吗,计算机的基础作业1
  18. 企业微信有朋友圈?企业微信朋友圈如何正确使用?
  19. 【CSS 形状 (Shapes)】
  20. 自定义控件之-横线指示器

热门文章

  1. 对力螺旋(wrench)的理解
  2. 28 令人印象深刻的亮色系网站设计灵感
  3. THINKPAD笔记本电脑电池使用技巧
  4. mysql分条件查询--choose
  5. SecureCRT如何直接执行vb脚本运维脚本的方法
  6. 王亚卿任京东商城首任CTO
  7. 小飞机游戏C语言程序划拳
  8. Linux(程序设计):66---简略版的线程池设计
  9. C#对不同的类的员工,计算相应的工资
  10. uboot中挂载U盘,利用FAT文件系统读写U盘文件