Introduction
In cryptography, MD5 (Message-Digest algorithm 5) is a widely used, partially insecure cryptographic hash function with a 128-bit hash value. As an Internet standard (RFC 1321), MD5 has been employed in a wide variety of security applications, and is also commonly used to check the integrity of files. An MD5 hash is typically expressed as a 32 digit hexadecimal number.
For more information regarding MD5, click here.
Background
This tool is for calculating/verifying MD5 value of an EXE or multiple EXEs in a folder and its sub folders.
Using the Code
The basic function in this tool is as follows. This function will accept the EXE "FileName" and will return the MD5 value in "MD5". Anyone can use this function in his/her code to get the MD5 value. Just copy and paste this function in your code. You should include the header <wincrypt.h>.
int CalculateMD5(CString FileName, CString &MD5)
{
const size_t StringSize = FileName.GetLength() + 1;
size_t CharactersConverted = 0;
char *file = new char[StringSize];
wcstombs_s(&CharactersConverted, file,
FileName.GetLength()+1, FileName, _TRUNCATE);
int i, j;
FILE *fInput;
MD5Context md5Hash;
unsigned char bBuffer[4096];
unsigned char b;
char c;
if(!CryptStartup())
{
MessageBoxW(0, L"Could not start crypto library",
L"MD5", MB_ICONERROR);
return 0;
}
fInput = fopen(file, "rb");
if(!fInput)
{
MessageBoxW(0, L"Failed to open - Invalid File",
L"MD5", MB_ICONERROR);
CryptCleanup();
return 0;
}
memset(&md5Hash, 0, sizeof(MD5Context));
MD5Init(&md5Hash);
while(!feof(fInput)){
unsigned int nCount = fread(bBuffer, sizeof(unsigned char),
4096, fInput);
MD5Update(&md5Hash, bBuffer, nCount);
}
MD5Final(&md5Hash);
fclose(fInput);
char *Value = new char[1024];int k = 0;
for(i = 0; i < 16; i++)
{
b = md5Hash.digest[i];
for(j = 4; j >= 0; j -= 4)
{
c = ((char)(b >> j) & 0x0F);
if(c < 10) c += '0';
else c = ('a' + (c - 10));
Value[k] = c;
k++;
}
}
Value[k] = '\0';
CryptCleanup();
MD5 = CString(Value);
delete file;
delete Value;
return 1;
}
History
- 3rd January, 2009: Initial post