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

📄 sub_sha1.h

📁 MD5/SHA-1摘要生成算法
💻 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 + -