你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32计算文件MD5值校验数据

[复制链接]
STMCU小助手 发布时间:2022-4-23 16:45
首先介绍一下什么是MD5:
" q9 {. x& f3 r' @一、MD5计算将整个文件或者字符串,通过其不可逆的字符串变换计算,产生文件或字符串的MD5散列值。任意两个文件、字符串不会有相同的散列值(即“很大可能”是不一样的,理论上要创造出两个散列值相同的字符串是很困难的)。  K$ L' b. {' _( H
二、因此MD5常用于校验字符串或者文件,以防止文件、字符串被“篡改”。因为如果文件、字符串的MD5散列值不一样,说明文件内容也是不一样的,即经过修改的,如果发现下载的文件和给的MD5值不一样,需要慎重使用。) a" Z9 z. ~9 `9 v
三、MD5文件校验用途非常多,例如:游戏补丁包的校验,病毒文件确认,APP提审校验等;如果要确认某一个文件的完整性和正确性,都会使用MD5进行校验。. B5 W0 P3 ~  R( |1 Y
怎么用STM32计算文件MD5值
! f! L! {* A* P. l1 U. }$ E就是下面一段代码,说起来就有点多了直接给代码吧。全是数学计算。底部有完整工程链接
8 ~: g# V: g/ m1 o" J
* @- U9 D! e# `9 ]$ ?6 c- t
  1. #include "md5.h"1 N6 T, m1 D) i+ m
  2. #include "ff.h"  
    / ]; W% _* y) E. V+ y+ j% b
  3. #include "exfuns.h"
    1 Y4 g" N% `" w: l$ t2 H

  4. # \  o6 z6 j  L  \. u3 O# l/ k
  5. unsigned int A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476,a,b,c,d,flen[2],x[16];
    & l2 c7 z, G/ d) s* [
  6. u16 i = 0;& ]  A2 ^3 z5 s2 b7 L% j- V$ |* W
  7. u16 j = 0;
    ; _& M" b. h3 H$ G0 W0 _
  8. u16 k = 0;. \; V1 M% f' O9 I2 d0 t6 W$ _

  9. / ]' Y* r$ q" C5 L) Q
  10. u8 Temp_Ex_Flash[1025];//定义暂时存储1K外部flash内bin文件; B  v7 \% x) l# m& c- B2 S
  11. ; K6 i$ G$ P+ g, ~. S/ q
  12. void md5(void){                 //MD5主要计算2 I! l/ G( [+ S. e- d5 V9 x

  13. 9 s% V& M$ f4 D: G/ R) f
  14.   a=A,b=B,c=C,d=D;
    ( {) T$ n) c  k; H- Y
  15. 8 o  g1 N% Q( Z; R1 |5 L
  16.   FF (a, b, c, d, x[ 0],  7, 0xd76aa478); 7 p% t# b( o  z, c# g9 |
  17.   FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); + j5 L6 Z# C2 U5 ]: v" D) d
  18.   FF (c, d, a, b, x[ 2], 17, 0x242070db); : t8 i  r4 |1 Y: [% }
  19.   FF (b, c, d, a, x[ 3], 22, 0xc1bdceee);
    * j! v, @- ?9 U  {* U8 T
  20.   FF (a, b, c, d, x[ 4],  7, 0xf57c0faf);
    ; j$ e, M1 @1 [4 n
  21.   FF (d, a, b, c, x[ 5], 12, 0x4787c62a); ; }. u9 H$ U9 U- Q; V
  22.   FF (c, d, a, b, x[ 6], 17, 0xa8304613);
    4 _- [+ ~0 F) r' Z
  23.   FF (b, c, d, a, x[ 7], 22, 0xfd469501);
    / e& o; h- q+ f2 D" R0 d
  24.   FF (a, b, c, d, x[ 8],  7, 0x698098d8);
    - q9 o+ J4 o% u& y) E- v' P
  25.   FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); : Q- s  K4 l* X
  26.   FF (c, d, a, b, x[10], 17, 0xffff5bb1);
    0 f$ p7 ?' \$ W5 v7 h
  27.   FF (b, c, d, a, x[11], 22, 0x895cd7be);
      c8 a* a+ b2 z- u' z
  28.   FF (a, b, c, d, x[12],  7, 0x6b901122);
    : r3 R  u( q& Z0 \
  29.   FF (d, a, b, c, x[13], 12, 0xfd987193); 3 @% j9 `& @6 h/ i
  30.   FF (c, d, a, b, x[14], 17, 0xa679438e); ' W1 B9 v! H7 U  e; s7 D6 _$ _* r
  31.   FF (b, c, d, a, x[15], 22, 0x49b40821);
    6 |( [1 z( u* C7 W/ _

  32. 4 g5 S4 f3 e7 W# B4 K( X

  33. 7 k9 `7 \; g  M7 g6 f; ]$ S: [7 S) O
  34.   GG (a, b, c, d, x[ 1],  5, 0xf61e2562);
    : Y* E' d  Y5 r- A- L- P8 |
  35.   GG (d, a, b, c, x[ 6],  9, 0xc040b340);
    # c, B1 ?/ T% B7 @/ i! k* m
  36.   GG (c, d, a, b, x[11], 14, 0x265e5a51); ) V# }3 p  m4 g* |5 i4 t& D1 D. `' q
  37.   GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa);
    / U# h4 P5 R$ P2 E2 Y# L! s
  38.   GG (a, b, c, d, x[ 5],  5, 0xd62f105d);
    / ~% Q9 I& }6 F9 o+ h+ K
  39.   GG (d, a, b, c, x[10],  9, 0x02441453); : |1 V  X' x+ W+ M0 F. M
  40.   GG (c, d, a, b, x[15], 14, 0xd8a1e681); 2 \0 A- J( E7 M0 z: r' L2 P. @
  41.   GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); 6 ?' T$ G+ l0 t& u$ j4 f
  42.   GG (a, b, c, d, x[ 9],  5, 0x21e1cde6); , w1 g& s0 c2 O; v1 M9 h
  43.   GG (d, a, b, c, x[14],  9, 0xc33707d6); & S' ]! P4 I! o8 x5 t
  44.   GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); ' e# r, Q# M% p9 e1 Z6 x. W* O9 D
  45.   GG (b, c, d, a, x[ 8], 20, 0x455a14ed);
    $ g; T9 E. k# z, O$ V
  46.   GG (a, b, c, d, x[13],  5, 0xa9e3e905); & Y6 {% f9 V/ v. i$ \
  47.   GG (d, a, b, c, x[ 2],  9, 0xfcefa3f8); ' ^+ F7 H- H' f6 m9 x
  48.   GG (c, d, a, b, x[ 7], 14, 0x676f02d9); 7 @; o, B" {$ c; P, E
  49.   GG (b, c, d, a, x[12], 20, 0x8d2a4c8a);
    0 h2 ~1 t8 E7 n0 `8 w
  50. - N% A3 i4 B8 M5 X5 [
  51. ! }2 u1 @) N' w
  52.   HH (a, b, c, d, x[ 5],  4, 0xfffa3942);
    6 Q4 E6 ?/ e* A* _/ o3 G
  53.   HH (d, a, b, c, x[ 8], 11, 0x8771f681); ( B! k! G+ t4 C4 z: J
  54.   HH (c, d, a, b, x[11], 16, 0x6d9d6122); . ^: [1 C7 P1 m4 f) a$ @
  55.   HH (b, c, d, a, x[14], 23, 0xfde5380c);
    6 l0 `' D, [  o4 N. K. L
  56.   HH (a, b, c, d, x[ 1],  4, 0xa4beea44);
    2 I, k9 g/ M( R1 Z7 ?
  57.   HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9);
    5 b, U- V2 J0 E/ e: c# M
  58.   HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); : C" Z- _/ \* ~6 D5 W
  59.   HH (b, c, d, a, x[10], 23, 0xbebfbc70);
    : P% @( Y8 K% y+ A+ h" v1 _
  60.   HH (a, b, c, d, x[13],  4, 0x289b7ec6); - K9 f# `& N6 X( r( M9 S
  61.   HH (d, a, b, c, x[ 0], 11, 0xeaa127fa);
    : L7 R8 F/ X" O% o, g4 ^/ X: [
  62.   HH (c, d, a, b, x[ 3], 16, 0xd4ef3085);
    # Z2 f$ k, I& v% V8 v* M# s
  63.   HH (b, c, d, a, x[ 6], 23, 0x04881d05); 9 Q' f) S  Y* s' D  W" T2 G) ~
  64.   HH (a, b, c, d, x[ 9],  4, 0xd9d4d039); % X8 U; i. Z0 w- A3 y! S8 ~. i8 l
  65.   HH (d, a, b, c, x[12], 11, 0xe6db99e5);   m6 l8 q7 A5 r* W$ o* @
  66.   HH (c, d, a, b, x[15], 16, 0x1fa27cf8);
      J# ]" j9 _5 L7 d
  67.   HH (b, c, d, a, x[ 2], 23, 0xc4ac5665);
    ; i' a9 D; {3 A) o# e* P

  68. 0 P9 ~# ?: l5 r/ R8 M# m
  69. ! K3 {9 M7 {. a! _+ Q2 j' \4 C
  70.   II (a, b, c, d, x[ 0],  6, 0xf4292244); " V0 e% _" [6 p  f" x( J7 V
  71.   II (d, a, b, c, x[ 7], 10, 0x432aff97);
    3 d* O" S6 j7 {' C* X6 H
  72.   II (c, d, a, b, x[14], 15, 0xab9423a7);
    ( E' U; p# _' j  x
  73.   II (b, c, d, a, x[ 5], 21, 0xfc93a039);
    2 J0 \/ D- r6 q: d
  74.   II (a, b, c, d, x[12],  6, 0x655b59c3);
    % W: O9 B2 J0 l; d# J
  75.   II (d, a, b, c, x[ 3], 10, 0x8f0ccc92);
    4 [9 R& ~  S3 _$ ]' F! D' I
  76.   II (c, d, a, b, x[10], 15, 0xffeff47d); * s6 A+ B" n; G6 ]0 i
  77.   II (b, c, d, a, x[ 1], 21, 0x85845dd1); " Y! v. j" m. Z9 w9 I$ d; ]5 T
  78.   II (a, b, c, d, x[ 8],  6, 0x6fa87e4f);
    % L0 y# y3 X8 Y
  79.   II (d, a, b, c, x[15], 10, 0xfe2ce6e0);
    + R! Z+ @( K4 Y. q& V0 f/ a7 T( {
  80.   II (c, d, a, b, x[ 6], 15, 0xa3014314);
    * R5 I& j) w) S
  81.   II (b, c, d, a, x[13], 21, 0x4e0811a1);
    - @! T7 O4 y) n2 o9 T5 s
  82.   II (a, b, c, d, x[ 4],  6, 0xf7537e82);
    ! U- M4 X8 K2 K  h8 w  T
  83.   II (d, a, b, c, x[11], 10, 0xbd3af235); : l& @! l6 p' j  R8 y
  84.   II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb);
    # L) v8 U, w4 e& O( T" l
  85.   II (b, c, d, a, x[ 9], 21, 0xeb86d391); 7 {1 z  x9 Z8 F$ L4 q2 T5 J. }
  86. & {% X2 S% w8 X" l  a# L) d
  87.   A += a;6 [5 r; z2 c2 ?& O* N2 ?9 I
  88.   B += b;7 a' q* q3 @1 R& w$ o# v  j1 c+ J
  89.   C += c;2 d' O( ^9 g5 j6 h
  90.   D += d;: A3 O: C" q7 U. |7 _

  91. 1 n( l+ h- y4 H3 O
  92. }3 z5 J, v5 y% L- y3 w7 V, t

  93. ) t( f" X( g0 G* O- O
  94. unsigned int sample_index = 0; //从TEST_data采集64位个字节7 ]4 U; K4 @9 a$ r! t
  95. unsigned int data_index = 0;   //bin文件字符索引,固件bin文件大小不要超过65K2 R3 x) ^+ e/ H
  96. unsigned int read_times = 0;
    : {6 r+ M4 R$ m' h: V( T
  97. unsigned int BIN_location = 0;8 {" g7 J4 a% z) _0 i4 Q

  98. & u, b; c3 F3 v0 Q# Y+ W
  99. void data_reset()
    / p# w+ W  s- ~* w) E
  100. {
    0 y4 B7 H0 i0 q9 z) E) n0 o
  101.         sample_index = 0;3 S* G% V% R. e4 b
  102.         data_index = 0;
    3 V+ k% Z/ v& U1 B4 I- p. x( y' C) f/ _
  103.         read_times = 0;
    % Z' p2 i/ U0 \5 `) l- u
  104.         BIN_location = 0;
    ; g) Z2 i4 g4 C* p6 a* j
  105.         A=0x67452301;
    9 X3 M5 y9 m& a5 C2 u
  106.         B=0xefcdab89;
    ' `. K, t+ M5 {2 H- E9 ?
  107.         C=0x98badcfe;! S9 h# ^* ?) W, o8 {6 b/ \( r' S
  108.         D=0x10325476;; D$ a% ?; Z% h6 v; ?. q% m  E
  109.         a=0;
    1 J9 X& s# T4 {. n& F6 [  j+ _
  110.         b=0;
    , I5 j) ^- ?0 I+ u2 a; L. R4 C
  111.         c=0;$ @6 E# R& M) P# q! h+ i1 y
  112.         d=0;* i" H5 H% v3 Q: v+ w- u3 R
  113.         memset(flen,0x00,sizeof(flen));
    - ?" X4 I# B! y1 G  m# a
  114.         memset(x,0x00,sizeof(x));
    $ o* T7 v( t# e2 v; f
  115. }
    4 @9 L4 r) y& ^8 B$ p
  116. ) q! ]" n( S! F# m7 X
  117. void read_group_tempbuf(unsigned long fileSize)5 k9 \. i$ f7 ~" w/ I, A
  118. {
    , a+ a1 @9 O* L, m  J( e
  119.         memset(x,0,64);        
    6 v! O$ W' V5 y% }2 c" p
  120.         sample_index = 0;
    2 z1 J6 a/ k+ W0 \" X- Q) p
  121.         for(j = 0;j < 16;j++)//fread(&x,4,16,fp) 以4字节为一组,共16组往x写入数据
    9 I1 _6 c; T8 z/ v- B2 e
  122.         {0 {) j% S: p) j; G& A
  123.                 for(k = 0;k < 4;k++)( x8 m7 b9 {3 J4 g0 n# ]* i- W
  124.                 {. S7 J5 Z( K8 M8 P2 ?
  125.                         if((read_times >= fileSize/1024)&&(data_index >= fileSize%1024)) break;//当对最后一部分小于1K的bin文件处理' M3 v9 f0 d; L
  126.                         , ]8 U0 R6 n/ @5 p- c$ |# |0 `
  127.                         ((char*)x)[sample_index] = Temp_Ex_Flash[data_index];8 W( ~: n# N/ Y4 S5 f* O
  128.                         data_index++;
      d9 g+ `0 O* L3 r# c( e: f/ O1 U
  129.                         sample_index++;
    5 Y+ A7 [8 M- \  p& M3 L: g: x
  130.                 }
    / B4 D3 f& x5 u. T) w: q
  131.         }0 ~5 ], P9 N( Q; U! F* h! u
  132. }
    & b  e- V9 g. |/ o% g2 x7 J# d

  133. 8 D9 f$ ]+ }- }: p. n: F7 I
  134. 3 V# ]: l* e# C6 Y( c. V
  135. 3 f9 Z8 ]  ?( A; I+ S# |# c* y
  136. void get_bin_md5(unsigned long fileSize,char *result)
    - S  c! g- H5 f5 ]
  137. {
    ( d6 ]3 ]0 C9 m; _
  138.         unsigned short i = 0;; u6 {& \  H4 N. Z
  139.         UINT br;3 b/ b6 p" a6 A
  140.         FIL file;4 {* s% e! Q5 h
  141.         $ G' S7 t' n6 O
  142.         data_reset();
    , |. {; @  K$ ^3 I, {4 p  ]
  143.         9 n" b/ v' ~6 ]
  144.         f_open(&file,"/car.bin",FA_READ);
    8 s* z# S8 O2 f! F6 O' T# \# \
  145.         for(read_times = 0;read_times < fileSize/1024;read_times++)//对整K进行md5计算
    6 j/ Z+ o6 d$ [% n& B1 ~" q, v
  146.         {
    . c% Y  n! X% X+ @
  147.                 f_read (&file, &Temp_Ex_Flash,1024, &br);   ' J( R. i, K7 I( B
  148.                 BIN_location += 1024;- b' l  I9 R# m9 g
  149.                
    * E1 k) d* R) l+ O* p
  150.                 for(i = 0;i < 16;i++)//刚好对读出的1Kbin文件进行md5计算
    " g8 z; o) _; e4 L" |$ H) o) c/ e' m
  151.                 {! |1 z; j$ h" T* Q! L( b
  152.                         read_group_tempbuf(fileSize);2 m' [& C0 N: `7 C$ B: O2 O
  153.                         md5();        3 z" g" ?; v" E* N
  154.                 }; P' p1 s# h# y% ?4 q% P& k, ^* ?8 s8 y
  155.                 data_index = 0;//最大只到1023* D* _# k, y# _8 s% [
  156.         }
    ( c3 h- u$ ?' E. h; e% h: c- S
  157.         memset(Temp_Ex_Flash,0,1025);
    9 _# m2 \3 I! D/ y$ V
  158.         f_read (&file, &Temp_Ex_Flash,fileSize%1024, &br); 1 H  a+ D) P1 f0 V
  159.         4 I4 @- Z2 p9 [8 D
  160.         
    ( }" w1 t# l/ `# j
  161.         read_group_tempbuf(fileSize);
    7 v# {8 |+ P3 ?0 b. W
  162.         for(i = 0;i < (fileSize%1024)/64;i++)/ Z5 X# |' C- s/ @
  163.         {
    1 [) e% ~/ O, r, Z0 C$ J' j
  164.                 md5();
    5 m# E* @# N% h: m  c  ^
  165.                 read_group_tempbuf(fileSize);0 x" U; W, y  H! b, g. p
  166.         }9 I( p& m: D* g9 x7 N3 Y
  167.         ((char*)x)[fileSize%64]=128;//文件结束补1,0操作 10000000( V% J/ P8 b: S* I) W
  168.         
    * {: |3 c8 b. a* k( y! P
  169.         flen[1]=fileSize/0x20000000;   //转换二进制文件大小(byte->bit)
    7 E1 N+ }# [( E3 T
  170.         flen[0]=(fileSize%0x20000000)*8;9 z$ v) [5 R, o7 x1 ]5 Z
  171.         / L* e  d- C+ V+ |; W
  172.         if(fileSize%64>55) md5(),memset(x,0,64);: T2 Y( z; T8 F1 C. O( k: a+ p
  173.         memcpy(x+14,flen,8);, U  Z! a' M1 x
  174.         md5();, X8 R0 D1 |4 r& g
  175.         sprintf(result,"%08x%08x%08x%08x",PP(A),PP(B),PP(C),PP(D));
    , F% e; x6 H; ~' Q; G
  176.         8 S& O2 f  j* a: W3 f
  177. }
    8 O: B1 k& k& F8 W) B9 J

  178. 5 K; S9 P) e' b1 ~, I: f/ L

  179. 2 u, Y1 y, m- U( d" y; }9 }
复制代码
1 u" c6 n3 G, ?4 [1 a" r" A! n
8 c8 X# G5 K8 a# y4 l3 @2 f
赞 收藏 评论0 发布时间:2022-4-23 16:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版