首先介绍一下什么是MD5:
一、MD5计算将整个文件或者字符串,通过其不可逆的字符串变换计算,产生文件或字符串的MD5散列值。任意两个文件、字符串不会有相同的散列值(即“很大可能”是不一样的,理论上要创造出两个散列值相同的字符串是很困难的)。
二、因此MD5常用于校验字符串或者文件,以防止文件、字符串被“篡改”。因为如果文件、字符串的MD5散列值不一样,说明文件内容也是不一样的,即经过修改的,如果发现下载的文件和给的MD5值不一样,需要慎重使用。
三、MD5文件校验用途非常多,例如:游戏补丁包的校验,病毒文件确认,APP提审校验等;如果要确认某一个文件的完整性和正确性,都会使用MD5进行校验。
怎么用STM32计算文件MD5值
就是下面一段代码,说起来就有点多了直接给代码吧。全是数学计算。底部有完整工程链接

#include "md5.h"
#include "ff.h"
#include "exfuns.h" unsigned int A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476,a,b,c,d,flen[2],x[16];
u16 i = 0;
u16 j = 0;
u16 k = 0;u8 Temp_Ex_Flash[1025];//定义暂时存储1K外部flash内bin文件void md5(void){                 //MD5主要计算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;}unsigned int sample_index = 0; //从TEST_data采集64位个字节
unsigned int data_index = 0;   //bin文件字符索引,固件bin文件大小不要超过65K
unsigned int read_times = 0;
unsigned int BIN_location = 0;void data_reset()
{sample_index = 0;data_index = 0;read_times = 0;BIN_location = 0;A=0x67452301;B=0xefcdab89;C=0x98badcfe;D=0x10325476;a=0;b=0;c=0;d=0;memset(flen,0x00,sizeof(flen));memset(x,0x00,sizeof(x));
}void read_group_tempbuf(unsigned long fileSize)
{memset(x,0,64);    sample_index = 0;for(j = 0;j < 16;j++)//fread(&x,4,16,fp) 以4字节为一组,共16组往x写入数据{for(k = 0;k < 4;k++){if((read_times >= fileSize/1024)&&(data_index >= fileSize%1024)) break;//当对最后一部分小于1K的bin文件处理((char*)x)[sample_index] = Temp_Ex_Flash[data_index];data_index++;sample_index++;}}
}void get_bin_md5(unsigned long fileSize,char *result)
{unsigned short i = 0;UINT br;FIL file;data_reset();f_open(&file,"/car.bin",FA_READ);for(read_times = 0;read_times < fileSize/1024;read_times++)//对整K进行md5计算{f_read (&file, &Temp_Ex_Flash,1024, &br);   BIN_location += 1024;for(i = 0;i < 16;i++)//刚好对读出的1Kbin文件进行md5计算 {read_group_tempbuf(fileSize);md5(); }data_index = 0;//最大只到1023}memset(Temp_Ex_Flash,0,1025);f_read (&file, &Temp_Ex_Flash,fileSize%1024, &br); read_group_tempbuf(fileSize);for(i = 0;i < (fileSize%1024)/64;i++){md5();read_group_tempbuf(fileSize);}((char*)x)[fileSize%64]=128;//文件结束补1,0操作 10000000flen[1]=fileSize/0x20000000;   //转换二进制文件大小(byte->bit)flen[0]=(fileSize%0x20000000)*8;if(fileSize%64>55) md5(),memset(x,0,64);memcpy(x+14,flen,8);md5();sprintf(result,"%08x%08x%08x%08x",PP(A),PP(B),PP(C),PP(D));}

完整工程链接

STM32计算文件MD5值校验数据相关推荐

  1. windows/linux计算文件 MD5值

    windows 计算文件 MD5值 cmd下输入: certutil -hashfile filename MD5 如: certutil -hashfile C:\1.txt MD5 //打印到屏幕 ...

  2. Java 获取文件md5值校验文件

    假如我们想校验两个文件网络传输中是否改变了,或者校验两个文件是否一致可以使用md5校验. 代码: import java.io.FileInputStream; import java.io.Inpu ...

  3. python计算文件md5值_用python 正确计算大文件md5 值

    python 计算文件的md5值很方便,但如果只是简单的把文件都入到内存中,大文件会导致问题,一般采用切片的方式分段计算,下面的几个函数可以很好的解决这个问题. 使用 hashlib import h ...

  4. python计算文件md5值_用python计算文件的MD5值

    md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等.下面讲解在python中如何使用md5算法 ...

  5. python计算文件md5值

    较小文件处理方法: import hashlib import osdef GetSmallFile(file_path):md5 = Noneif os.path.isfile(file_path) ...

  6. 计算文件的md5;vue计算文件md5值;计算图片的md5值;

    github链接 1.先下载 npm i browser-md5-file -S 2.在使用的vue页面引入和声明方法 import BMF from 'browser-md5-file' const ...

  7. Windows 计算文件MD5值

    certutil -hashfile yourfilename.ext MD5 certutil -hashfile yourfilename.ext SHA1 certutil -hashfile ...

  8. java计算图片md5_java 计算 文件 md5

    public class MD5Check { /** * 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合 */     pro ...

  9. 视频文件MD5值获取及校验

    最近在做大文件分割,分片上传,达到充分利用网络带宽 > 文件的上传与下载极易出错,尤其涉及使用断点续传方式上传或下载的文件. > 目的:校验MD5值是为了防止在传输的过程当中丢包或者数据包 ...

最新文章

  1. 困扰一天啦,求大神不吝指导,Camera的onPreviewFrame中的问题
  2. 图像处理之边缘检测概述
  3. 关于 Unity WebGL 的探索
  4. 山东大学 2020级数据库系统 实验四
  5. linux服务器程序开发,怎样搭建一个linux开发服务器
  6. Hibernate异常之关键字错误
  7. Hibernate 添加数据 一 (一对多)
  8. Oracle RAC万能集群测试大全 支持11g/12c/18c/19c版本
  9. 小家电的精致生活幻想,都在闲鱼上被粉碎了
  10. Oracle 11g EM安全证书问题无法访问的解决办法
  11. 【顶会论文解析】罪行预测
  12. iOS ViewController利用代理页面传值
  13. 【步步到位】mysql安装教程 8.0.26
  14. 数字翻译程序(PTA厦大慕课)
  15. 学术规范作业——心得体会
  16. 低端交换机环路检测专题
  17. Netflix如何在上万台机器中管理微服务?(史上最全)
  18. easyexcel 在 设置标题_七. EasyExcel标题加批注和标题字体填充红色
  19. 理科生在爱情上为什么总吃亏?
  20. 01-ESP8266的STA模式学习

热门文章

  1. python的内置函数功能[翻译]
  2. mmsegmentation自定义新数据集
  3. 拉上谷歌高通 三星围攻苹果
  4. PHPCMSV9 企业黄页 黄页企业模板添加方法
  5. 安全框架-SpringSecurity
  6. 自绘动画android,(译)android利用Canvas和几何学绘制几何动画
  7. 小米 微信:无法连接服务器,微信出现大规模故障 多地无法登录
  8. 条形码、二维码扫一扫和生成二维码采用ZXing3.0开源库在android studio中实现
  9. 与ck读音相同的单词有哪些
  10. 思科交换机冗余星形设计,附带sw1核心交换机配置