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