1、VC计算文件MD5摘要
//输入:文件路径
//输出:128位MD5摘要
#include <wincrypt.h>
CString szResult;
CString CMD5AndSHA1Dlg::CalcMD5(CString strFilePath)
{
//读取文件
CFile inFile;
CFileException ex;
DWORD dwLength=0;
BYTE* pbContent=NULL;
BOOL bRet;
bRet=inFile.Open(strFilePath,CFile::modeRead | CFile::typeBinary | CFile::shareDenyWrite,&ex);
if(bRet==FALSE)
{
return TEXT("Error opening file");;
}
dwLength = (DWORD)inFile.GetLength();
pbContent = new BYTE[dwLength];
if(pbContent==NULL)
{
return TEXT("Error not enough memory");;
}
inFile.Read(pbContent,dwLength);
inFile.Close();
//计算MD5编码
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
BYTE byteMD5[16];
DWORD dwHashLen=16;
CString szResult;
if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if(CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
{
if(CryptHashData(hHash, pbContent, dwLength, 0))
{
if(CryptGetHashParam(hHash, HP_HASHVAL, byteMD5, &dwHashLen, 0))
{
szResult.Format(TEXT("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"),
byteMD5[0],byteMD5[1],byteMD5[2],byteMD5[3],byteMD5[4],byteMD5[5],byteMD5[6],byteMD5[7]
,byteMD5[8],byteMD5[9],byteMD5[10],byteMD5[11],byteMD5[12],byteMD5[13],byteMD5[14],byteMD5[15]);
}
else
{
szResult=TEXT("Error getting hash param");
}
}
else
{
szResult=TEXT("Error hashing data");
}
}
else
{
szResult=TEXT("Error creating hash");
}
}
else
{
szResult=TEXT("Error acquiring context");
}
CryptDestroyHash(hHash);
CryptReleaseContext(hCryptProv, 0);
delete[] pbContent;
pbContent=NULL;
return szResult;
}
2、VC计算文件SHA1摘要
//输入:文件路径(文件必须小于2^64bit)
//输出:160位SHA1摘要
#include <wincrypt.h>
CString szResult;
CString CMD5AndSHA1Dlg::CalcSHA1(CString strFilePath)
{
//读取文件
CFile inFile;
CFileException ex;
DWORD dwLength=0;
BYTE* pbContent=NULL;
BOOL bRet;
bRet=inFile.Open(strFilePath,CFile::modeRead | CFile::typeBinary | CFile::shareDenyWrite,&ex);
if(bRet==FALSE)
{
return TEXT("Error opening file");;
}
dwLength = (DWORD)inFile.GetLength();
pbContent = new BYTE[dwLength];
if(pbContent==NULL)
{
return TEXT("Error not enough memory");;
}
inFile.Read(pbContent,dwLength);
inFile.Close();
//计算MD5编码
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
BYTE byteSHA1[20];
DWORD dwHashLen=20;
CString szResult;
if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if(CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash))
{
if(CryptHashData(hHash, pbContent, dwLength, 0))
{
if(CryptGetHashParam(hHash, HP_HASHVAL, byteSHA1, &dwHashLen, 0))
{
szResult.Format(TEXT("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"),
byteSHA1[0],byteSHA1[1],byteSHA1[2],byteSHA1[3],byteSHA1[4],byteSHA1[5],byteSHA1[6],byteSHA1[7],
byteSHA1[8],byteSHA1[9],byteSHA1[10],byteSHA1[11],byteSHA1[12],byteSHA1[13],byteSHA1[14],byteSHA1[15],
byteSHA1[16],byteSHA1[17],byteSHA1[18],byteSHA1[19]);
}
else
{
szResult=TEXT("Error getting hash param");
}
}
else
{
szResult=TEXT("Error hashing data");
}
}
else
{
szResult=TEXT("Error creating hash");
}
}
else
{
szResult=TEXT("Error acquiring context");
}
CryptDestroyHash(hHash);
CryptReleaseContext(hCryptProv, 0);
delete[] pbContent;
pbContent=NULL;
return szResult;
}