Форум программистов, компьютерный форум CyberForum.ru

С++ Разбор кода хэширования Md5 - C++

Восстановить пароль Регистрация
 
чёрный ветер
Сообщений: n/a
20.12.2011, 00:11     С++ Разбор кода хэширования Md5 #1
ктонибудь может объяснить смысловую нагрузку данной программы, что происходит!
Я понимаю так, по функциям определение криптопровайдера хеширование, работа с буфером в который заносятся какие то данные, выведение хэша.
поконкретнее ктонибудь может описать ? Хелпоните плз
Код
#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);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2011, 00:11     С++ Разбор кода хэширования Md5
Посмотрите здесь:

Разбор кода C++
C++ Разбор кода
Алгоритм хэширования MD5 C++
C++ Разбор кода
C++ Разбор кода программы
Нужна реализация кода md5 C++
Разбор кода C++
C++ Подробный разбор кода

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 05:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru