⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hmac.cpp

📁 HMAC即带密钥的HASH函数
💻 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<len;i++) sKeyplus[i]=strKey[i];
	for(i=len;i<64;i++) sKeyplus[i]=0;
/*	for(i=63;i>=64-len;i--)	sKeyplus[i]=strKey[j--];
	if(len<64)
	{
		for(i=0;i<64-len;i++) sKeyplus[i]=0;
	}*/
	for(i=0;i<Mb;i++) 
		S[i]=sKeyplus[i]^ipad[i];
	m_sha256.Init(Mb);
	m_sha256.GenW(S,Mb);
	m_sha256.Steps();
	m_dwA1=m_sha256.OA;
	m_dwB1=m_sha256.OB;
	m_dwC1=m_sha256.OC;
	m_dwD1=m_sha256.OD;
	m_dwE1=m_sha256.OE;
	m_dwF1=m_sha256.OF;
	m_dwG1=m_sha256.OG;
	m_dwH1=m_sha256.OH;

	for(i=0;i<Mb;i++)
		S[i]=sKeyplus[i]^opad[i];
	m_sha256.Init(Mb);
	m_sha256.GenW(S,Mb);
	m_sha256.Steps();
	m_dwA2=m_sha256.OA;
	m_dwB2=m_sha256.OB;
	m_dwC2=m_sha256.OC;
	m_dwD2=m_sha256.OD;
	m_dwE2=m_sha256.OE;
	m_dwF2=m_sha256.OF;
	m_dwG2=m_sha256.OG;
	m_dwH2=m_sha256.OH;

	delete []S;
	delete []sKeyplus;
	delete []opad;
	delete []ipad;
}

void CHMac::GenMac(CString srcFileName,CString *strHMac)
{
	CFile f;
	CFileException e;
	CWnd *pMainWnd=AfxGetMainWnd();
	f.Open(srcFileName,CFile::modeRead|CFile::typeBinary,&e);
	if(e.m_cause!=CFileException::none) 
	{
		MessageBox(pMainWnd->m_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<dwSize;i+=MAXNUM)
	{
		nlen=f.Read(pBuffer, MAXNUM);
		if (nlen > 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;i<nTurn;i++)
	{
		for(k=0;k<64;k++) lpIntext[k]=sText[j++];
		m_sha256.GenW(lpIntext,64);
		m_sha256.Steps();
	}
	if(nLeft>0) //不够64字节
	{
		for(i=0;i<nLeft;i++) lpIntext[i]=sText[j++];
		m_sha256.GenW(lpIntext,nLeft);
		m_sha256.Steps(); 
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -