カスタム検索

入力した文字列から MD5 文字列を出力(Crypt API)

#include <windows.h>
#include <wincrypt.h>
#include <iostream>

bool get_md5(char* param, char* buffer)
{

	HCRYPTPROV hCryptProv = NULL;
	HCRYPTHASH hHash = NULL;

	if(!::CryptAcquireContext(
		&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)){

		if(!::CryptAcquireContext(
			&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)){

			return false;
		}
	}

	if (!::CryptCreateHash(
		hCryptProv, CALG_MD5, 0, 0, &hHash)){

		return false;
	}

	if (hHash){

		if (!::CryptHashData(
			hHash, (BYTE*)param, (DWORD)strlen(param), 0)){

			return false;
		}

		BYTE bData[1024];
		memset(bData, 0, sizeof(bData));
		CHAR rgbDigits[] = "0123456789abcdef";
		DWORD dwDataLen = 16;
		if (!::CryptGetHashParam(
			hHash, HP_HASHVAL, bData, &dwDataLen, 0)){

			return false;
		}

		int md5_index = 0;
		for (DWORD i = 0; i < dwDataLen; ++i){

			buffer[md5_index++] = rgbDigits[bData[i] >> 4];
			buffer[md5_index++] = rgbDigits[bData[i] & 0xf];
		}

		::CryptDestroyHash(hHash);

		if (hCryptProv){

			::CryptReleaseContext(hCryptProv,0);
		}

		return true;
	}

	if (hCryptProv){

		::CryptReleaseContext(hCryptProv,0);
	}

	return false;
}

int main(int argc, char* argv[])
{

	if (2 != argc){

		std::cout << "usage: " << argv[0] << " file_name" << std::endl;
		return 1;
	}

	char buffer[64];
	memset(buffer, 0, sizeof(buffer));
	if (!get_md5(argv[1], buffer)){

		return 1;
	}

	std::cout << "MD5: " << buffer << std::endl;

	return 0;
}

HOME

Valid XHTML 1.0!