C++使用API计算MD5值

来源:互联网 发布:mac web开发工具 编辑:程序博客网 时间:2024/05/29 15:34

关于MD5值的介绍网上有很多资料,在此不再介绍。
本文主要通过使用Windows提供的API计算MD5值。
主要API函数:

头文件: Wincrypt.h
1、CryptAcquireContext(https://msdn.microsoft.com/en-us/library/windows/desktop/aa379886%28v=vs.85%29.aspx)
2、CryptCreateHash(https://msdn.microsoft.com/en-us/library/windows/desktop/aa379908%28v=vs.85%29.aspx)
3、CryptHashData(https://msdn.microsoft.com/en-us/library/windows/desktop/aa380202%28v=vs.85%29.aspx)
4、CryptGetHashParam(https://msdn.microsoft.com/en-us/library/windows/desktop/aa379947%28v=vs.85%29.aspx)
5、CryptDestroyHash(https://msdn.microsoft.com/en-us/library/windows/desktop/aa379917%28v=vs.85%29.aspx)
6、CryptReleaseContext(https://msdn.microsoft.com/en-us/library/windows/desktop/aa380268%28v=vs.85%29.aspx)
(函数详情可直接点击上面链接查看)

例子:

CString CMTFileSender::ComputeMd5Value(LPCTSTR lpszFilePath){    CString strMd5 = _T("");    CFile * pFileS = NULL;    try    {        pFileS = new CFile(lpszFilePath, CFile::modeRead | CFile::shareDenyNone);    }    catch (CFileException* pEx)    {        pEx->ReportError();        pEx->Delete();    }    if (pFileS)    {        ULONGLONG dwLength = pFileS->GetLength();        HCRYPTPROV hProv = NULL;        if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))        {            HCRYPTHASH hHash;            if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))            {                while (dwLength > 0)                {                    BYTE pbufRead[0x1000];                    UINT nReadNum = sizeof(pbufRead);                    nReadNum = pFileS->Read(pbufRead, nReadNum);                    if (nReadNum)                    {                        BOOL bHash = CryptHashData(hHash, pbufRead, nReadNum, 0);                        dwLength -= nReadNum;                    }                    else                        break;                }                if (dwLength == 0)                {                    DWORD dwSize = 0;                    DWORD dwLen = sizeof(dwSize);                    CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)(&dwSize), &dwLen, 0);                    BYTE* pHash = new BYTE[dwSize];                    dwLen = dwSize;                    CryptGetHashParam(hHash, HP_HASHVAL, pHash, &dwLen, 0);                    CStringA Md5;                    for (DWORD i = 0; i < dwLen; ++i)                    {                        Md5.AppendFormat("%02X", pHash[i]);                    }                    strMd5 = CString(Md5);                }                CryptDestroyHash(hHash);            }            CryptReleaseContext(hProv, 0);        }        pFileS->Close();        delete pFileS;    }    return strMd5;}
0 0