www.pudn.com > 基于SHA-256的HMAC文件校验器.rar > HMac.cpp


// HMac.cpp: implementation of the CHMac class. 
// Programmed by Gamsn 2005.10.22 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "VeriFile.h" 
#include "HMac.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
#define Mb 64	//每一组所含的字节数 
#define Mn 32	//嵌入的HASH函数所产生的HASH码长(字节数) 
#define MAXNUM 1024 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CHMac::CHMac() 
{ 
 
} 
 
CHMac::~CHMac() 
{ 
 
} 
 
void CHMac::PreCalcu(CString strKey) 
{ 
	BYTE *ipad=new BYTE[Mb+1];ipad[Mb]=0; 
	BYTE *opad=new BYTE[Mb+1];opad[Mb]=0; 
	BYTE *sKeyplus=new BYTE[Mb+1];sKeyplus[Mb]=0; 
	BYTE *S=new BYTE[Mb+1];S[Mb]=0; 
	int i,j,len=strKey.GetLength(); 
	for(i=0;i<32;i++)  
	{ 
		ipad[i]=0x36; 
		opad[i]=0x5C; 
	} 
	j=len-1; 
	for(i=0;i=64-len;i--)	sKeyplus[i]=strKey[j--]; 
	if(len<64) 
	{ 
		for(i=0;i<64-len;i++) sKeyplus[i]=0; 
	}*/ 
	for(i=0;im_hWnd,"打开文件失败!","HMac",MB_OK|MB_ICONEXCLAMATION); 
		return; 
	} 
	DWORD dwSize = f.GetLength(); 
	m_sha256.Init(dwSize); 
	m_sha256.dwA=m_dwA1; 
	m_sha256.dwB=m_dwB1; 
	m_sha256.dwC=m_dwC1; 
	m_sha256.dwD=m_dwD1; 
	m_sha256.dwE=m_dwE1; 
	m_sha256.dwF=m_dwF1; 
	m_sha256.dwG=m_dwG1; 
	m_sha256.dwH=m_dwH1; 
	int nlen=0; 
	BYTE *pBuffer=new BYTE[MAXNUM+1]; 
	for(DWORD i=0;i 0 )  
		{ 
			pBuffer[nlen]=0; 
			HashPro(pBuffer,nlen); 
		} 
		else  
		{ 
			return; 
		} 
	} 
	delete []pBuffer; 
	pBuffer=new BYTE[64]; 
	int j=0; 
	for(i=0;i<4;i++) pBuffer[j++]=(m_sha256.OA & (0x000000ff<<(8*i)) )>>(i*8); 
	for(i=0;i<4;i++) pBuffer[j++]=(m_sha256.OB & (0x000000ff<<(8*i)) )>>(i*8); 
	for(i=0;i<4;i++) pBuffer[j++]=(m_sha256.OC & (0x000000ff<<(8*i)) )>>(i*8); 
	for(i=0;i<4;i++) pBuffer[j++]=(m_sha256.OD & (0x000000ff<<(8*i)) )>>(i*8); 
	for(i=0;i<4;i++) pBuffer[j++]=(m_sha256.OE & (0x000000ff<<(8*i)) )>>(i*8); 
	for(i=0;i<4;i++) pBuffer[j++]=(m_sha256.OF & (0x000000ff<<(8*i)) )>>(i*8); 
	for(i=0;i<4;i++) pBuffer[j++]=(m_sha256.OG & (0x000000ff<<(8*i)) )>>(i*8); 
	for(i=0;i<4;i++) pBuffer[j++]=(m_sha256.OH & (0x000000ff<<(8*i)) )>>(i*8); 
	for(i=32;i<64;i++) pBuffer[i]=0; 
	m_sha256.Init(64); 
	m_sha256.dwA=m_dwA2; 
	m_sha256.dwB=m_dwB2; 
	m_sha256.dwC=m_dwC2; 
	m_sha256.dwD=m_dwD2; 
	m_sha256.dwE=m_dwE2; 
	m_sha256.dwF=m_dwF2; 
	m_sha256.dwG=m_dwG2; 
	m_sha256.dwH=m_dwH2; 
	HashPro(pBuffer,64); 
	DWORD dwRes[8]; 
	dwRes[0]=m_sha256.OA; 
	dwRes[1]=m_sha256.OB; 
	dwRes[2]=m_sha256.OC; 
	dwRes[3]=m_sha256.OD; 
	dwRes[4]=m_sha256.OE; 
	dwRes[5]=m_sha256.OF; 
	dwRes[6]=m_sha256.OG; 
	dwRes[7]=m_sha256.OH; 
	CString str; 
	for(i=0;i<8;i++) 
	{ 
		str.Format("%x",dwRes[i]); 
		nlen=str.GetLength(); 
		if(nlen<8) 
		{ 
			for(j=0;j<8-nlen;j++) 
				str.Insert(0,"0"); 
		} 
		strHMac->Insert(0,str); 
	} 
	delete []pBuffer; 
} 
 
void CHMac::HashPro(BYTE sText[], int nSLen) 
{ 
	int nTurn=0,nLeft=0,i,k,j=0,n=0; 
	BYTE lpIntext[65];lpIntext[64]=0; 
	nTurn=nSLen/64; 
	nLeft=nSLen-nTurn*64; 
	for(i=0;i0) //不够64字节 
	{ 
		for(i=0;i