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

用C语言实现MD5加密

[复制链接]
gaosmile 发布时间:2021-2-22 21:47
一、摘要算法

摘要算法又称哈希算法。

它表示输入任意长度的数据,输出固定长度的数据,它的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密。

目前可以被解密逆向的只有CRC32算法,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。

消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络上使用。由于其加密计算的工作量相当巨大,所以以前的这种算法通常只用于数据量有限的情况下的加密。

消息摘要算法分为三类:
  • MD(Message Digest):消息摘要
  • SHA(Secure Hash Algorithm):安全散列
  • MAC(Message Authentication Code):消息认证码
    8 w/ F% N  |6 J- e

这三类算法的主要作用:验证数据的完整性

二、MD5简介

MD5即Message-Digest Algorithm 5(信息-摘要算法)。

属于摘要算法,是一个不可逆过程,就是无论多大数据,经过算法运算后都是生成固定长度的数据,结果使用16进制进行显示的128bit的二进制串。通常表示为32个十六进制数连成的字符串。

MD5有什么用?

用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。更多用在文档校验上,用来生成密钥检测文档是否被篡改。

三、在线MD5加密

有很多在线进行MD5加密的网站,如下:

http://www.metools.info/code/c26.html

举例: 给字符串 12334567 加密成。

微信图片_20210222214612.png

如图结果为:

32135A337F8DC8E2BB9A9B80D86BDFD05 G7 i) q1 j/ @9 z
四、C语言实现MD5算法

源文件如下:md5.h

#ifndef MD5_H
4 c( I) D. V( X/ E" F& u% v#define MD5_H
2 w) }3 f) W9 c; P: c6 [
& ]! f, K. O8 b7 I' {typedef struct
' }; ^" q2 H9 b& l! F4 b1 _8 n" I% O{
/ Z1 h) {: }0 Z" W, N# H* x2 o- q) G2 k    unsigned int count[2];
: G7 f, ~* E9 }& Q) m    unsigned int state[4];
3 h6 @) n4 g: x5 v, b    unsigned char buffer[64];   3 ]! ^: a9 p) J- j( ^* ?+ J
}MD5_CTX;
) G2 {6 W# E# f/ V  ? 3 o2 ]3 T/ Y5 \* B% m6 s. A7 O
                        
% j" |* F7 ~9 G9 J6 b5 t: G7 f#define F(x,y,z) ((x & y) | (~x & z))
1 s- |. F. P' G' H* y' Y* H+ \#define G(x,y,z) ((x & z) | (y & ~z))
1 V7 y: G* p% ]" g9 j0 b0 T/ D#define H(x,y,z) (x^y^z)
5 f* X  b7 v) N" G#define I(x,y,z) (y ^ (x | ~z))
3 C6 a' w3 Y$ F3 K; ^$ F" j#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))# @" J) w6 K( P; W6 ?3 ?+ H
#define FF(a,b,c,d,x,s,ac) \
- m( ^; R, W! |+ c' v7 d1 [6 J" x          { \* q. n  U  }. V: ~% R7 W! W
          a += F(b,c,d) + x + ac; \: k1 {* \& ]" \, }3 a2 Z
          a = ROTATE_LEFT(a,s); \/ i  |* f  m4 C% E9 R) @5 ^
          a += b; \/ ?) e. J: r6 \
          }% ?0 ~8 `& e4 \& N% I4 B) f  K
#define GG(a,b,c,d,x,s,ac) \' u4 D0 k9 J0 e5 A
          { \
0 V; Z' t8 n+ \, ~% ]  G* V7 {: f          a += G(b,c,d) + x + ac; \6 L' W8 d  i; c* x, f
          a = ROTATE_LEFT(a,s); \
1 C3 C3 J  R- @3 c. D          a += b; \/ R0 ^" j2 z$ K8 |' T
          }
: C+ W4 t( j1 |; ?5 k. h( N#define HH(a,b,c,d,x,s,ac) \
+ |, n* ?, U8 B( E. v8 |4 U2 N          { \9 r2 F' O- o" Q! z( `6 `9 C( v
          a += H(b,c,d) + x + ac; \  T  S- Z* _+ z, D# u2 }
          a = ROTATE_LEFT(a,s); \  |* B- f& l5 |: p* ]. V
          a += b; \
9 F% l! u' S" r          }
& B2 r/ I6 h3 q  {. x! x1 C#define II(a,b,c,d,x,s,ac) \" T" s2 j) q) c! Q% ?
          { \5 j& P& j' u# F3 Y6 {/ N& [8 x1 K
          a += I(b,c,d) + x + ac; \
) B1 k6 o6 E$ M& }7 ~) L; \9 K; t          a = ROTATE_LEFT(a,s); \7 y6 C2 `) F! J. F+ S% V) N" z
          a += b; \4 I+ l  \) `8 `( o
          }                                            
# K$ C7 d4 \' c# ^6 rvoid MD5Init(MD5_CTX *context);
4 }6 ~! d, J) y: J( ]  wvoid MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);
' c/ N8 g0 q! ]( _. v$ uvoid MD5Final(MD5_CTX *context,unsigned char digest[16]);, Q8 ?; N4 Y! W
void MD5Transform(unsigned int state[4],unsigned char block[64]);
) O4 x- g6 w5 N& g2 k5 `8 {' zvoid MD5Encode(unsigned char *output,unsigned int *input,unsigned int len);4 X# l1 l: P5 Q. |9 s4 B6 F
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len);
2 I1 Y/ j' i3 T5 o
* v5 y+ s6 z% ~" L  D#endif! t# o- W" [! I5 J- v' g1 S; b

md5.c

#include <memory.h>
7 u/ f, g) ~7 I) f#include "md5.h"5 m) h3 _3 a2 @

5 A: G2 I0 p/ N6 C- J$ Qunsigned char PADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,' D- `! A5 v* X' T, h3 w
                         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,! }5 s+ ]1 e, v, G- C
                         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,: b# t8 f: Z6 Y. c4 b
                         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
" B( O4 w$ a- a' i1 S% d" `                        
  X+ t' z( ]" _& V% h+ Ivoid MD5Init(MD5_CTX *context)1 t5 x0 w8 d- v" d
{8 H/ w7 {# E) M
     context->count[0] = 0;
5 ]: p; W, v; [! v) [2 Q     context->count[1] = 0;
, G1 L" R/ j/ H8 C4 ~+ G/ O7 p     context->state[0] = 0x67452301;
9 L1 M1 c" M9 |1 X0 Z- V     context->state[1] = 0xEFCDAB89;2 O8 k- A8 ~' a* P4 Q
     context->state[2] = 0x98BADCFE;6 K9 K1 e7 @7 a6 ?) q
     context->state[3] = 0x10325476;% Q* F3 R0 J1 `4 G9 E4 `
}
* [9 J, z" Q( v6 p( qvoid MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen)
* T+ q; Q' M! ]* ]{  `+ m" l# b! i  h# U
    unsigned int i = 0,index = 0,partlen = 0;
! }' L0 d/ i/ M' d" D    index = (context->count[0] >> 3) & 0x3F;; m  [) F. `" i
    partlen = 64 - index;
( S& N6 F8 y8 e2 A3 U* Q7 m, F" ~0 t    context->count[0] += inputlen << 3;
: t1 _: ]3 J* P# x. P  N    if(context->count[0] < (inputlen << 3))) K  `% x9 k) B
       context->count[1]++;
6 p3 i0 Q: P3 ~" l; D# R- c2 m# z. t( Y    context->count[1] += inputlen >> 29;
- o5 s8 G- r+ M1 o& z# m" _   
% i+ x5 p6 E3 z- l$ j0 j- b    if(inputlen >= partlen)* K- F& \! J( B9 p7 d2 M
    {4 ~( ?) ~, ~& J6 A
       memcpy(&context->buffer[index],input,partlen);+ W; E! J+ k8 a7 X5 `9 {, f
       MD5Transform(context->state,context->buffer);( z, D5 \$ \$ r) }6 f
       for(i = partlen;i+64 <= inputlen;i+=64)9 H: y3 O1 Y* ?: B% i
           MD5Transform(context->state,&input);9 z3 c, y, P/ W! Q
       index = 0;        
, n7 t0 [# c3 u    }  , I7 d% u9 r% B4 I+ z7 |! X( Y
    else5 B* y% D' {/ q7 r  Q3 z0 B% M8 r
    {: E* d/ }9 D+ K
        i = 0;
$ T* b1 {  A+ Q; s    }
  l8 y0 n+ u% J3 X8 b' [2 \- w    memcpy(&context->buffer[index],&input,inputlen-i);
! W, G& ?- C. M  _/ h7 h4 |}
! c8 P0 N+ Y, o- o  _8 Xvoid MD5Final(MD5_CTX *context,unsigned char digest[16])
* Q  V& J5 W2 @8 d4 m{
4 |5 T6 s+ q, R- L, a. D) T' h    unsigned int index = 0,padlen = 0;
( R6 b' n/ z5 [/ g+ t- N    unsigned char bits[8];
& Y/ F5 ~- U) X" {    index = (context->count[0] >> 3) & 0x3F;
6 k- v/ d2 U* C3 W- Z    padlen = (index < 56)?(56-index)120-index);9 q- W% v7 f! k# A8 K( G) i2 o
    MD5Encode(bits,context->count,8);; g. k" j! a+ R6 K9 [1 M
    MD5Update(context,PADDING,padlen);
9 K! }* ^# C7 z) ]! z5 [. v    MD5Update(context,bits,8);2 Q6 Z) d% ~$ r  ~  g1 l! e, H
    MD5Encode(digest,context->state,16);
8 [3 S, ?- a! X' p0 i- M}! J- H. n2 I: e  j4 O- E
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len)- t4 `/ g/ o5 E7 Q9 K) ?
{6 h9 F6 o! h' w4 p2 H
    unsigned int i = 0,j = 0;! g) \( G+ g  o# m* |
    while(j < len)
" w9 U* w9 h! I! o9 E    {
0 W+ P" |& K- P$ U, q- H$ d0 R         output[j] = input & 0xFF;    |( a0 k! ~8 z% g
         output[j+1] = (input >> 8) & 0xFF;
- Y3 f- d* I( V7 A         output[j+2] = (input >> 16) & 0xFF;' D- y$ z8 ?2 n; X7 c& A
         output[j+3] = (input >> 24) & 0xFF;
3 k9 O# \; {  w! X, D         i++;
) f# X# t  w6 r! c6 H         j+=4;/ n3 M9 v( B1 x3 B7 I/ }
    }
9 [7 U- V/ v4 v% O3 A; u  J}
: A6 b+ b; y7 H( U* tvoid MD5Decode(unsigned int *output,unsigned char *input,unsigned int len)
$ {* w  q. K% Y9 ^+ @3 k7 p8 G{. a0 K9 \; A! i0 M) L
     unsigned int i = 0,j = 0;+ |" Q2 u7 X+ `5 X
     while(j < len)" \2 b% z7 ^( G& `
     {) p7 ~! i0 }2 d1 ]! `
           output = (input[j]) |' O" J1 O1 L/ s+ g  f7 o
                       (input[j+1] << 8) |
" O+ H; i$ r% y; P; x* W& S                       (input[j+2] << 16) |
# W9 g2 r1 s5 P( e                       (input[j+3] << 24);
4 g; R. p: i- T9 v( m           i++;
3 a0 g. U# L" @+ \; ]3 b           j+=4;
* p) C( f0 n9 [$ L     }
1 e0 ?! o, m. o7 p}, m3 b( s3 R7 D2 \& N7 C: O8 i! c
void MD5Transform(unsigned int state[4],unsigned char block[64])
9 R8 Z/ W$ N* y& u! V3 E  T- J& Q6 I{' u& {) X1 \( f# z* ^" u4 E) \
     unsigned int a = state[0];2 t' Y5 ]! m3 B0 s, T
     unsigned int b = state[1];
) F0 e* n6 K, Q7 D1 D5 s0 \4 |. |     unsigned int c = state[2];) f6 q/ `2 R2 k3 n" E8 C6 `
     unsigned int d = state[3];
2 }1 E2 V1 F0 \& E- A4 q8 c# |     unsigned int x[64];* t* m* d' s5 S$ h9 W* x
     MD5Decode(x,block,64);
: E9 ^) L& y3 x$ ?     FF(a, b, c, d, x[ 0], 7, 0xd76aa478); /* 1 */
4 L% ?, M- k1 k* ~ FF(d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */1 a0 h  _* h, V6 d
FF(c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */
# Q! a9 d) y( p; g  l; s FF(b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */" e" j+ [5 J0 M) d3 X
FF(a, b, c, d, x[ 4], 7, 0xf57c0faf); /* 5 */
" P/ A3 E3 \( W  x9 | FF(d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */) u0 t3 F4 _) t, X% a0 ^
FF(c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */$ h: o" L4 N2 R1 w5 T% G- }( W& k
FF(b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */8 V0 I2 o% Q; A0 p& ^/ N
FF(a, b, c, d, x[ 8], 7, 0x698098d8); /* 9 */  g8 F! ~) |5 V! o) {
FF(d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */9 Y; j. Z9 c: o) V: d
FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */" c3 s: {' |6 h+ v
FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */
: F9 K  ?) }' V0 z4 A FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */  a3 a, E6 D5 ~: \' z
FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */
2 |+ ^$ P6 m; N FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */* b& B0 r; `, E* N
FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 */! F8 d3 }" M/ P

: w2 b$ r# @! S- {2 [0 |, O9 e /* Round 2 */
- g. Q" z( ~2 `: \1 _8 }& q GG(a, b, c, d, x[ 1], 5, 0xf61e2562); /* 17 */( k5 p9 Q8 P3 f2 I
GG(d, a, b, c, x[ 6], 9, 0xc040b340); /* 18 */3 ~- D! J4 q1 y7 d% r3 |7 A  {
GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */
  b, t( i# s% S5 Z+ E GG(b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /* 20 */* w0 W; S' U% F; n- u4 }* v6 S% F5 V
GG(a, b, c, d, x[ 5], 5, 0xd62f105d); /* 21 */; S, g6 X% u$ @8 G" `/ K
GG(d, a, b, c, x[10], 9,  0x2441453); /* 22 */# _! n- I. f( e! b
GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */
+ Q" d7 n) u, w3 r GG(b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /* 24 */
. N$ [8 R7 u! t- q GG(a, b, c, d, x[ 9], 5, 0x21e1cde6); /* 25 */
7 e1 B$ o% S  b GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */4 v+ D; Y  p5 v  m* t
GG(c, d, a, b, x[ 3], 14, 0xf4d50d87); /* 27 */9 N7 V3 P7 \1 c& X1 U! F/ Y0 Y# a
GG(b, c, d, a, x[ 8], 20, 0x455a14ed); /* 28 */
2 b/ C$ h0 u0 d" Y3 S GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */, o/ A0 e1 N* [, E6 |7 A9 |
GG(d, a, b, c, x[ 2], 9, 0xfcefa3f8); /* 30 */
2 _' E, M/ I2 K; D) l1 V GG(c, d, a, b, x[ 7], 14, 0x676f02d9); /* 31 */  ^% I5 [& V% c# m* b
GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */
- W! }+ Y$ [2 ^. a. d: x$ M% q$ w ( ?% g! q# y1 T0 z* }. ~
/* Round 3 */
: s& Z8 e  }  x" ^$ C# q) V HH(a, b, c, d, x[ 5], 4, 0xfffa3942); /* 33 */
2 k/ K4 S1 f0 \- r2 D HH(d, a, b, c, x[ 8], 11, 0x8771f681); /* 34 */( A- [; R) m, W# t" e
HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */
, I( r( F5 E  N: a8 ?7 [% X HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */
" v* p' C/ j' v HH(a, b, c, d, x[ 1], 4, 0xa4beea44); /* 37 */
& r3 [& Y( ^/ n3 \( Q! }1 D( D HH(d, a, b, c, x[ 4], 11, 0x4bdecfa9); /* 38 */7 ~, v" a2 H: X1 Y
HH(c, d, a, b, x[ 7], 16, 0xf6bb4b60); /* 39 */1 t" p6 Z  G. L  L
HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */2 N* T7 s8 c  |
HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */
4 _6 A$ T$ L% D# W! I. {5 W HH(d, a, b, c, x[ 0], 11, 0xeaa127fa); /* 42 */$ I4 M6 D6 T6 O8 S+ h7 [- Q
HH(c, d, a, b, x[ 3], 16, 0xd4ef3085); /* 43 */6 |* y* r- }8 `' e
HH(b, c, d, a, x[ 6], 23,  0x4881d05); /* 44 */
0 W+ H7 U5 d5 m HH(a, b, c, d, x[ 9], 4, 0xd9d4d039); /* 45 */
5 p! {+ z2 u" R2 R/ y HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */
3 n" a: ~, W2 B. }3 Z9 K' W HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */
  w2 M4 o2 b6 Q HH(b, c, d, a, x[ 2], 23, 0xc4ac5665); /* 48 */
0 N# k+ B) H6 y8 t  T! _ 9 s; \* q, T" ~# m3 G% W$ [0 A
/* Round 4 */
# ^0 k5 R3 P* P- z: f II(a, b, c, d, x[ 0], 6, 0xf4292244); /* 49 */: }, E2 p  Q# u: ^. h4 K3 j
II(d, a, b, c, x[ 7], 10, 0x432aff97); /* 50 */
  L+ F5 c7 k1 ^  i/ u# ~  z/ @) d II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */3 {+ @) U7 U) M
II(b, c, d, a, x[ 5], 21, 0xfc93a039); /* 52 */9 H: h3 f9 T6 T) E
II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */3 F1 ]8 s0 ^2 G$ _
II(d, a, b, c, x[ 3], 10, 0x8f0ccc92); /* 54 */% R$ ~/ E. r4 }, y1 @6 ~8 e+ S' S
II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */! ?. C% G) z! r2 o$ o' _
II(b, c, d, a, x[ 1], 21, 0x85845dd1); /* 56 */8 Z0 O6 I! R. M2 t
II(a, b, c, d, x[ 8], 6, 0x6fa87e4f); /* 57 *// E- r9 X3 x7 o2 g$ ?0 K6 m0 e0 g' k  p
II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */* |& u# W  X+ T) D% n
II(c, d, a, b, x[ 6], 15, 0xa3014314); /* 59 */
" q/ s6 a" R$ j9 I/ k6 o/ L II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */
0 s7 \6 {& U, J2 ]1 K II(a, b, c, d, x[ 4], 6, 0xf7537e82); /* 61 */& t) W* S9 l* e
II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */7 Q" s  {( n* @% o; i3 e1 _! |
II(c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /* 63 */
; {) z6 t& H2 z) ?/ @2 W5 b3 I/ ? II(b, c, d, a, x[ 9], 21, 0xeb86d391); /* 64 */1 R. n  K/ |/ S1 `7 Z
     state[0] += a;! _) M* U9 u- `. T, M5 L
     state[1] += b;
/ _# L2 k6 I, I2 h: C* b8 i$ a     state[2] += c;
  ~/ H( k3 a$ Y3 x- u* _- E9 M/ ^     state[3] += d;
( S9 v5 D' y4 I' g}% @2 [$ t0 ^. {
五、MD5加密实例

MD5加密步骤如下:

  • 定义
    ( z/ R8 E4 u" n9 |4 y1 f/ Y' {
MD5_CTX md5c;
; c$ T0 k/ l$ B
  • 初始化
    3 Y1 ^1 B$ Q+ D9 ^* O9 K( r
/********************************************************5 ]0 _5 ~) c" a! N% C
* 名    称: MD5Init()
+ I" c! r- l5 r* V$ q* 功    能: 初始化MD5结构体
; A& i# \, e$ z8 o- @3 ~* N* 入口参数:
, r* Z7 y# p$ Y$ }   context:要初始化的MD5结构体
# u, q$ n' K2 i* 出口参数: 无
! j6 k; Y; E7 ~4 v7 {. t6 P; I8 \*********************************************************/
8 g& Z1 m8 ]* a- |1 R& G. x% ]
MD5Init(MD5_CTX *context);" K/ q! w. C- _, h3 r) j
  • MD5值计算3 j" z( H" H3 c  x. U

实现MD5值的计算及结构体的更新:

# D0 c+ J- P7 t* b) s: h1 j! P% b0 ^
/*********************************************************
# Z! A- n+ X- }& f/ K' I# {* 名    称: MD5Update()# W" T) D, T" h5 ]# m
* 功    能: 将要加密的信息传递给初始化过的MD5结构体,无返回值& P( D7 L! }! J4 d7 G8 N8 M
* 入口参数: ; P4 r- N* t3 q
   context:初始化过了的MD5结构体
& U. R+ C4 y# C5 S! O) r# T    input:需要加密的信息,可以任意长度
' b6 ^0 _( q0 |* O4 y2 q    inputLen:指定input的长度% e. Q- k$ o, x0 w1 o0 b4 X
* 出口参数: 无% B! j0 k9 |! j! \1 L$ j8 u" W
*********************************************************/

  G8 q. k# |) JMD5Update(MD5_CTX *context,(unsigned char *)input,inputLen); ; u' \4 [+ N$ \6 o6 `9 A& `2 r
  • 输出转换, i4 h# ^+ a$ r& D" y
/*********************************************************
$ J! o/ ]* `$ z* 名    称: MD5Update()
; m8 {# k- o6 M! M: D: Y% l* 功    能: 将加密结果存储到,无返回值
1 n3 S$ |+ b) C# T* 入口参数: ) v6 r+ e( B# a2 x; N
   context:初始化过了的MD5结构体
. j4 @& m: U, w+ D" D0 i" ^" y    digest :加密过的结果
, }  _: u4 H* l9 Y* 出口参数: 无
: m9 ?9 e- ^. {' h+ |4 j8 Z& p$ d*********************************************************/

. I9 G8 L% Y" w$ M; k& mMD5Final(MD5_CTX *context,unsigned char digest[16]);: o+ [  ^" A/ C
  • 格式整理5 r, ]" d% v3 [# E  g, p

转换成32位的16进制字符串。

实例1 字符串加密

对字符串进行加密:

  1 #include <stdio.h>) F4 Y( f- J9 U1 j% h
  2 #include <stdlib.h>* H0 p" L' d& b  ^! S$ o) X
  3 #include "md5.h"3 a! v2 o' `! ]( H8 Y. X; w
  4 #include <sys/types.h>
( T* I3 ~# e% N5 j  5 #include <sys/stat.h>
3 d! m# ^9 d; O( K  6 #include <fcntl.h>, w' \+ K2 F- K' y" L9 e
  7 #include <string.h>
1 |5 U/ g+ g2 h6 ?, Y$ z# q  8 $ F1 X0 m; r- K3 t5 ?4 `
  9 void main( void )
, V, H$ z6 N3 X 10 { ; Z3 S& h( J( m- ]  l% M
11     int read_len;
0 j( t2 k2 t- w# N 12     int i ;1 o6 v5 |1 w) h4 g+ v8 U, k
13     char temp[8]={0};
0 j# O8 p0 x  T8 ~ 14     unsigned char digest[16]; //存放结果 " B) D1 T, s! e/ T8 |4 d
15     char hexbuf[128]="12334567";
0 J# D/ {# |9 P* @' z2 E 16     unsigned char decrypt[16]={0};  6 b$ _2 N6 i5 x) r7 |  {
17     unsigned char decrypt32[64]={0};   
/ d8 \' q1 V9 n$ P& u! Y 18
' C8 r/ O0 m# Y# Q  o  x 19     MD5_CTX md5c; ! C5 U6 Y# o) Q4 d% S  W, w# J
20
* N, `1 Z' C* s% v+ j8 y 21     MD5Init(&md5c); //初始化  W" C, X# C" T! F5 e- U
22     read_len = strlen(hexbuf);
8 p. m( A$ G0 W: y' ~ 23     MD5Update(&md5c,(unsigned char *)hexbuf,read_len);  
. z4 y8 }& q8 e- _, q$ ^7 y 24
! z: B$ H3 V4 @& E' z7 J$ @/ P 25     MD5Final(&md5c,decrypt);
: n- y4 v/ P- z 26     strcpy((char *)decrypt32,"");' Y4 C( D& R$ o+ G% e
27 5 ~4 B! F/ g' |4 g2 z) y/ i1 \! e0 m
28     for(i=0;i<16;i++)
6 M& W4 Z1 G0 O0 e 29     {) I& E# P; y  d1 E  @1 `6 D$ k
30         sprintf(temp,"%02x",decrypt);4 l8 A# v% s# C
31         strcat((char *)decrypt32,temp);
+ \! o2 E4 _+ E' z9 i  y* d 32     }
' r5 v( Y2 P. \2 H 33     printf("md5:%s\n",decrypt32);8 O  \1 |* d* o
34     
$ u1 l- T6 l' o 35     return;- y% Y0 h3 l: Y7 p) f$ a' Q; I
36 }# v4 X- r/ d% H. m# Z6 _1 I3 i

执行结果如下:

微信图片_20210222214615.png

本例对字符串12334567进行加密,结果和在线加密结果一致。

实例2 文件加密

对文件进行加密

#include <stdio.h>
* d) Z! D; ~, Q#include <stdlib.h>) }% q/ |/ A2 w# U
#include "md5.h"
$ Z! E; x' z0 b0 O: C#include <sys/types.h>
8 N2 C0 S; R8 W3 L! D) l7 Q' J+ s#include <sys/stat.h>( c# R# {7 L8 l
#include <fcntl.h>. I# t$ O5 \$ b
#include <string.h>
; @2 @1 {2 Q; d0 Y& q7 V; I& v+ X/ e" _" R9 R' j" q
#define FORWORD_FW "123.c"
) H% Q  n" w3 L8 R% t3 `8 H. C; J  C% \; W
int calc_md5(char*filename,char*dest)
# X5 Q. c+ N, ?1 i# k$ E+ T* Z( Y{
: k1 A% i, W& ~  _) E* [ int i;
+ g  K/ d8 a1 \( _. X. _7 i int filelen = 0;, D2 G0 V  j0 D5 ?. `& p: X7 o# q
int read_len;" M9 x8 n; ~9 J/ I9 v9 h% g
char temp[8]={0}; ( _7 _  C7 A6 ?& f2 N& ?
char hexbuf[128]={0};3 v. h( O: d4 Z( y
unsigned char decrypt[16]={0};  4 ]6 y2 X0 `2 p2 Z" l
unsigned char decrypt32[64]={0};
) `5 Y* l2 b! T& K. M& f MD5_CTX md5;( f* f/ |, T' U5 g. `4 a
char fw_path[128];
. E7 T6 c- q* I2 k, Q3 T7 p$ ^. c1 l8 T7 g$ J8 {7 P& m
int fdf;
8 V1 B" K/ W# s0 x 9 R/ Y# x  i) {1 H
fdf = open(filename,O_RDWR);
( v" _# ?' a/ Q$ c! I) |- x) h if(fdf<0)% S8 B; @$ h/ S" Z
{
3 R- a7 d: l; i% D. Y  printf("%s not exist\n",FORWORD_FW);4 I1 y7 G! M0 U+ U. o( O* m
  return -1;) J' G* A  b+ ?: J+ d% i
}' j5 S. q% Y- ?2 r6 t0 D0 E
* m6 Q$ n2 k/ b& f4 s
MD5Init(&md5);  % I2 T" n% z" m; V2 g
while(1)
& \$ f( y. z+ d, r; x {
; S4 j3 R( Y- r0 G  read_len = read(fdf, hexbuf,sizeof(hexbuf)); . h5 x/ x% ?. Y% f# ~6 z: J
  if (read_len <0) {  7 q+ `/ c: ?: `3 Z4 X/ p1 P: b( Q
   close(fdf);   
3 K. C- V- w" h! u+ i   return -1;0 Y. b# J% E3 N, u6 f% g1 `* ]
  }
! m( }  ?6 }3 x% k  if(read_len==0)
6 o; B( Q& q! o! D' {* d, ?0 X5 V  {
) k6 ?& D) f! s' I" M   break;: i+ C7 G3 ~2 _: ]
  }1 H: h+ r( M3 E6 k9 M8 |
  filelen += read_len;. i3 L( S3 f& }
  MD5Update(&md5,(unsigned char *)hexbuf,read_len); $ E3 G" S; ?! _1 A! V, w
}1 g5 \$ ]; _8 P6 n) }. o. A8 h

. b5 d. E$ O( I2 Q/ X8 {) A
( X* e( ^. S7 g8 T. \) z MD5Final(&md5,decrypt);
2 I* y) K* Q8 G strcpy((char *)decrypt32,"");. u, M6 n+ c/ ~; k

* H4 r! O6 ~2 l6 a8 G for(i=0;i<16;i++)
% `. L9 o: X: ` {
0 \. a1 ^* r& n8 ~' C) ?2 f# [  sprintf(temp,"%02x",decrypt);& s4 d6 |% s$ ~4 [! M
  strcat((char *)decrypt32,temp);$ W# N8 N  r# R; |1 o4 k6 o
}* q7 J7 K! ^/ Y* n/ A* }# y
strcpy(dest,decrypt32);
' D! [0 k2 l8 k' U% c; U5 A7 ?' |* \: d
printf("md5:%s len=%d\n",dest,filelen);5 @* t5 Y/ p- P
close(fdf);; n9 q3 ^; n! Q5 A2 U' p

1 ]7 v4 C1 k+ e( A) `4 e return filelen;
$ L! t9 s- v2 ^1 s& K1 C}
8 w0 N$ y! T3 \7 F$ kint main(int argc, char *argv[])0 E. G+ f) O- i" F2 R
{4 I/ q( ^3 [6 o
int ret;
: b. M, S% t4 ?; ` int filelen;
$ v4 V; l* n9 y4 c( K; f" q char md5_str[64]={0};
* U" k9 d$ H: O# r' @7 Y1 k( J char cmd[256]={0};4 a, C* G3 o9 a1 c' M- P

; r5 R7 a. ~  [ filelen = calc_md5(FORWORD_FW,md5_str);
& D; j! E: |& j& Z( I4 L5 l if(filelen<0)( P$ P, G: V+ ?/ w  g
{% J" Q% o& K0 B6 X5 I
  printf("calc_md5 fail\n");  S7 e# S+ G4 \) K! Q
  return -1;* O/ q/ w( \8 u: P5 s/ y* s! c* {
}7 y2 Z2 ^  L4 B
8 h# l! d/ v5 s3 w( p2 F
return 0;5 p, ~. h3 P, U# j8 B
}
5 \& N6 x. B% V( c& Q- w2 Y" S* ^

运行结果:

微信图片_20210222214618.png

在线验证结果对比:

http://www.metools.info/other/o21.html

微信图片_20210222214621.png 结果
" Z/ N9 u  T# [9 o* \
赞 1 收藏 1 评论1 发布时间:2021-2-22 21:47

举报

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