首先介绍一下什么是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 ~
- #include "md5.h"
7 I, e" @$ |8 _5 F1 t3 h: M2 u9 ^ - #include "ff.h"
7 j" O( [9 C5 O& h5 c - #include "exfuns.h"
) ?0 g+ ]8 u, o, z4 E, N - V" [! @7 u3 W& c# I# c( C
- 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 - u16 i = 0;
7 p2 c% m) ?5 b& W- g4 R6 h; @9 A - u16 j = 0;; O" e# I2 D6 q1 q
- u16 k = 0;1 T4 O$ [" U, K& L1 G8 T) R7 w) G
& L: J5 p1 S- U8 ^$ Z2 M1 R5 q- u8 Temp_Ex_Flash[1025];//定义暂时存储1K外部flash内bin文件( D. r7 r8 \( l9 o+ B! |( W6 a
- 1 d5 h; @3 x* Q4 o+ K0 l8 X+ n
- void md5(void){ //MD5主要计算
& T& _& T8 v" A3 V' A# c( `6 { - . m1 j# J* L0 T. Q! x$ M
- a=A,b=B,c=C,d=D;" [3 ` F) C' a; w6 W1 ^; d
/ U- r: `; B/ t: a9 e& T! R- FF (a, b, c, d, x[ 0], 7, 0xd76aa478);
# T: }: i8 d$ W/ ?# ]: o - FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); 9 D/ {. R* k+ |7 R
- FF (c, d, a, b, x[ 2], 17, 0x242070db);
9 b! j% B0 h* E - FF (b, c, d, a, x[ 3], 22, 0xc1bdceee);
/ _, `0 [7 @6 y8 H3 _ - FF (a, b, c, d, x[ 4], 7, 0xf57c0faf); 5 I- c5 b# s) Z) X7 q' V: p: N7 o
- FF (d, a, b, c, x[ 5], 12, 0x4787c62a); 4 x u( s' B; B8 ?& J' o
- FF (c, d, a, b, x[ 6], 17, 0xa8304613);
: S g; `/ Y5 l) ^! D - FF (b, c, d, a, x[ 7], 22, 0xfd469501);
8 O* Y, B: F# l - FF (a, b, c, d, x[ 8], 7, 0x698098d8); 9 n' P& T9 S1 z% r" Z9 m/ P
- FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); - @3 L' u! A `. ?( A
- FF (c, d, a, b, x[10], 17, 0xffff5bb1);
, U8 Y7 k! x! P - FF (b, c, d, a, x[11], 22, 0x895cd7be); 1 b+ ~. S* E" g! u5 k( Q
- FF (a, b, c, d, x[12], 7, 0x6b901122);
5 C7 d4 h6 ?, w - FF (d, a, b, c, x[13], 12, 0xfd987193); 9 G# v, G% `- N! Q' s$ R
- FF (c, d, a, b, x[14], 17, 0xa679438e); & d. Z8 j, |3 ]+ p" ^% U" X
- FF (b, c, d, a, x[15], 22, 0x49b40821);
% |3 c- F: ]" v7 H) a$ f
9 l7 A8 I5 Z9 {9 u+ r, r
X& m( q# J h5 O! ]- GG (a, b, c, d, x[ 1], 5, 0xf61e2562);
8 ]1 B7 r" i- F - GG (d, a, b, c, x[ 6], 9, 0xc040b340);
7 Y/ {) `! y- U( I; w# Y) ] - GG (c, d, a, b, x[11], 14, 0x265e5a51); % B( z8 T3 E G4 v4 u& {; a5 f- X
- GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); / y7 B3 z4 y- w g
- GG (a, b, c, d, x[ 5], 5, 0xd62f105d);
: i# b0 Y0 @5 {& n8 C: l5 A& ^ - GG (d, a, b, c, x[10], 9, 0x02441453);
( ^# w4 J$ o- Q: R - GG (c, d, a, b, x[15], 14, 0xd8a1e681); ! d( y+ e0 x0 s& Z9 K1 a
- GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); / k: m( V' T8 N! H; W
- GG (a, b, c, d, x[ 9], 5, 0x21e1cde6);
# n" L- Z( j: O0 S3 s9 C - GG (d, a, b, c, x[14], 9, 0xc33707d6); 4 i# J+ v" r8 Q; m
- GG (c, d, a, b, x[ 3], 14, 0xf4d50d87);
) x4 ?$ [7 V. `( J - GG (b, c, d, a, x[ 8], 20, 0x455a14ed); / S& f8 ]: H8 L3 H
- GG (a, b, c, d, x[13], 5, 0xa9e3e905);
) [$ b" B2 _4 n; { - GG (d, a, b, c, x[ 2], 9, 0xfcefa3f8); 5 R: O8 v& i9 Z. @; @
- GG (c, d, a, b, x[ 7], 14, 0x676f02d9); ( T$ m6 E/ s+ C5 c3 R& l s
- GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); 7 g3 ?! c3 S+ f0 f- S- M
: R) U: B4 Z8 `$ x: n8 N- 1 f# y6 R* }; I1 A3 _% }3 |
- HH (a, b, c, d, x[ 5], 4, 0xfffa3942); 1 q: H" S$ N. t% P0 O/ m, I: `
- HH (d, a, b, c, x[ 8], 11, 0x8771f681);
) a( N: ~+ Q! _6 `- g - HH (c, d, a, b, x[11], 16, 0x6d9d6122);
" H9 S1 h! Q: L, n6 W% ?6 K - HH (b, c, d, a, x[14], 23, 0xfde5380c); ! h- q7 I# n4 ]9 v+ j
- HH (a, b, c, d, x[ 1], 4, 0xa4beea44);
! @+ z" H. ~) P8 S# _# v - HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9);
1 ~* n; Z2 m, j! Q( F1 r/ J$ C$ Y - HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); 9 l9 ^/ a8 I) \" Q% v: Q
- HH (b, c, d, a, x[10], 23, 0xbebfbc70);
: I, W! t( k/ p0 Y' E3 T( T! O - HH (a, b, c, d, x[13], 4, 0x289b7ec6); ; w. z7 y# e3 J+ m- Y) `; N+ ~4 v1 v
- HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); : Y( c4 B; i, s" Z
- HH (c, d, a, b, x[ 3], 16, 0xd4ef3085);
) b0 y9 g0 o8 k- `# F* u - HH (b, c, d, a, x[ 6], 23, 0x04881d05); - U: m! P5 `2 c
- HH (a, b, c, d, x[ 9], 4, 0xd9d4d039);
# [ ^* ^3 L. J' A - HH (d, a, b, c, x[12], 11, 0xe6db99e5); ( f' Q" a: H/ r1 _, f9 {$ G
- HH (c, d, a, b, x[15], 16, 0x1fa27cf8);
0 ~0 r% l* A+ o0 z' G# g: ~( G9 w - HH (b, c, d, a, x[ 2], 23, 0xc4ac5665);
$ B I) g9 W6 k% j
6 Z7 ?8 x5 a% z0 q4 u5 A6 F* F$ m4 n
7 e1 }7 c3 I, a2 n9 {( V, x7 q- II (a, b, c, d, x[ 0], 6, 0xf4292244); 8 e, x2 L5 d# P
- II (d, a, b, c, x[ 7], 10, 0x432aff97);
" \+ F/ v9 ~# U5 m - II (c, d, a, b, x[14], 15, 0xab9423a7); ' f" O2 R- N( Y1 F3 h" O5 p; R
- II (b, c, d, a, x[ 5], 21, 0xfc93a039); - T) l4 L9 L8 x8 ]2 s
- II (a, b, c, d, x[12], 6, 0x655b59c3); ! B! a4 F- X: |
- II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); : v( ~& Z- c/ \! O. Z# n
- II (c, d, a, b, x[10], 15, 0xffeff47d); / f; Z* Q5 |7 p5 H9 I# R
- II (b, c, d, a, x[ 1], 21, 0x85845dd1);
+ P) R/ t+ \& m4 ?* _- q7 E9 u& F - II (a, b, c, d, x[ 8], 6, 0x6fa87e4f); l# a+ }- ]& b5 k, I
- II (d, a, b, c, x[15], 10, 0xfe2ce6e0); 0 O2 I# v I- h0 a# o* g# [
- II (c, d, a, b, x[ 6], 15, 0xa3014314); 5 _* ^- m$ g! J* T7 G V; }# K: b
- II (b, c, d, a, x[13], 21, 0x4e0811a1);
7 E1 f. V& X- u( Y J - II (a, b, c, d, x[ 4], 6, 0xf7537e82);
3 `" r; w! e0 |' i) a - II (d, a, b, c, x[11], 10, 0xbd3af235); 9 e& x* R9 J( @
- II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); 6 I5 h7 w3 X- V6 t5 {- p
- II (b, c, d, a, x[ 9], 21, 0xeb86d391); 9 b0 d0 W. w7 a8 x* h
o- ]0 r" C- N9 R- A += a;# c- U$ y; D' K/ }2 s4 a
- B += b;
& J# s) E+ O6 b0 A" @* E - C += c;4 R& l& n) c, |& S* l* f9 _7 X7 w
- D += d;9 Q f* ~( [0 H- H, D& O# A3 _
- , j3 ]5 [: e+ {8 K( n7 E+ S
- }. [: }+ S; E/ g8 |0 D7 O- N6 M( K( [
- % `) x, E# c1 |, Z/ [/ A1 ?
- unsigned int sample_index = 0; //从TEST_data采集64位个字节, U& r' M. F% m8 W
- unsigned int data_index = 0; //bin文件字符索引,固件bin文件大小不要超过65K) ~/ H8 ], ]5 b( e: L; d. ~5 S
- unsigned int read_times = 0;
' D0 s2 d" W2 o& `7 K - unsigned int BIN_location = 0;
- L; S/ j( e+ e) r+ H - # M9 C# O; Z3 T4 F. O. Z6 T
- void data_reset()
: t& |" _0 I7 r9 I# ^2 H Z( N - {- Q! j" ~3 a3 z! n
- sample_index = 0;
$ l, g8 M, }( O! i7 t6 r - data_index = 0;
( N, [0 C( l$ j8 K: k - read_times = 0;
# } Q W" @2 V$ n3 C8 i) F" Y' E - BIN_location = 0;
) }. A6 g# }) @ - A=0x67452301;/ ^' [* N% l8 N; e: a- z( Z0 T: ~8 o
- B=0xefcdab89;4 W6 R" @! I5 g% C
- C=0x98badcfe;
! ?) |( r0 Q- \; D- l - D=0x10325476;* |- |4 L3 d" Z/ l# s2 H9 p
- a=0;7 o% |- S& A: W6 j6 r
- b=0;
; ~. U) s0 G5 `) D2 W: \. L - c=0;" V5 j- v1 ]) q
- d=0;- Z8 \' B( P% E8 Q
- memset(flen,0x00,sizeof(flen));) i7 i9 X" Z) J- U- f# Y
- memset(x,0x00,sizeof(x));0 X: _- f- w9 y2 d
- }+ n9 L/ M2 [: N: C3 R5 L/ N" }
- - y ]9 J' T9 N4 o! q
- void read_group_tempbuf(unsigned long fileSize)
. C: U* Q+ q, ~' T/ `2 q - {8 R4 R0 `" r* g. R) z
- memset(x,0,64); # q, ]: _' ^5 d f2 z+ w
- sample_index = 0;
, F |" t- W3 P! ~4 I5 Z6 W; o2 t - for(j = 0;j < 16;j++)//fread(&x,4,16,fp) 以4字节为一组,共16组往x写入数据( }! E& p4 `$ \
- {% j( m( I7 X3 T( F& e% O$ g7 g
- for(k = 0;k < 4;k++)
5 d* o, f2 H2 N+ S% y - {1 J$ n1 I6 v( s d: P+ Y. M
- if((read_times >= fileSize/1024)&&(data_index >= fileSize%1024)) break;//当对最后一部分小于1K的bin文件处理
2 j) A# K6 _3 k* w% O: b p - * c$ R) n- p0 x& M: V3 r1 b4 d4 \
- ((char*)x)[sample_index] = Temp_Ex_Flash[data_index];
5 g* R) U. q8 a% I4 B' Z5 d7 F - data_index++;
% R" G. g! ^* H# Y9 B7 Z% [ - sample_index++;
- U% H0 u! p( c6 {7 O! u6 ^8 p& n - }
, _3 G a9 {' \, |# y - }
: g! c8 M* ?( z$ P1 F - }
^5 Z) K! x7 O# {+ K1 ~
/ ^" e6 G& G2 S# k y v- 4 P) x$ V. R9 J4 P1 C
- $ {! j: a" a2 X5 K. f
- void get_bin_md5(unsigned long fileSize,char *result)1 A j2 F$ ^% g* Q8 N" W
- {8 O: y0 U ^6 d# h5 o# l. M
- unsigned short i = 0;/ ~# e5 V2 j V) |4 P6 I+ c
- UINT br;1 b% b( n! S/ S( V q; @' ]
- FIL file;
( f$ T, b% r' [6 [! a$ ^5 G/ K - / ~3 R$ f% l& E. `0 `+ O2 O2 U
- data_reset();
7 O1 e6 J! D6 R4 Z6 x% x -
. o4 W0 z- E3 F& X( j - f_open(&file,"/car.bin",FA_READ);
, A8 v7 g b# A/ x. F - for(read_times = 0;read_times < fileSize/1024;read_times++)//对整K进行md5计算' z, g4 ~# l/ A! m
- {
: Z6 q# `- @3 R+ | - f_read (&file, &Temp_Ex_Flash,1024, &br);
]7 Q# g9 T$ e$ y' R - BIN_location += 1024;- k2 e+ L+ I2 h# w, C4 q
- , ^( S: t9 g4 p t5 s. v
- for(i = 0;i < 16;i++)//刚好对读出的1Kbin文件进行md5计算
. l. e' ^( m+ }/ w. \ - {
! |- I$ O4 m- w2 f9 i' n8 V4 f+ b - read_group_tempbuf(fileSize);; i. t: v) g( {0 }. }5 c5 F- h. r
- md5(); * V6 _; Q9 d6 w. ~
- }3 ?# ~ s7 u2 V6 K% `7 X
- data_index = 0;//最大只到1023
& M' A, [8 n" C6 O - }) d" n6 _% ^& e+ c; v+ t4 K% |
- memset(Temp_Ex_Flash,0,1025);
( D, P4 E# f. M r* Y - f_read (&file, &Temp_Ex_Flash,fileSize%1024, &br); 3 W1 a& v5 O5 ^: F, n
-
! [) v# v8 ~( Q# l - " e$ ^: x' U r* m
- read_group_tempbuf(fileSize);
3 R& z s( o2 ?5 c- U: K( B - for(i = 0;i < (fileSize%1024)/64;i++)
6 T& q6 p( ^' e - {! m: t3 o# w" W2 d* ]- g
- md5();8 |& d: r# G" M/ ^ |8 @, F
- read_group_tempbuf(fileSize);% z/ L& y' a3 M5 v1 y# v9 b
- }
" J. `$ t+ F6 c) _ c, p - ((char*)x)[fileSize%64]=128;//文件结束补1,0操作 10000000
- A- n4 K- v$ r8 ~7 {5 f - 8 z; u/ n M6 `2 E4 ~
- flen[1]=fileSize/0x20000000; //转换二进制文件大小(byte->bit)
! I; G' B8 m l. B - flen[0]=(fileSize%0x20000000)*8;
8 s% ^: i6 l( t6 u% I -
( Q5 a7 {' Q. F5 j - if(fileSize%64>55) md5(),memset(x,0,64);' ]( e& A4 J( ?7 B4 |9 v) J( a3 o
- memcpy(x+14,flen,8);
+ [2 K% n, i5 q5 z: ~" L7 S - md5();7 A, B: o. O K6 z
- sprintf(result,"%08x%08x%08x%08x",PP(A),PP(B),PP(C),PP(D));1 H/ \& F) `! A7 G
- 0 S6 D7 y' |; r- u R+ R3 b% e4 E
- }
7 i0 l; I/ X; l# {9 l) o - 1 Q6 e" O- ^6 p! a
- 8 a; d* t6 c2 f7 p
复制代码
( X% y+ {9 y3 u- c) s9 a0 D( h, p
( Y) @; e1 z) b V |