📄 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<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 + -