Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
чёрный ветер
1

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

20.12.2011, 00:11. Показов 966. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
ктонибудь может объяснить смысловую нагрузку данной программы, что происходит!
Я понимаю так, по функциям определение криптопровайдера хеширование, работа с буфером в который заносятся какие то данные, выведение хэша.
поконкретнее ктонибудь может описать ? Хелпоните плз
Код
#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);
}
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2011, 00:11
Ответы с готовыми решениями:

Алгоритм хэширования MD5
Мне дали задачу. Программа должна делать такое: Юзер вводит цифры или буквы Программа делает из...

Нужна реализация кода md5
Нужна реализация кода md5 на c \ c++, нигде не могу найти рабочую, всё что нашол в гугле не...

Разбор кода
Помогите, пожалуйста, разобрать данный код. Многое из этого мне еще не знакомо. Поэтому не могу...

Разбор кода
Есть такой код. #include&lt;vcl.h&gt; #pragma hdrstop #pragma argsused #include &lt;dos.h&gt; #include...

0
20.12.2011, 00:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2011, 00:11
Помогаю со студенческими работами здесь

разбор кода
здрасте ,помогите разобрать код,пожалуйста int a = 5; int b = 0; int &amp;r = a; ...

Разбор кода
Здравствуйте! Подскажите, пожалуйста, что обозначает вот это Utf8_16::utf8 Utf8_16::k_Boms зачем...

Разбор кода
Нужно разобрать код. не могу понять что тут выполняется, кроме открытия файлов #include...

Разбор кода программы
Здравствуйте! Помогите пожалуйста написать программу (на Bison+Flex), которая будет сканировать...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru