入力した文字列から 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