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

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

[复制链接]
STMCU小助手 发布时间:2022-4-23 16:45
首先介绍一下什么是MD5:
( Z! U1 B: O0 O$ w3 v8 @$ H一、MD5计算将整个文件或者字符串,通过其不可逆的字符串变换计算,产生文件或字符串的MD5散列值。任意两个文件、字符串不会有相同的散列值(即“很大可能”是不一样的,理论上要创造出两个散列值相同的字符串是很困难的)。) G1 Q4 }! s5 v. i$ \5 t7 a
二、因此MD5常用于校验字符串或者文件,以防止文件、字符串被“篡改”。因为如果文件、字符串的MD5散列值不一样,说明文件内容也是不一样的,即经过修改的,如果发现下载的文件和给的MD5值不一样,需要慎重使用。
2 B$ ]3 P4 `# u6 x三、MD5文件校验用途非常多,例如:游戏补丁包的校验,病毒文件确认,APP提审校验等;如果要确认某一个文件的完整性和正确性,都会使用MD5进行校验。" \" c8 ]. g8 u& K
怎么用STM32计算文件MD5值
( R  |" ~, ?2 ^' h% M3 j: K! t就是下面一段代码,说起来就有点多了直接给代码吧。全是数学计算。底部有完整工程链接( p) P4 X- K/ a3 M
; [4 C2 p% [! b* f2 ~
  1. #include "md5.h"
    7 I, e" @$ |8 _5 F1 t3 h: M2 u9 ^
  2. #include "ff.h"  
    7 j" O( [9 C5 O& h5 c
  3. #include "exfuns.h"
    ) ?0 g+ ]8 u, o, z4 E, N
  4.   V" [! @7 u3 W& c# I# c( C
  5. unsigned int A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476,a,b,c,d,flen[2],x[16];
    1 A6 B$ S0 t# C7 ~5 o' P
  6. u16 i = 0;
    7 p2 c% m) ?5 b& W- g4 R6 h; @9 A
  7. u16 j = 0;; O" e# I2 D6 q1 q
  8. u16 k = 0;1 T4 O$ [" U, K& L1 G8 T) R7 w) G

  9. & L: J5 p1 S- U8 ^$ Z2 M1 R5 q
  10. u8 Temp_Ex_Flash[1025];//定义暂时存储1K外部flash内bin文件( D. r7 r8 \( l9 o+ B! |( W6 a
  11. 1 d5 h; @3 x* Q4 o+ K0 l8 X+ n
  12. void md5(void){                 //MD5主要计算
    & T& _& T8 v" A3 V' A# c( `6 {
  13. . m1 j# J* L0 T. Q! x$ M
  14.   a=A,b=B,c=C,d=D;" [3 `  F) C' a; w6 W1 ^; d

  15. / U- r: `; B/ t: a9 e& T! R
  16.   FF (a, b, c, d, x[ 0],  7, 0xd76aa478);
    # T: }: i8 d$ W/ ?# ]: o
  17.   FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); 9 D/ {. R* k+ |7 R
  18.   FF (c, d, a, b, x[ 2], 17, 0x242070db);
    9 b! j% B0 h* E
  19.   FF (b, c, d, a, x[ 3], 22, 0xc1bdceee);
    / _, `0 [7 @6 y8 H3 _
  20.   FF (a, b, c, d, x[ 4],  7, 0xf57c0faf); 5 I- c5 b# s) Z) X7 q' V: p: N7 o
  21.   FF (d, a, b, c, x[ 5], 12, 0x4787c62a); 4 x  u( s' B; B8 ?& J' o
  22.   FF (c, d, a, b, x[ 6], 17, 0xa8304613);
    : S  g; `/ Y5 l) ^! D
  23.   FF (b, c, d, a, x[ 7], 22, 0xfd469501);
    8 O* Y, B: F# l
  24.   FF (a, b, c, d, x[ 8],  7, 0x698098d8); 9 n' P& T9 S1 z% r" Z9 m/ P
  25.   FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); - @3 L' u! A  `. ?( A
  26.   FF (c, d, a, b, x[10], 17, 0xffff5bb1);
    , U8 Y7 k! x! P
  27.   FF (b, c, d, a, x[11], 22, 0x895cd7be); 1 b+ ~. S* E" g! u5 k( Q
  28.   FF (a, b, c, d, x[12],  7, 0x6b901122);
    5 C7 d4 h6 ?, w
  29.   FF (d, a, b, c, x[13], 12, 0xfd987193); 9 G# v, G% `- N! Q' s$ R
  30.   FF (c, d, a, b, x[14], 17, 0xa679438e); & d. Z8 j, |3 ]+ p" ^% U" X
  31.   FF (b, c, d, a, x[15], 22, 0x49b40821);
    % |3 c- F: ]" v7 H) a$ f

  32. 9 l7 A8 I5 Z9 {9 u+ r, r

  33.   X& m( q# J  h5 O! ]
  34.   GG (a, b, c, d, x[ 1],  5, 0xf61e2562);
    8 ]1 B7 r" i- F
  35.   GG (d, a, b, c, x[ 6],  9, 0xc040b340);
    7 Y/ {) `! y- U( I; w# Y) ]
  36.   GG (c, d, a, b, x[11], 14, 0x265e5a51); % B( z8 T3 E  G4 v4 u& {; a5 f- X
  37.   GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); / y7 B3 z4 y- w  g
  38.   GG (a, b, c, d, x[ 5],  5, 0xd62f105d);
    : i# b0 Y0 @5 {& n8 C: l5 A& ^
  39.   GG (d, a, b, c, x[10],  9, 0x02441453);
    ( ^# w4 J$ o- Q: R
  40.   GG (c, d, a, b, x[15], 14, 0xd8a1e681); ! d( y+ e0 x0 s& Z9 K1 a
  41.   GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); / k: m( V' T8 N! H; W
  42.   GG (a, b, c, d, x[ 9],  5, 0x21e1cde6);
    # n" L- Z( j: O0 S3 s9 C
  43.   GG (d, a, b, c, x[14],  9, 0xc33707d6); 4 i# J+ v" r8 Q; m
  44.   GG (c, d, a, b, x[ 3], 14, 0xf4d50d87);
    ) x4 ?$ [7 V. `( J
  45.   GG (b, c, d, a, x[ 8], 20, 0x455a14ed); / S& f8 ]: H8 L3 H
  46.   GG (a, b, c, d, x[13],  5, 0xa9e3e905);
    ) [$ b" B2 _4 n; {
  47.   GG (d, a, b, c, x[ 2],  9, 0xfcefa3f8); 5 R: O8 v& i9 Z. @; @
  48.   GG (c, d, a, b, x[ 7], 14, 0x676f02d9); ( T$ m6 E/ s+ C5 c3 R& l  s
  49.   GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); 7 g3 ?! c3 S+ f0 f- S- M

  50. : R) U: B4 Z8 `$ x: n8 N
  51. 1 f# y6 R* }; I1 A3 _% }3 |
  52.   HH (a, b, c, d, x[ 5],  4, 0xfffa3942); 1 q: H" S$ N. t% P0 O/ m, I: `
  53.   HH (d, a, b, c, x[ 8], 11, 0x8771f681);
    ) a( N: ~+ Q! _6 `- g
  54.   HH (c, d, a, b, x[11], 16, 0x6d9d6122);
    " H9 S1 h! Q: L, n6 W% ?6 K
  55.   HH (b, c, d, a, x[14], 23, 0xfde5380c); ! h- q7 I# n4 ]9 v+ j
  56.   HH (a, b, c, d, x[ 1],  4, 0xa4beea44);
    ! @+ z" H. ~) P8 S# _# v
  57.   HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9);
    1 ~* n; Z2 m, j! Q( F1 r/ J$ C$ Y
  58.   HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); 9 l9 ^/ a8 I) \" Q% v: Q
  59.   HH (b, c, d, a, x[10], 23, 0xbebfbc70);
    : I, W! t( k/ p0 Y' E3 T( T! O
  60.   HH (a, b, c, d, x[13],  4, 0x289b7ec6); ; w. z7 y# e3 J+ m- Y) `; N+ ~4 v1 v
  61.   HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); : Y( c4 B; i, s" Z
  62.   HH (c, d, a, b, x[ 3], 16, 0xd4ef3085);
    ) b0 y9 g0 o8 k- `# F* u
  63.   HH (b, c, d, a, x[ 6], 23, 0x04881d05); - U: m! P5 `2 c
  64.   HH (a, b, c, d, x[ 9],  4, 0xd9d4d039);
    # [  ^* ^3 L. J' A
  65.   HH (d, a, b, c, x[12], 11, 0xe6db99e5); ( f' Q" a: H/ r1 _, f9 {$ G
  66.   HH (c, d, a, b, x[15], 16, 0x1fa27cf8);
    0 ~0 r% l* A+ o0 z' G# g: ~( G9 w
  67.   HH (b, c, d, a, x[ 2], 23, 0xc4ac5665);
    $ B  I) g9 W6 k% j

  68. 6 Z7 ?8 x5 a% z0 q4 u5 A6 F* F$ m4 n

  69. 7 e1 }7 c3 I, a2 n9 {( V, x7 q
  70.   II (a, b, c, d, x[ 0],  6, 0xf4292244); 8 e, x2 L5 d# P
  71.   II (d, a, b, c, x[ 7], 10, 0x432aff97);
    " \+ F/ v9 ~# U5 m
  72.   II (c, d, a, b, x[14], 15, 0xab9423a7); ' f" O2 R- N( Y1 F3 h" O5 p; R
  73.   II (b, c, d, a, x[ 5], 21, 0xfc93a039); - T) l4 L9 L8 x8 ]2 s
  74.   II (a, b, c, d, x[12],  6, 0x655b59c3); ! B! a4 F- X: |
  75.   II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); : v( ~& Z- c/ \! O. Z# n
  76.   II (c, d, a, b, x[10], 15, 0xffeff47d); / f; Z* Q5 |7 p5 H9 I# R
  77.   II (b, c, d, a, x[ 1], 21, 0x85845dd1);
    + P) R/ t+ \& m4 ?* _- q7 E9 u& F
  78.   II (a, b, c, d, x[ 8],  6, 0x6fa87e4f);   l# a+ }- ]& b5 k, I
  79.   II (d, a, b, c, x[15], 10, 0xfe2ce6e0); 0 O2 I# v  I- h0 a# o* g# [
  80.   II (c, d, a, b, x[ 6], 15, 0xa3014314); 5 _* ^- m$ g! J* T7 G  V; }# K: b
  81.   II (b, c, d, a, x[13], 21, 0x4e0811a1);
    7 E1 f. V& X- u( Y  J
  82.   II (a, b, c, d, x[ 4],  6, 0xf7537e82);
    3 `" r; w! e0 |' i) a
  83.   II (d, a, b, c, x[11], 10, 0xbd3af235); 9 e& x* R9 J( @
  84.   II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); 6 I5 h7 w3 X- V6 t5 {- p
  85.   II (b, c, d, a, x[ 9], 21, 0xeb86d391); 9 b0 d0 W. w7 a8 x* h

  86.   o- ]0 r" C- N9 R
  87.   A += a;# c- U$ y; D' K/ }2 s4 a
  88.   B += b;
    & J# s) E+ O6 b0 A" @* E
  89.   C += c;4 R& l& n) c, |& S* l* f9 _7 X7 w
  90.   D += d;9 Q  f* ~( [0 H- H, D& O# A3 _
  91. , j3 ]5 [: e+ {8 K( n7 E+ S
  92. }. [: }+ S; E/ g8 |0 D7 O- N6 M( K( [
  93. % `) x, E# c1 |, Z/ [/ A1 ?
  94. unsigned int sample_index = 0; //从TEST_data采集64位个字节, U& r' M. F% m8 W
  95. unsigned int data_index = 0;   //bin文件字符索引,固件bin文件大小不要超过65K) ~/ H8 ], ]5 b( e: L; d. ~5 S
  96. unsigned int read_times = 0;
    ' D0 s2 d" W2 o& `7 K
  97. unsigned int BIN_location = 0;
    - L; S/ j( e+ e) r+ H
  98. # M9 C# O; Z3 T4 F. O. Z6 T
  99. void data_reset()
    : t& |" _0 I7 r9 I# ^2 H  Z( N
  100. {- Q! j" ~3 a3 z! n
  101.         sample_index = 0;
    $ l, g8 M, }( O! i7 t6 r
  102.         data_index = 0;
    ( N, [0 C( l$ j8 K: k
  103.         read_times = 0;
    # }  Q  W" @2 V$ n3 C8 i) F" Y' E
  104.         BIN_location = 0;
    ) }. A6 g# }) @
  105.         A=0x67452301;/ ^' [* N% l8 N; e: a- z( Z0 T: ~8 o
  106.         B=0xefcdab89;4 W6 R" @! I5 g% C
  107.         C=0x98badcfe;
    ! ?) |( r0 Q- \; D- l
  108.         D=0x10325476;* |- |4 L3 d" Z/ l# s2 H9 p
  109.         a=0;7 o% |- S& A: W6 j6 r
  110.         b=0;
    ; ~. U) s0 G5 `) D2 W: \. L
  111.         c=0;" V5 j- v1 ]) q
  112.         d=0;- Z8 \' B( P% E8 Q
  113.         memset(flen,0x00,sizeof(flen));) i7 i9 X" Z) J- U- f# Y
  114.         memset(x,0x00,sizeof(x));0 X: _- f- w9 y2 d
  115. }+ n9 L/ M2 [: N: C3 R5 L/ N" }
  116. - y  ]9 J' T9 N4 o! q
  117. void read_group_tempbuf(unsigned long fileSize)
    . C: U* Q+ q, ~' T/ `2 q
  118. {8 R4 R0 `" r* g. R) z
  119.         memset(x,0,64);        # q, ]: _' ^5 d  f2 z+ w
  120.         sample_index = 0;
    , F  |" t- W3 P! ~4 I5 Z6 W; o2 t
  121.         for(j = 0;j < 16;j++)//fread(&x,4,16,fp) 以4字节为一组,共16组往x写入数据( }! E& p4 `$ \
  122.         {% j( m( I7 X3 T( F& e% O$ g7 g
  123.                 for(k = 0;k < 4;k++)
    5 d* o, f2 H2 N+ S% y
  124.                 {1 J$ n1 I6 v( s  d: P+ Y. M
  125.                         if((read_times >= fileSize/1024)&&(data_index >= fileSize%1024)) break;//当对最后一部分小于1K的bin文件处理
    2 j) A# K6 _3 k* w% O: b  p
  126.                         * c$ R) n- p0 x& M: V3 r1 b4 d4 \
  127.                         ((char*)x)[sample_index] = Temp_Ex_Flash[data_index];
    5 g* R) U. q8 a% I4 B' Z5 d7 F
  128.                         data_index++;
    % R" G. g! ^* H# Y9 B7 Z% [
  129.                         sample_index++;
    - U% H0 u! p( c6 {7 O! u6 ^8 p& n
  130.                 }
    , _3 G  a9 {' \, |# y
  131.         }
    : g! c8 M* ?( z$ P1 F
  132. }
      ^5 Z) K! x7 O# {+ K1 ~

  133. / ^" e6 G& G2 S# k  y  v
  134. 4 P) x$ V. R9 J4 P1 C
  135. $ {! j: a" a2 X5 K. f
  136. void get_bin_md5(unsigned long fileSize,char *result)1 A  j2 F$ ^% g* Q8 N" W
  137. {8 O: y0 U  ^6 d# h5 o# l. M
  138.         unsigned short i = 0;/ ~# e5 V2 j  V) |4 P6 I+ c
  139.         UINT br;1 b% b( n! S/ S( V  q; @' ]
  140.         FIL file;
    ( f$ T, b% r' [6 [! a$ ^5 G/ K
  141.         / ~3 R$ f% l& E. `0 `+ O2 O2 U
  142.         data_reset();
    7 O1 e6 J! D6 R4 Z6 x% x
  143.         
    . o4 W0 z- E3 F& X( j
  144.         f_open(&file,"/car.bin",FA_READ);
    , A8 v7 g  b# A/ x. F
  145.         for(read_times = 0;read_times < fileSize/1024;read_times++)//对整K进行md5计算' z, g4 ~# l/ A! m
  146.         {
    : Z6 q# `- @3 R+ |
  147.                 f_read (&file, &Temp_Ex_Flash,1024, &br);   
      ]7 Q# g9 T$ e$ y' R
  148.                 BIN_location += 1024;- k2 e+ L+ I2 h# w, C4 q
  149.                 , ^( S: t9 g4 p  t5 s. v
  150.                 for(i = 0;i < 16;i++)//刚好对读出的1Kbin文件进行md5计算
    . l. e' ^( m+ }/ w. \
  151.                 {
    ! |- I$ O4 m- w2 f9 i' n8 V4 f+ b
  152.                         read_group_tempbuf(fileSize);; i. t: v) g( {0 }. }5 c5 F- h. r
  153.                         md5();        * V6 _; Q9 d6 w. ~
  154.                 }3 ?# ~  s7 u2 V6 K% `7 X
  155.                 data_index = 0;//最大只到1023
    & M' A, [8 n" C6 O
  156.         }) d" n6 _% ^& e+ c; v+ t4 K% |
  157.         memset(Temp_Ex_Flash,0,1025);
    ( D, P4 E# f. M  r* Y
  158.         f_read (&file, &Temp_Ex_Flash,fileSize%1024, &br); 3 W1 a& v5 O5 ^: F, n
  159.         
    ! [) v# v8 ~( Q# l
  160.         " e$ ^: x' U  r* m
  161.         read_group_tempbuf(fileSize);
    3 R& z  s( o2 ?5 c- U: K( B
  162.         for(i = 0;i < (fileSize%1024)/64;i++)
    6 T& q6 p( ^' e
  163.         {! m: t3 o# w" W2 d* ]- g
  164.                 md5();8 |& d: r# G" M/ ^  |8 @, F
  165.                 read_group_tempbuf(fileSize);% z/ L& y' a3 M5 v1 y# v9 b
  166.         }
    " J. `$ t+ F6 c) _  c, p
  167.         ((char*)x)[fileSize%64]=128;//文件结束补1,0操作 10000000
    - A- n4 K- v$ r8 ~7 {5 f
  168.         8 z; u/ n  M6 `2 E4 ~
  169.         flen[1]=fileSize/0x20000000;   //转换二进制文件大小(byte->bit)
    ! I; G' B8 m  l. B
  170.         flen[0]=(fileSize%0x20000000)*8;
    8 s% ^: i6 l( t6 u% I
  171.         
    ( Q5 a7 {' Q. F5 j
  172.         if(fileSize%64>55) md5(),memset(x,0,64);' ]( e& A4 J( ?7 B4 |9 v) J( a3 o
  173.         memcpy(x+14,flen,8);
    + [2 K% n, i5 q5 z: ~" L7 S
  174.         md5();7 A, B: o. O  K6 z
  175.         sprintf(result,"%08x%08x%08x%08x",PP(A),PP(B),PP(C),PP(D));1 H/ \& F) `! A7 G
  176.         0 S6 D7 y' |; r- u  R+ R3 b% e4 E
  177. }
    7 i0 l; I/ X; l# {9 l) o
  178. 1 Q6 e" O- ^6 p! a
  179. 8 a; d* t6 c2 f7 p
复制代码

( X% y+ {9 y3 u- c) s9 a0 D( h, p
( Y) @; e1 z) b  V
赞 收藏 评论0 发布时间:2022-4-23 16:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

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