首先介绍一下什么是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- #include "md5.h"1 N6 T, m1 D) i+ m
- #include "ff.h"
/ ]; W% _* y) E. V+ y+ j% b - #include "exfuns.h"
1 Y4 g" N% `" w: l$ t2 H
# \ o6 z6 j L \. u3 O# l/ k- unsigned int A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476,a,b,c,d,flen[2],x[16];
& l2 c7 z, G/ d) s* [ - u16 i = 0;& ] A2 ^3 z5 s2 b7 L% j- V$ |* W
- u16 j = 0;
; _& M" b. h3 H$ G0 W0 _ - u16 k = 0;. \; V1 M% f' O9 I2 d0 t6 W$ _
/ ]' Y* r$ q" C5 L) Q- u8 Temp_Ex_Flash[1025];//定义暂时存储1K外部flash内bin文件; B v7 \% x) l# m& c- B2 S
- ; K6 i$ G$ P+ g, ~. S/ q
- void md5(void){ //MD5主要计算2 I! l/ G( [+ S. e- d5 V9 x
9 s% V& M$ f4 D: G/ R) f- a=A,b=B,c=C,d=D;
( {) T$ n) c k; H- Y - 8 o g1 N% Q( Z; R1 |5 L
- FF (a, b, c, d, x[ 0], 7, 0xd76aa478); 7 p% t# b( o z, c# g9 |
- FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); + j5 L6 Z# C2 U5 ]: v" D) d
- FF (c, d, a, b, x[ 2], 17, 0x242070db); : t8 i r4 |1 Y: [% }
- FF (b, c, d, a, x[ 3], 22, 0xc1bdceee);
* j! v, @- ?9 U {* U8 T - FF (a, b, c, d, x[ 4], 7, 0xf57c0faf);
; j$ e, M1 @1 [4 n - FF (d, a, b, c, x[ 5], 12, 0x4787c62a); ; }. u9 H$ U9 U- Q; V
- FF (c, d, a, b, x[ 6], 17, 0xa8304613);
4 _- [+ ~0 F) r' Z - FF (b, c, d, a, x[ 7], 22, 0xfd469501);
/ e& o; h- q+ f2 D" R0 d - FF (a, b, c, d, x[ 8], 7, 0x698098d8);
- q9 o+ J4 o% u& y) E- v' P - FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); : Q- s K4 l* X
- FF (c, d, a, b, x[10], 17, 0xffff5bb1);
0 f$ p7 ?' \$ W5 v7 h - FF (b, c, d, a, x[11], 22, 0x895cd7be);
c8 a* a+ b2 z- u' z - FF (a, b, c, d, x[12], 7, 0x6b901122);
: r3 R u( q& Z0 \ - FF (d, a, b, c, x[13], 12, 0xfd987193); 3 @% j9 `& @6 h/ i
- FF (c, d, a, b, x[14], 17, 0xa679438e); ' W1 B9 v! H7 U e; s7 D6 _$ _* r
- FF (b, c, d, a, x[15], 22, 0x49b40821);
6 |( [1 z( u* C7 W/ _
4 g5 S4 f3 e7 W# B4 K( X
7 k9 `7 \; g M7 g6 f; ]$ S: [7 S) O- GG (a, b, c, d, x[ 1], 5, 0xf61e2562);
: Y* E' d Y5 r- A- L- P8 | - GG (d, a, b, c, x[ 6], 9, 0xc040b340);
# c, B1 ?/ T% B7 @/ i! k* m - GG (c, d, a, b, x[11], 14, 0x265e5a51); ) V# }3 p m4 g* |5 i4 t& D1 D. `' q
- GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa);
/ U# h4 P5 R$ P2 E2 Y# L! s - GG (a, b, c, d, x[ 5], 5, 0xd62f105d);
/ ~% Q9 I& }6 F9 o+ h+ K - GG (d, a, b, c, x[10], 9, 0x02441453); : |1 V X' x+ W+ M0 F. M
- GG (c, d, a, b, x[15], 14, 0xd8a1e681); 2 \0 A- J( E7 M0 z: r' L2 P. @
- GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); 6 ?' T$ G+ l0 t& u$ j4 f
- GG (a, b, c, d, x[ 9], 5, 0x21e1cde6); , w1 g& s0 c2 O; v1 M9 h
- GG (d, a, b, c, x[14], 9, 0xc33707d6); & S' ]! P4 I! o8 x5 t
- GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); ' e# r, Q# M% p9 e1 Z6 x. W* O9 D
- GG (b, c, d, a, x[ 8], 20, 0x455a14ed);
$ g; T9 E. k# z, O$ V - GG (a, b, c, d, x[13], 5, 0xa9e3e905); & Y6 {% f9 V/ v. i$ \
- GG (d, a, b, c, x[ 2], 9, 0xfcefa3f8); ' ^+ F7 H- H' f6 m9 x
- GG (c, d, a, b, x[ 7], 14, 0x676f02d9); 7 @; o, B" {$ c; P, E
- GG (b, c, d, a, x[12], 20, 0x8d2a4c8a);
0 h2 ~1 t8 E7 n0 `8 w - - N% A3 i4 B8 M5 X5 [
- ! }2 u1 @) N' w
- HH (a, b, c, d, x[ 5], 4, 0xfffa3942);
6 Q4 E6 ?/ e* A* _/ o3 G - HH (d, a, b, c, x[ 8], 11, 0x8771f681); ( B! k! G+ t4 C4 z: J
- HH (c, d, a, b, x[11], 16, 0x6d9d6122); . ^: [1 C7 P1 m4 f) a$ @
- HH (b, c, d, a, x[14], 23, 0xfde5380c);
6 l0 `' D, [ o4 N. K. L - HH (a, b, c, d, x[ 1], 4, 0xa4beea44);
2 I, k9 g/ M( R1 Z7 ? - HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9);
5 b, U- V2 J0 E/ e: c# M - HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); : C" Z- _/ \* ~6 D5 W
- HH (b, c, d, a, x[10], 23, 0xbebfbc70);
: P% @( Y8 K% y+ A+ h" v1 _ - HH (a, b, c, d, x[13], 4, 0x289b7ec6); - K9 f# `& N6 X( r( M9 S
- HH (d, a, b, c, x[ 0], 11, 0xeaa127fa);
: L7 R8 F/ X" O% o, g4 ^/ X: [ - HH (c, d, a, b, x[ 3], 16, 0xd4ef3085);
# Z2 f$ k, I& v% V8 v* M# s - HH (b, c, d, a, x[ 6], 23, 0x04881d05); 9 Q' f) S Y* s' D W" T2 G) ~
- HH (a, b, c, d, x[ 9], 4, 0xd9d4d039); % X8 U; i. Z0 w- A3 y! S8 ~. i8 l
- HH (d, a, b, c, x[12], 11, 0xe6db99e5); m6 l8 q7 A5 r* W$ o* @
- HH (c, d, a, b, x[15], 16, 0x1fa27cf8);
J# ]" j9 _5 L7 d - HH (b, c, d, a, x[ 2], 23, 0xc4ac5665);
; i' a9 D; {3 A) o# e* P
0 P9 ~# ?: l5 r/ R8 M# m- ! K3 {9 M7 {. a! _+ Q2 j' \4 C
- II (a, b, c, d, x[ 0], 6, 0xf4292244); " V0 e% _" [6 p f" x( J7 V
- II (d, a, b, c, x[ 7], 10, 0x432aff97);
3 d* O" S6 j7 {' C* X6 H - II (c, d, a, b, x[14], 15, 0xab9423a7);
( E' U; p# _' j x - II (b, c, d, a, x[ 5], 21, 0xfc93a039);
2 J0 \/ D- r6 q: d - II (a, b, c, d, x[12], 6, 0x655b59c3);
% W: O9 B2 J0 l; d# J - II (d, a, b, c, x[ 3], 10, 0x8f0ccc92);
4 [9 R& ~ S3 _$ ]' F! D' I - II (c, d, a, b, x[10], 15, 0xffeff47d); * s6 A+ B" n; G6 ]0 i
- II (b, c, d, a, x[ 1], 21, 0x85845dd1); " Y! v. j" m. Z9 w9 I$ d; ]5 T
- II (a, b, c, d, x[ 8], 6, 0x6fa87e4f);
% L0 y# y3 X8 Y - II (d, a, b, c, x[15], 10, 0xfe2ce6e0);
+ R! Z+ @( K4 Y. q& V0 f/ a7 T( { - II (c, d, a, b, x[ 6], 15, 0xa3014314);
* R5 I& j) w) S - II (b, c, d, a, x[13], 21, 0x4e0811a1);
- @! T7 O4 y) n2 o9 T5 s - II (a, b, c, d, x[ 4], 6, 0xf7537e82);
! U- M4 X8 K2 K h8 w T - II (d, a, b, c, x[11], 10, 0xbd3af235); : l& @! l6 p' j R8 y
- II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb);
# L) v8 U, w4 e& O( T" l - II (b, c, d, a, x[ 9], 21, 0xeb86d391); 7 {1 z x9 Z8 F$ L4 q2 T5 J. }
- & {% X2 S% w8 X" l a# L) d
- A += a;6 [5 r; z2 c2 ?& O* N2 ?9 I
- B += b;7 a' q* q3 @1 R& w$ o# v j1 c+ J
- C += c;2 d' O( ^9 g5 j6 h
- D += d;: A3 O: C" q7 U. |7 _
1 n( l+ h- y4 H3 O- }3 z5 J, v5 y% L- y3 w7 V, t
) t( f" X( g0 G* O- O- unsigned int sample_index = 0; //从TEST_data采集64位个字节7 ]4 U; K4 @9 a$ r! t
- unsigned int data_index = 0; //bin文件字符索引,固件bin文件大小不要超过65K2 R3 x) ^+ e/ H
- unsigned int read_times = 0;
: {6 r+ M4 R$ m' h: V( T - unsigned int BIN_location = 0;8 {" g7 J4 a% z) _0 i4 Q
& u, b; c3 F3 v0 Q# Y+ W- void data_reset()
/ p# w+ W s- ~* w) E - {
0 y4 B7 H0 i0 q9 z) E) n0 o - sample_index = 0;3 S* G% V% R. e4 b
- data_index = 0;
3 V+ k% Z/ v& U1 B4 I- p. x( y' C) f/ _ - read_times = 0;
% Z' p2 i/ U0 \5 `) l- u - BIN_location = 0;
; g) Z2 i4 g4 C* p6 a* j - A=0x67452301;
9 X3 M5 y9 m& a5 C2 u - B=0xefcdab89;
' `. K, t+ M5 {2 H- E9 ? - C=0x98badcfe;! S9 h# ^* ?) W, o8 {6 b/ \( r' S
- D=0x10325476;; D$ a% ?; Z% h6 v; ?. q% m E
- a=0;
1 J9 X& s# T4 {. n& F6 [ j+ _ - b=0;
, I5 j) ^- ?0 I+ u2 a; L. R4 C - c=0;$ @6 E# R& M) P# q! h+ i1 y
- d=0;* i" H5 H% v3 Q: v+ w- u3 R
- memset(flen,0x00,sizeof(flen));
- ?" X4 I# B! y1 G m# a - memset(x,0x00,sizeof(x));
$ o* T7 v( t# e2 v; f - }
4 @9 L4 r) y& ^8 B$ p - ) q! ]" n( S! F# m7 X
- void read_group_tempbuf(unsigned long fileSize)5 k9 \. i$ f7 ~" w/ I, A
- {
, a+ a1 @9 O* L, m J( e - memset(x,0,64);
6 v! O$ W' V5 y% }2 c" p - sample_index = 0;
2 z1 J6 a/ k+ W0 \" X- Q) p - for(j = 0;j < 16;j++)//fread(&x,4,16,fp) 以4字节为一组,共16组往x写入数据
9 I1 _6 c; T8 z/ v- B2 e - {0 {) j% S: p) j; G& A
- for(k = 0;k < 4;k++)( x8 m7 b9 {3 J4 g0 n# ]* i- W
- {. S7 J5 Z( K8 M8 P2 ?
- if((read_times >= fileSize/1024)&&(data_index >= fileSize%1024)) break;//当对最后一部分小于1K的bin文件处理' M3 v9 f0 d; L
- , ]8 U0 R6 n/ @5 p- c$ |# |0 `
- ((char*)x)[sample_index] = Temp_Ex_Flash[data_index];8 W( ~: n# N/ Y4 S5 f* O
- data_index++;
d9 g+ `0 O* L3 r# c( e: f/ O1 U - sample_index++;
5 Y+ A7 [8 M- \ p& M3 L: g: x - }
/ B4 D3 f& x5 u. T) w: q - }0 ~5 ], P9 N( Q; U! F* h! u
- }
& b e- V9 g. |/ o% g2 x7 J# d
8 D9 f$ ]+ }- }: p. n: F7 I- 3 V# ]: l* e# C6 Y( c. V
- 3 f9 Z8 ] ?( A; I+ S# |# c* y
- void get_bin_md5(unsigned long fileSize,char *result)
- S c! g- H5 f5 ] - {
( d6 ]3 ]0 C9 m; _ - unsigned short i = 0;; u6 {& \ H4 N. Z
- UINT br;3 b/ b6 p" a6 A
- FIL file;4 {* s% e! Q5 h
- $ G' S7 t' n6 O
- data_reset();
, |. {; @ K$ ^3 I, {4 p ] - 9 n" b/ v' ~6 ]
- f_open(&file,"/car.bin",FA_READ);
8 s* z# S8 O2 f! F6 O' T# \# \ - for(read_times = 0;read_times < fileSize/1024;read_times++)//对整K进行md5计算
6 j/ Z+ o6 d$ [% n& B1 ~" q, v - {
. c% Y n! X% X+ @ - f_read (&file, &Temp_Ex_Flash,1024, &br); ' J( R. i, K7 I( B
- BIN_location += 1024;- b' l I9 R# m9 g
-
* E1 k) d* R) l+ O* p - for(i = 0;i < 16;i++)//刚好对读出的1Kbin文件进行md5计算
" g8 z; o) _; e4 L" |$ H) o) c/ e' m - {! |1 z; j$ h" T* Q! L( b
- read_group_tempbuf(fileSize);2 m' [& C0 N: `7 C$ B: O2 O
- md5(); 3 z" g" ?; v" E* N
- }; P' p1 s# h# y% ?4 q% P& k, ^* ?8 s8 y
- data_index = 0;//最大只到1023* D* _# k, y# _8 s% [
- }
( c3 h- u$ ?' E. h; e% h: c- S - memset(Temp_Ex_Flash,0,1025);
9 _# m2 \3 I! D/ y$ V - f_read (&file, &Temp_Ex_Flash,fileSize%1024, &br); 1 H a+ D) P1 f0 V
- 4 I4 @- Z2 p9 [8 D
-
( }" w1 t# l/ `# j - read_group_tempbuf(fileSize);
7 v# {8 |+ P3 ?0 b. W - for(i = 0;i < (fileSize%1024)/64;i++)/ Z5 X# |' C- s/ @
- {
1 [) e% ~/ O, r, Z0 C$ J' j - md5();
5 m# E* @# N% h: m c ^ - read_group_tempbuf(fileSize);0 x" U; W, y H! b, g. p
- }9 I( p& m: D* g9 x7 N3 Y
- ((char*)x)[fileSize%64]=128;//文件结束补1,0操作 10000000( V% J/ P8 b: S* I) W
-
* {: |3 c8 b. a* k( y! P - flen[1]=fileSize/0x20000000; //转换二进制文件大小(byte->bit)
7 E1 N+ }# [( E3 T - flen[0]=(fileSize%0x20000000)*8;9 z$ v) [5 R, o7 x1 ]5 Z
- / L* e d- C+ V+ |; W
- if(fileSize%64>55) md5(),memset(x,0,64);: T2 Y( z; T8 F1 C. O( k: a+ p
- memcpy(x+14,flen,8);, U Z! a' M1 x
- md5();, X8 R0 D1 |4 r& g
- sprintf(result,"%08x%08x%08x%08x",PP(A),PP(B),PP(C),PP(D));
, F% e; x6 H; ~' Q; G - 8 S& O2 f j* a: W3 f
- }
8 O: B1 k& k& F8 W) B9 J
5 K; S9 P) e' b1 ~, I: f/ L
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
|