65.9K
CodeProject 正在变化。 阅读更多。
Home

MD5 文件创建和验证

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.35/5 (10投票s)

2009年1月3日

CPOL
viewsIcon

263799

downloadIcon

4049

用于创建/验证 MD5 文件的工具

MD5

引言

在密码学中,MD5(消息摘要算法 5)是一种广泛使用、部分不安全的密码学哈希函数,具有 128 位的哈希值。 作为一项互联网标准 (RFC 1321),MD5 已被应用于各种安全应用程序中,并且通常用于检查文件的完整性。 MD5 哈希通常表示为 32 位十六进制数字。

有关 MD5 的更多信息,请点击此处

背景

此工具用于计算/验证 EXE 文件或文件夹及其子文件夹中多个 EXE 文件的 MD5 值。

Using the Code

此工具的基本功能如下。 此函数将接受 EXE 文件“FileName”,并将以“MD5”的形式返回 MD5 值。 任何人都可以将此函数用于其/她的代码以获取 MD5 值。 只需将此函数复制并粘贴到您的代码中即可。 您应该包含头文件 <wincrypt.h>

int CalculateMD5(CString FileName, CString &MD5)
{
    const size_t StringSize = FileName.GetLength() + 1;
    size_t CharactersConverted = 0;

    char *file = new char[StringSize];
    //char file[1024];
    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);
    //printf("\nChecksum of '%s' is: ", argv[1]);
    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));
            //printf("%c", c);
			Value[k] = c;
			k++;
        }
    }
    Value[k] = '\0';
    CryptCleanup();
	
    //CString cString;
    MD5 = CString(Value);
    //MessageBox(cString);
	
    delete file;
    delete Value;
    return 1;
}

历史

  • 2009年1月3日:初始发布
© . All rights reserved.