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

📄 sha256.cpp

📁 HMAC即带密钥的HASH函数
💻 CPP
字号:
// Sha256.cpp: implementation of the CSha256 class.
// Programmed by Gamsn 2005.10.22
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "HMac.h"
#include "Sha256.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSha256::CSha256()
{

}

CSha256::~CSha256()
{

}

void CSha256::Init(DWORD dwFullLen)
{
	bOneMore=0;
	dwA=0x6A09E667;
	dwB=0xBB67AE85;
	dwC=0x3C6EF372;
	dwD=0xA54FF53A;
	dwE=0x510E527F;
	dwF=0x9B05688C;
	dwG=0x1F83D9AB;
	dwH=0x5BE0CD19;
	dwLen=dwFullLen;
	OA=0;OB=0;OC=0;OD=0;OE=0;
}

DWORD CSha256::f(BYTE t,DWORD B,DWORD C,DWORD D)
{
	if(0<=t && t<=19)
	{
		return (B&C)|(~B&D);
	}
	else if(20<=t && t<=39 || 60<=t && t<=79)
	{
		return B^C^D;
	}
	else if(40<=t && t<=59)
	{
		return (B&C)|(B&D)|(C&D);
	}
	else {AfxMessageBox("WRONG");return 0;}
}

DWORD CSha256::mod32(DWORD A,DWORD B)
{
	return (A+B)%4294967296;
}

DWORD CSha256::K(BYTE t)
{
	if(0<=t && t<=19)
	{
		return 0x5A827999;
	}
	else if(20<=t && t<=39)
	{
		return 0x6ED9EBA1;
	}
	else if(40<=t && t<=59)
	{
		return 0x8F1BBCDC;
	}
	else if(60<=t && t<=79)
	{
		return 0xCA62C1D6;
	}
	else {AfxMessageBox("WRONG");return 0;}
}

DWORD CSha256::Maj(DWORD x,DWORD y,DWORD z)
{
	DWORD dwT1=x^y,dwT2=x^z;
	return mod32(mod32(dwT1,dwT2),dwT2);
}

DWORD CSha256::Ch(DWORD x,DWORD y,DWORD z)
{
	DWORD dwT1=x^y,dwT2=(~x)^z;
	return mod32(dwT1,dwT2);
}

DWORD CSha256::Sum0to256(DWORD x)
{
	DWORD dwT1=_lrotr(x,2),dwT2=_lrotr(x,13),dwT3=_lrotr(x,22);
	return mod32(mod32(dwT1,dwT2),dwT3);
}

DWORD CSha256::Sum1to256(DWORD x)
{
	DWORD dwT1=_lrotr(x,6),dwT2=_lrotr(x,11),dwT3=_lrotr(x,25);
	return mod32(mod32(dwT1,dwT2),dwT3);
}

void CSha256::Steps()
{
	DWORD A,B,C,D,E,F,G,H,TMP;
	for(BYTE t=0;t<80;t++)
	{
		A=dwA,B=dwB,C=dwC,D=dwD,E=dwE,F=dwF,G=dwG,H=dwH;
		TMP=mod32(H,Sum1to256(E));
		TMP=mod32(TMP,Ch(E,F,G));
		TMP=mod32(TMP,K(t));
		TMP=mod32(TMP,dwW[t]);
		dwA=mod32(mod32(TMP,Sum0to256(E)),Maj(A,B,C));
		dwB=A;
		dwC=B;
		dwD=C;
		dwE=mod32(D,TMP);
		dwF=E;
		dwG=F;
		dwH=G;
	}
	if(bOneMore)
	{
		BYTE *buffer=new BYTE[64];
		for(int i=0;i<56;i++) buffer[i]=0;
		buffer[56]=(dwLen>>24);
		dwLen=dwLen & 0x0fff;
		buffer[57]=(dwLen>>16);
		dwLen=dwLen & 0x00ff;
		buffer[58]=(dwLen>>8);
		dwLen=dwLen & 0x000f;
		buffer[59]=dwLen;
		for(i=60;i<64;i++) buffer[i]=0;
		GenW(buffer,64);
		for(BYTE t=0;t<80;t++)
		{
			A=dwA,B=dwB,C=dwC,D=dwD,E=dwE,F=dwF,G=dwG,H=dwH;
			TMP=mod32(H,Sum1to256(E));
			TMP=mod32(TMP,Ch(E,F,G));
			TMP=mod32(TMP,K(t));
			TMP=mod32(TMP,dwW[t]);
			dwA=mod32(mod32(TMP,Sum0to256(E)),Maj(A,B,C));
			dwB=A;
			dwC=B;
			dwD=C;
			dwE=mod32(D,TMP);
			dwF=E;
			dwG=F;
			dwH=G;
		}
	}
	OA=dwA;OB=dwB;OC=dwC;OD=dwD;OE=dwE;OF=dwF;OG=dwG;OH=dwH;
}

void CSha256::GenW(BYTE buffer[],int nlen)
{
	int i,j=0;
	BYTE *buffer2=new BYTE[64];
	if(nlen<56)
	{
		for(i=0;i<nlen;i++)	buffer2[i]=buffer[i];
		buffer2[i]=0x80;
		for(i=nlen;i<56;i++) buffer2[i]=0;
		buffer2[56]=dwLen>>24;
		dwLen=dwLen & 0x0fff;
		buffer2[57]=dwLen>>16;
		dwLen=dwLen & 0x00ff;
		buffer2[58]=dwLen>>8;
		dwLen=dwLen & 0x000f;
		buffer2[59]=dwLen;
		for(i=60;i<64;i++)	buffer2[i]=0;
	}
	else if(nlen>=56 && nlen<64)
	{
		bOneMore=1;
		for(i=0;i<nlen;i++)
			buffer2[i]=buffer[i];
		buffer2[i]=0x80;
		for(i=nlen;i<64;i++)
			buffer2[i]=0;
	}
	for(i=0;i<16;i++)
	{
		dwW[i]=buffer[j++];
		dwW[i]=(dwW[i]<<8)+buffer[j++];
		dwW[i]=(dwW[i]<<8)+buffer[j++];
		dwW[i]=(dwW[i]<<8)+buffer[j++];
	}
	for(int t=16;t<80;t++)
	{
		dwW[t]=_lrotl((dwW[t-16]^dwW[t-14]^dwW[t-8]^dwW[t-3]),1);
	}
	delete []buffer2;
}

⌨️ 快捷键说明

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