Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
чёрный ветер
#1

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

20.12.2011, 00:11. Просмотров 646. Ответов 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);
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2011, 00:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос С++ Разбор кода хэширования Md5 (C++):

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

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

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

Разбор кода - C++
Нужно разобрать код. не могу понять что тут выполняется, кроме открытия файлов #include &lt;iostream&gt; #include &lt;fstream&gt; ...

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

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2011, 00:11
Привет! Вот еще темы с ответами:

Подробный разбор кода - C++
#include &lt;stdlib.h&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; typedef int (*inc_method)(char *, char *, char *, char *); int...

Разбор кода программы - C++
сделали контрольную и защитить не не могу. помогите разобрать что значит код, пожалуйста. реализация LZ метода сжатия кто может...

Доскональный разбор кода C++ - C++
Ребят, объясните пожалуйста следующие строчки кода. Что происходит в результате их выполнения? int a = {10, 20, 30, 40}; vector&lt;int&gt;...

Разбор кода CSharp - C++
К сожалению с сями не знаком!(( Что знаю по коду. То он из *.dat файла выдергивает нужные данные. Вот прошу помочь с разбором кода....


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru