чёрный ветер
|
|
1 | |
С++ Разбор кода хэширования Md520.12.2011, 00:11. Показов 966. Ответов 0
Метки нет (Все метки)
ктонибудь может объяснить смысловую нагрузку данной программы, что происходит!
Я понимаю так, по функциям определение криптопровайдера хеширование, работа с буфером в который заносятся какие то данные, выведение хэша. поконкретнее ктонибудь может описать ? Хелпоните плз Код
#include "stdafx.h" #pragma comment(lib, "crypt32.lib") #define HASH_BUFF_LEN 10*1024*1024 #include <tchar.h> #include <stdio.h> #include <Windows.h> #include <WinCrypt.h> HCRYPTPROV TryToOpenCryptoProvider() { HCRYPTPROV hProv = NULL; TCHAR* pszContainerName = TEXT("FHashContainer"); if(!CryptAcquireContext(&hProv, pszContainerName, NULL, PROV_RSA_FULL, 0)) { if(NTE_BAD_KEYSET == GetLastError()) { if(!CryptAcquireContext(&hProv, pszContainerName, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { hProv = NULL; } }else { hProv = NULL; } } if(!hProv) _tprintf(TEXT("Error: Failed to acquire context\n")); return(hProv); } HCRYPTHASH TryToCreateHash(HCRYPTPROV hProv) { if(!hProv) return(NULL); HCRYPTHASH hHash = NULL; if(!CryptCreateHash(hProv, CALG_MD5, NULL, 0, &hHash)) { _tprintf(TEXT("Error: Failed to create hash generator\n")); hHash = NULL; } return(hHash); } BOOL TryToHashFile(HANDLE hFile, HCRYPTHASH hHash) { BYTE* pbBuffer = (BYTE*)HeapAlloc(GetProcessHeap(), 0 , HASH_BUFF_LEN); if(!pbBuffer) { _tprintf(TEXT("Error: Unable to allocate %d bytes in the process heap\n"), HASH_BUFF_LEN); return(FALSE); } ZeroMemory(pbBuffer, HASH_BUFF_LEN); while(TRUE) { DWORD dwRB = 0; BOOL fResult = ReadFile(hFile, (PVOID)pbBuffer, HASH_BUFF_LEN, &dwRB, NULL); if((0 == dwRB)||(!fResult)) break; if(fResult && (dwRB > 0)) CryptHashData(hHash, pbBuffer, dwRB, 0); } HeapFree(GetProcessHeap(), 0, pbBuffer); return(TRUE); } void TryToPrintHash(HCRYPTHASH hHash) { DWORD dwHashSize = 0, dwRetLen = sizeof(dwHashSize); if(!CryptGetHashParam(hHash, HP_HASHSIZE, (PBYTE)&dwHashSize, &dwRetLen, 0)) { _tprintf(TEXT("Error: Failed to obtain hash size\n")); return; } PBYTE pbResult = (PBYTE)HeapAlloc(GetProcessHeap(), 0, dwHashSize); ZeroMemory(pbResult, dwHashSize); dwRetLen = dwHashSize; if(CryptGetHashParam(hHash, HP_HASHVAL, pbResult, &dwRetLen, 0)) { _tprintf(TEXT("HASH: {")); for(unsigned int i=0; i<dwRetLen; i++) _tprintf(TEXT(" %0*X "),2, pbResult[i]); _tprintf(TEXT("}\n")); } HeapFree(GetProcessHeap(), 0, pbResult); } int __cdecl _tmain(int argc, TCHAR** argv) { HANDLE hFile = INVALID_HANDLE_VALUE; HCRYPTPROV hProv = NULL; HCRYPTHASH hHash = NULL; if(argc < 2) { _tprintf(TEXT("Error: File name is not specified\n")); return(0); } hFile = CreateFile(argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if(INVALID_HANDLE_VALUE == hFile) { _tprintf(TEXT("Error: Unable to open file %s\n"), argv[1]); return(0); } __try { hProv = TryToOpenCryptoProvider(); if(!hProv) __leave; hHash = TryToCreateHash(hProv); if(!hHash) __leave; if(!TryToHashFile(hFile, hHash)) __leave; TryToPrintHash(hHash); }__finally { if(hHash) CryptDestroyHash(hHash); if(hProv) CryptReleaseContext(hProv, 0); if(hFile!=INVALID_HANDLE_VALUE) CloseHandle(hFile); } return(0); } |
20.12.2011, 00:11 | |
Ответы с готовыми решениями:
0
Алгоритм хэширования MD5 Нужна реализация кода md5 Разбор кода Разбор кода |
20.12.2011, 00:11 | |
20.12.2011, 00:11 | |
Помогаю со студенческими работами здесь
1
разбор кода Разбор кода Разбор кода Разбор кода программы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |