📄 sub_sha1.h
字号:
#ifndef _SHA_1_
#define _SHA_1_
// Constants for MD5Transform routine.
typedef unsigned char *POINTER;
/* UINT2 defines a two byte word */
typedef unsigned short int UINT2;
/* UINT4 defines a four byte word */
typedef unsigned long int UINT4;
unsigned long func_S(char n,unsigned long num)
{
return (num<<n) | (num>>(32-n));
}
unsigned long func_F(unsigned int t,unsigned long B,unsigned long C,unsigned long D)
{
if(t<20)
{
return ((B & C) | ((~B) & D));
}else if(t<40)
{
return (B ^ C ^ D);
}else if(t<60)
{
return ((B & C) | (B & D) | (C & D));
}else if(t<80)
{
return (B ^ C ^ D);
}else
return 0;
}
void SHA_1(unsigned char digest[16], unsigned char *mess,unsigned int messlen)
{
unsigned long messagelength; // length of message
unsigned char i,ctemp,index;
unsigned char hasAdd1=0;
unsigned char hasAddLen=0;
unsigned long W[16];
unsigned long H[5];
unsigned long A,B,C,D,E,s;
unsigned long MASK=0x0000000F;
unsigned long K[4]={0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6};
unsigned long TEMP;
unsigned int t;
messagelength=messlen;
H[0]=0x67452301;
H[1]=0xEFCDAB89;
H[2]=0x98BADCFE;
H[3]=0x10325476;
H[4]=0xC3D2E1F0;
index=0;
while(!hasAddLen)
{
for(t=0;t<16;t++)
{
W[t]=0;
for(i=0;i<4;i++)
{
if(!hasAdd1)
{
if(index>=messlen)
{
ctemp=0x80;
hasAdd1=1;
}else
ctemp=mess[index++];
}else
ctemp=0x00;
W[t]=W[t]*256+ctemp;
}
}
if(hasAdd1)
if(W[14]==0x00 && W[15]==0x00)
{
W[15]=messagelength;
for(t=0;t<3;t++)
{
if(W[15]&0x80000000)
W[14]=W[14]*2+1;
W[15]=W[15]*2;
}
hasAddLen=1;
}
//==============================//
A=H[0];B=H[1];C=H[2];D=H[3];E=H[4];
for(t=0;t<80;t++)
{
s=t&MASK;
if(t>=16)
{
W[s]=W[(s+13)&MASK] ^ W[(s+8)&MASK] ^ W[(s+2)&MASK] ^ W[s];
W[s]=func_S(1,W[s]);
}
TEMP=func_S(5,A)+func_F(t,B,C,D)+E+W[s]+K[t/20];
E=D;D=C;C=func_S(30,B);B=A;A=TEMP;
}
H[0]+=A;
H[1]+=B;
H[2]+=C;
H[3]+=D;
H[4]+=E;
}
digest[0]=(unsigned char)((H[0] >> 24) & 0xFF);
digest[1]=(unsigned char)((H[0] >> 16) & 0xFF);
digest[2]=(unsigned char)((H[0] >> 8) & 0xFF);
digest[3]=(unsigned char)((H[0]) & 0xFF);
digest[4+0]=(unsigned char)((H[1] >> 24) & 0xFF);
digest[4+1]=(unsigned char)((H[1] >> 16) & 0xFF);
digest[4+2]=(unsigned char)((H[1] >> 8) & 0xFF);
digest[4+3]=(unsigned char)((H[1]) & 0xFF);
digest[8+0]=(unsigned char)((H[2] >> 24) & 0xFF);
digest[8+1]=(unsigned char)((H[2] >> 16) & 0xFF);
digest[8+2]=(unsigned char)((H[2] >> 8) & 0xFF);
digest[8+3]=(unsigned char)((H[2]) & 0xFF);
digest[12+0]=(unsigned char)((H[3] >> 24) & 0xFF);
digest[12+1]=(unsigned char)((H[3] >> 16) & 0xFF);
digest[12+2]=(unsigned char)((H[3] >> 8) & 0xFF);
digest[12+3]=(unsigned char)((H[3]) & 0xFF);
digest[16+0]=(unsigned char)((H[4] >> 24) & 0xFF);
digest[16+1]=(unsigned char)((H[4] >> 16) & 0xFF);
digest[16+2]=(unsigned char)((H[4] >> 8) & 0xFF);
digest[16+3]=(unsigned char)((H[4]) & 0xFF);
return;
}
#endif //_SHA_1_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -