C++计算文件MD5值.docx
《C++计算文件MD5值.docx》由会员分享,可在线阅读,更多相关《C++计算文件MD5值.docx(27页珍藏版)》请在冰点文库上搜索。
C++计算文件MD5值
MD5ChecksumDefines.h
1.//Magic initialization constants
2.#define MD5_INIT_STATE_0 0x67452301
3.#define MD5_INIT_STATE_1 0xefcdab89
4.#define MD5_INIT_STATE_2 0x98badcfe
5.#define MD5_INIT_STATE_3 0x10325476
6.
7.//Constants for Transform routine.
8.#define MD5_S11 7
9.#define MD5_S12 12
10.#define MD5_S13 17
11.#define MD5_S14 22
12.#define MD5_S21 5
13.#define MD5_S22 9
14.#define MD5_S23 14
15.#define MD5_S24 20
16.#define MD5_S31 4
17.#define MD5_S32 11
18.#define MD5_S33 16
19.#define MD5_S34 23
20.#define MD5_S41 6
21.#define MD5_S42 10
22.#define MD5_S43 15
23.#define MD5_S44 21
24.
25.//Transformation Constants - Round 1
26.#define MD5_T01 0xd76aa478 //Transformation Constant 1
27.#define MD5_T02 0xe8c7b756 //Transformation Constant 2
28.#define MD5_T03 0x242070db //Transformation Constant 3
29.#define MD5_T04 0xc1bdceee //Transformation Constant 4
30.#define MD5_T05 0xf57c0faf //Transformation Constant 5
31.#define MD5_T06 0x4787c62a //Transformation Constant 6
32.#define MD5_T07 0xa8304613 //Transformation Constant 7
33.#define MD5_T08 0xfd469501 //Transformation Constant 8
34.#define MD5_T09 0x698098d8 //Transformation Constant 9
35.#define MD5_T10 0x8b44f7af //Transformation Constant 10
36.#define MD5_T11 0xffff5bb1 //Transformation Constant 11
37.#define MD5_T12 0x895cd7be //Transformation Constant 12
38.#define MD5_T13 0x6b901122 //Transformation Constant 13
39.#define MD5_T14 0xfd987193 //Transformation Constant 14
40.#define MD5_T15 0xa679438e //Transformation Constant 15
41.#define MD5_T16 0x49b40821 //Transformation Constant 16
42.
43.//Transformation Constants - Round 2
44.#define MD5_T17 0xf61e2562 //Transformation Constant 17
45.#define MD5_T18 0xc040b340 //Transformation Constant 18
46.#define MD5_T19 0x265e5a51 //Transformation Constant 19
47.#define MD5_T20 0xe9b6c7aa //Transformation Constant 20
48.#define MD5_T21 0xd62f105d //Transformation Constant 21
49.#define MD5_T22 0x02441453 //Transformation Constant 22
50.#define MD5_T23 0xd8a1e681 //Transformation Constant 23
51.#define MD5_T24 0xe7d3fbc8 //Transformation Constant 24
52.#define MD5_T25 0x21e1cde6 //Transformation Constant 25
53.#define MD5_T26 0xc33707d6 //Transformation Constant 26
54.#define MD5_T27 0xf4d50d87 //Transformation Constant 27
55.#define MD5_T28 0x455a14ed //Transformation Constant 28
56.#define MD5_T29 0xa9e3e905 //Transformation Constant 29
57.#define MD5_T30 0xfcefa3f8 //Transformation Constant 30
58.#define MD5_T31 0x676f02d9 //Transformation Constant 31
59.#define MD5_T32 0x8d2a4c8a //Transformation Constant 32
60.
61.//Transformation Constants - Round 3
62.#define MD5_T33 0xfffa3942 //Transformation Constant 33
63.#define MD5_T34 0x8771f681 //Transformation Constant 34
64.#define MD5_T35 0x6d9d6122 //Transformation Constant 35
65.#define MD5_T36 0xfde5380c //Transformation Constant 36
66.#define MD5_T37 0xa4beea44 //Transformation Constant 37
67.#define MD5_T38 0x4bdecfa9 //Transformation Constant 38
68.#define MD5_T39 0xf6bb4b60 //Transformation Constant 39
69.#define MD5_T40 0xbebfbc70 //Transformation Constant 40
70.#define MD5_T41 0x289b7ec6 //Transformation Constant 41
71.#define MD5_T42 0xeaa127fa //Transformation Constant 42
72.#define MD5_T43 0xd4ef3085 //Transformation Constant 43
73.#define MD5_T44 0x04881d05 //Transformation Constant 44
74.#define MD5_T45 0xd9d4d039 //Transformation Constant 45
75.#define MD5_T46 0xe6db99e5 //Transformation Constant 46
76.#define MD5_T47 0x1fa27cf8 //Transformation Constant 47
77.#define MD5_T48 0xc4ac5665 //Transformation Constant 48
78.
79.//Transformation Constants - Round 4
80.#define MD5_T49 0xf4292244 //Transformation Constant 49
81.#define MD5_T50 0x432aff97 //Transformation Constant 50
82.#define MD5_T51 0xab9423a7 //Transformation Constant 51
83.#define MD5_T52 0xfc93a039 //Transformation Constant 52
84.#define MD5_T53 0x655b59c3 //Transformation Constant 53
85.#define MD5_T54 0x8f0ccc92 //Transformation Constant 54
86.#define MD5_T55 0xffeff47d //Transformation Constant 55
87.#define MD5_T56 0x85845dd1 //Transformation Constant 56
88.#define MD5_T57 0x6fa87e4f //Transformation Constant 57
89.#define MD5_T58 0xfe2ce6e0 //Transformation Constant 58
90.#define MD5_T59 0xa3014314 //Transformation Constant 59
91.#define MD5_T60 0x4e0811a1 //Transformation Constant 60
92.#define MD5_T61 0xf7537e82 //Transformation Constant 61
93.#define MD5_T62 0xbd3af235 //Transformation Constant 62
94.#define MD5_T63 0x2ad7d2bb //Transformation Constant 63
95.#define MD5_T64 0xeb86d391 //Transformation Constant 64
96.
97.
98.//Null data (except for first BYTE) used to finalise the checksum calculation
99.static unsigned char PADDING[64] = {
100. 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
101. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
102. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
103.};
CMD5Checksum.h
[cpp] viewplain copy
1.#if !
defined(AFX_MD5CHECKSUM_H__2BC7928E_4C15_11D3_B2EE_A4A60E20D2C3__INCLUDED_)
2.#define AFX_MD5CHECKSUM_H__2BC7928E_4C15_11D3_B2EE_A4A60E20D2C3__INCLUDED_
3.
4.#if _MSC_VER > 1000
5.#pragma once
6.#endif // _MSC_VER > 1000
7./*****************************************************************************************
8.
9.
10.*****************************************************************************************/
11.class CMD5Checksum
12.{
13.public:
14. static CString GetMD5OfString(CString strString);
15. //interface functions for the RSA MD5 calculation
16. static CString GetMD5(const CString& strFilePath);
17.
18.protected:
19. //constructor/destructor
20. CMD5Checksum();
21. virtual ~CMD5Checksum() {};
22.
23. //RSA MD5 implementation
24. void Transform(BYTE Block[64]);
25. void Update(BYTE* Input, ULONG nInputLen);
26. CString Final();
27. inline DWORD RotateLeft(DWORD x, int n);
28. inline void FF( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);
29. inline void GG( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);
30. inline void HH( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);
31. inline void II( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);
32.
33. //utility functions
34. inline void DWordToByte(BYTE* Output, DWORD* Input, UINT nLength);
35. inline void ByteToDWord(DWORD* Output, BYTE* Input, UINT nLength);
36.
37.private:
38. BYTE m_lpszBuffer[64]; //input buffer
39. ULONG m_nCount[2]; //number of bits, modulo 2^64 (lsb first)
40. ULONG m_lMD5[4]; //MD5 checksum
41.};
42.
43.#endif // !
defined(AFX_MD5CHECKSUM_H__2BC7928E_4C15_11D3_B2EE_A4A60E20D2C3__INCLUDED_)
MD5Checksum.cpp
[cpp] viewplain copy
1.#include "stdafx.h"
2.#include "MD5Checksum.h"
3.#include "MD5ChecksumDefines.h"
4.
5.#ifdef _DEBUG
6.#undef THIS_FILE
7.static char THIS_FILE[]=__FILE__;
8.#define new DEBUG_NEW
9.#endif
10.
11.
12./*****************************************************************************************
13.
14.*****************************************************************************************/
15.CString CMD5Checksum:
:
GetMD5(const CString& strFilePath)
16.{
17. try
18. {
19. CFile file;
20. if(file.Open(strFilePath,CFile:
:
modeRead)==0)
21. return _T("");
22.
23. CMD5Checksum MD5Checksum; //checksum object
24. int nLength = 0; //number of bytes read from the file
25. const int nBufferSize = 1024; //checksum the file in blocks of 1024 bytes
26. BYTE Buffer[nBufferSize]; //buffer for data read from the file
27.
28. //checksum the file in blocks of 1024 bytes
29. while ((nLength = file.Read( Buffer, nBufferSize )) > 0 )
30. {
31. MD5Checksum.Update( Buffer, nLength );
32. }
33.
34. file.Close();
35.
36. //finalise the checksum and return it
37. return MD5Checksum.Final();
38. }
39.
40. //report any file exceptions in debug mode only
41. catch (CFileException* e )
42. {
43. TRACE0("CMD5Checksum:
:
GetMD5:
CFileException caught");
44. throw e;
45. }
46.}
47.
48./*****************************************************************************************
49.FUNCTION:
CMD5Checksum:
:
RotateLeft
50.DETAILS:
private
51.DESCRIPTION:
Rotates the bits in a 32 bit DWORD left by a specified amount
52.RETURNS:
The rotated DWORD
53.ARGUMENTS:
DWORD x :
the value to be rotated
54.int n :
the number of bits to rotate by
55.*****************************************************************************************/
56.DWORD CMD5Checksum:
:
RotateLeft(DWORD x, int n)
57.{
58. //check that DWORD is 4 bytes long - true in Visual C++ 6 and 32 bit Windows
59. ASSERT( sizeof(x) == 4 );
60.
61. //rotate and return x
62. return (x << n) | (x >> (32-n));
63.}
64.
65.
66./*****************************************************************************************
67.FUNCTION:
CMD5Checksum:
:
FF
68.DETAILS:
protected
69.DESCRIPTION:
Implementation of basic MD5 transformation algorithm
70.RETURNS:
none
71.ARGUMENTS:
DWORD &A, B, C, D :
Current (partia