c++计算 md5 sha1 sha256值

//#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>

void ShowError(const char *pszText)
{
    char szErr[MAX_PATH] = { 0 };
    ::wsprintf(szErr, "%s Error[%d]\n", pszText, ::GetLastError());
#ifdef _DEBUG
    ::MessageBox(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR);
#endif
}

BOOL GetFileData(const char *pszFilePath, BYTE **ppFileData, DWORD *pdwFileDataLength)
{
    BOOL bRet = TRUE;
    BYTE *pFileData = NULL;
    DWORD dwFileDataLength = 0;
    HANDLE hFile = NULL;
    DWORD dwTemp = 0;

    do
    {
        hFile = ::CreateFile(pszFilePath, GENERIC_READ | GENERIC_WRITE,
                             FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
                             FILE_ATTRIBUTE_ARCHIVE, NULL);
        if (INVALID_HANDLE_VALUE == hFile)
        {
            bRet = FALSE;
            ShowError("CreateFile");
            break;
        }

        dwFileDataLength = ::GetFileSize(hFile, NULL);

        pFileData = new BYTE[dwFileDataLength];
        if (NULL == pFileData)
        {
            bRet = FALSE;
            ShowError("new");
            break;
        }
        ::RtlZeroMemory(pFileData, dwFileDataLength);

        ::ReadFile(hFile, pFileData, dwFileDataLength, &dwTemp, NULL);

        // 返回
        *ppFileData = pFileData;
        *pdwFileDataLength = dwFileDataLength;

    }
    while (FALSE);

    if (hFile)
    {
        ::CloseHandle(hFile);
    }

    return bRet;
}

BOOL CalculateHash(BYTE *pData, DWORD dwDataLength, ALG_ID algHashType, BYTE **ppHashData, DWORD *pdwHashDataLength)
{
    HCRYPTPROV hCryptProv = NULL;
    HCRYPTHASH hCryptHash = NULL;
    BYTE *pHashData = NULL;
    DWORD dwHashDataLength = 0;
    DWORD dwTemp = 0;
    BOOL bRet = FALSE;

    do
    {
        // 获得指定CSP的密钥容器的句柄
        bRet = ::CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
        if (FALSE == bRet)
        {
            ShowError("CryptAcquireContext");
            break;
        }

        // 创建一个HASH对象, 指定HASH算法
        bRet = ::CryptCreateHash(hCryptProv, algHashType, NULL, NULL, &hCryptHash);
        if (FALSE == bRet)
        {
            ShowError("CryptCreateHash");
            break;
        }

        // 计算HASH数据
        bRet = ::CryptHashData(hCryptHash, pData, dwDataLength, 0);
        if (FALSE == bRet)
        {
            ShowError("CryptHashData");
            break;
        }

        // 获取HASH结果的大小
        dwTemp = sizeof(dwHashDataLength);
        bRet = ::CryptGetHashParam(hCryptHash, HP_HASHSIZE, (BYTE *)(&dwHashDataLength), &dwTemp, 0);
        if (FALSE == bRet)
        {
            ShowError("CryptGetHashParam");
            break;
        }

        // 申请内存
        pHashData = new BYTE[dwHashDataLength];
        if (NULL == pHashData)
        {
            bRet = FALSE;
            ShowError("new");
            break;
        }
        ::RtlZeroMemory(pHashData, dwHashDataLength);

        // 获取HASH结果数据
        bRet = ::CryptGetHashParam(hCryptHash, HP_HASHVAL, pHashData, &dwHashDataLength, 0);
        if (FALSE == bRet)
        {
            ShowError("CryptGetHashParam");
            break;
        }

        // 返回数据
        *ppHashData = pHashData;
        *pdwHashDataLength = dwHashDataLength;

    }
    while (FALSE);

    // 释放关闭
    if (FALSE == bRet)
    {
        if (pHashData)
        {
            delete[]pHashData;
            pHashData = NULL;
        }
    }
    if (hCryptHash)
    {
        ::CryptDestroyHash(hCryptHash);
    }
    if (hCryptProv)
    {
        ::CryptReleaseContext(hCryptProv, 0);
    }

    return bRet;
}


int main(int argc, char* argv[])
{
    BYTE *pData = NULL;
    DWORD dwDataLength = 0;
    DWORD i = 0;
    BYTE *pHashData = NULL;
    DWORD dwHashDataLength = 0;

    // 读取文件数据
    GetFileData("D:\\360极速浏览器X下载\\EasyX_20211109.exe", &pData, &dwDataLength);

    // MD5
    CalculateHash(pData, dwDataLength, CALG_MD5, &pHashData, &dwHashDataLength);
    printf("MD5[%ld]\n", dwHashDataLength);
    for (i = 0; i < dwHashDataLength; i++)
    {
        printf("%X", pHashData[i]);
    }
    printf("\n\n");
    if (pHashData)
    {
        delete[]pHashData;
        pHashData = NULL;
    }

    // SHA1
    CalculateHash(pData, dwDataLength, CALG_SHA1, &pHashData, &dwHashDataLength);
    printf("SHA1[%ld]\n", dwHashDataLength);
    for (i = 0; i < dwHashDataLength; i++)
    {
        printf("%X", pHashData[i]);
    }
    printf("\n\n");
    if (pHashData)
    {
        delete[]pHashData;
        pHashData = NULL;
    }

    // SHA256
    CalculateHash(pData, dwDataLength, CALG_SHA_256, &pHashData, &dwHashDataLength);
    printf("SHA256[%ld]\n", dwHashDataLength);
    for (i = 0; i < dwHashDataLength; i++)
    {
        printf("%X", pHashData[i]);
    }
    printf("\n\n");
    if (pHashData)
    {
        delete[]pHashData;
        pHashData = NULL;
    }

    system("pause");
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值