c++计算hash值
生活随笔
收集整理的這篇文章主要介紹了
c++计算hash值
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
c++計(jì)算hash值
#include "stdafx.h" #include <Windows.h>void ShowError(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(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;}// 創(chuàng)建一個(gè)HASH對(duì)象, 指定HASH算法bRet = ::CryptCreateHash(hCryptProv, algHashType, NULL, NULL, &hCryptHash);if (FALSE == bRet){ShowError("CryptCreateHash");break;}// 計(jì)算HASH數(shù)據(jù)bRet = ::CryptHashData(hCryptHash, pData, dwDataLength, 0);if (FALSE == bRet){ShowError("CryptHashData");break;}// 獲取HASH結(jié)果的大小dwTemp = sizeof(dwHashDataLength);bRet = ::CryptGetHashParam(hCryptHash, HP_HASHSIZE, (BYTE *)(&dwHashDataLength), &dwTemp, 0);if (FALSE == bRet){ShowError("CryptGetHashParam");break;}// 申請(qǐng)內(nèi)存pHashData = new BYTE[dwHashDataLength];if (NULL == pHashData){bRet = FALSE;ShowError("new");break;}::RtlZeroMemory(pHashData, dwHashDataLength);// 獲取HASH結(jié)果數(shù)據(jù)bRet = ::CryptGetHashParam(hCryptHash, HP_HASHVAL, pHashData, &dwHashDataLength, 0);if (FALSE == bRet){ShowError("CryptGetHashParam");break;}// 返回?cái)?shù)據(jù)*ppHashData = pHashData;*pdwHashDataLength = dwHashDataLength;} while (FALSE);// 釋放關(guān)閉if (FALSE == bRet){if (pHashData){delete[]pHashData;pHashData = NULL;}}if (hCryptHash){::CryptDestroyHash(hCryptHash);}if (hCryptProv){::CryptReleaseContext(hCryptProv, 0);}return bRet; }int _tmain(int argc, _TCHAR* argv[]) {BYTE *pData = NULL;DWORD dwDataLength = 0;DWORD i = 0;BYTE *pHashData = NULL;DWORD dwHashDataLength = 0;// 讀取文件數(shù)據(jù)GetFileData("C:\\Users\\DemonGan\\Desktop\\520.exe", &pData, &dwDataLength);// MD5CalculateHash(pData, dwDataLength, CALG_MD5, &pHashData, &dwHashDataLength);printf("MD5[%d]\n", dwHashDataLength);for (i = 0; i < dwHashDataLength; i++){printf("%x", pHashData[i]);}printf("\n\n", dwHashDataLength);if (pHashData){delete[]pHashData;pHashData = NULL;}// SHA1CalculateHash(pData, dwDataLength, CALG_SHA1, &pHashData, &dwHashDataLength);printf("SHA1[%d]\n", dwHashDataLength);for (i = 0; i < dwHashDataLength; i++){printf("%x", pHashData[i]);}printf("\n\n", dwHashDataLength);if (pHashData){delete[]pHashData;pHashData = NULL;}// SHA256CalculateHash(pData, dwDataLength, CALG_SHA_256, &pHashData, &dwHashDataLength);printf("SHA256[%d]\n", dwHashDataLength);for (i = 0; i < dwHashDataLength; i++){printf("%x", pHashData[i]);}printf("\n\n", dwHashDataLength);if (pHashData){delete[]pHashData;pHashData = NULL;}system("pause");return 0; }總結(jié)
以上是生活随笔為你收集整理的c++计算hash值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: javescript 字符串生成 has
- 下一篇: CSS-精灵技术