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