Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2011, 00:07   #1
Чёрный ветер
 
Регистрация: 22.11.2009
Сообщений: 9
Восклицание С++ Разбор кода хэширования Md5

ктонибудь может объяснить смысловую нагрузку данной программы, что происходит!
Я понимаю так, по функциям определение криптопровайдера хеширование, работа с буфером в который заносятся какие то данные, выведение хэша.
поконкретнее ктонибудь может описать ? Хелпоните плз
Код:
#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:38   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Чёрный ветер

ктонибудь может объяснить смысловую нагрузку данной программы, что происходит!

Используется виндовое CryptoAPI. описание каждой функции есть в msdn
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хэши MD5 и хэш секции кода С++ Чёрный ветер Помощь студентам 1 20.11.2011 01:12
Разбор куска кода. Alexcomeback Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 05.04.2011 18:14
Разбор кода. С++ TIT0 Помощь студентам 0 27.12.2010 11:17
-=Разбор кода (С++ и Ассемблерная вставка)=- MeTeOpA Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 26.12.2010 16:46
Разбор кода программы на Bison+Flex Corol Помощь студентам 2 03.07.2009 09:57