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

📄 aes.h

📁 AES128bit加密算法。在PDF文档中有详细算法描述。程序打印出的内容为验证结果。对应文档中的33-34页最左侧的结果。不清楚的朋友可以给我发EMAIL.
💻 H
字号:

unsigned char RC[32];
word8 Log3B[256];
word8 Log3BN[256];
word32 T0[256],T1[256],T2[256],T3[256];
word32 TN0[256],TN1[256],TN2[256],TN3[256];

//求对数表log3  3为GF(256)的原根

void Qlog3b()
{
	Log3B[0]=0;
	word8 tmpch=1;
	for(int i=1;i<256;i++)
	{
		tmpch=Multi_poly(tmpch,3);
		Log3B[tmpch]=i;
		Log3BN[i]=tmpch;
	}
	Log3BN[0]=1;
	
}

//对数法求 A*B

inline word8 mul(word8 a,word8 b)
{
	if(a&&b) return Log3BN[(Log3B[a]+Log3B[b])%255];
	else return 0;
}

//求轮常数

inline void QRCB()
{
	int i;
	RC[0]=0;
	RC[1]=1;
	for(i=0;i<30;i++) 
		if(RC[i+1]&0x80) RC[i+2]=(RC[i+1]<<1)^0x1b;
		else RC[i+2]=RC[i+1]<<1;
	
}

//密钥扩展

inline void KeyExpansion(unsigned int *cskey,unsigned int *expkey)
{
	int j;
	QRCB();
	Qlog3b();
	for(j=0;j<Nk;j++)	expkey[j]=cskey[j];
	for(j=Nk;j<Nb*(Nr+1);j++)
		if(j%Nk==0)
		{
			expkey[j]=expkey[j-1];
			unsigned char *pch=(unsigned char *)(expkey+j);
			expkey[j]=(expkey[j]<<8)+pch[3];
			*pch=S_Box[*pch];pch++;
			*pch=S_Box[*pch];pch++;
			*pch=S_Box[*pch];pch++;
			*pch=S_Box[*pch]^RC[j/Nk];
			expkey[j]^=expkey[j-Nk];
		}
		else
			expkey[j]=expkey[j-1]^expkey[j-Nk];

}

//代替变换

 void SubBytes(word32 *state)
{
	register word8 *pch=(word8 *)state;
	
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	*pch=S_Box[*pch];pch++;
	
}



//移位变换

inline void ShiftRows(word32 *state)
{
	 word8 *pch=(word8 *)state;
	 word8 tmp=pch[2];
	pch[2]=pch[6];
	pch[6]=pch[10];
	pch[10]=pch[14];
	pch[14]=tmp;
	tmp=pch[1];
	pch[1]=pch[9];
	pch[9]=tmp;
	tmp=pch[5];
	pch[5]=pch[13];
	pch[13]=tmp;
	tmp=pch[0];
	pch[0]=pch[12];
	pch[12]=pch[8];
	pch[8]=pch[4];
	pch[4]=tmp;
}



//混合列变换

inline void MixColumns(word32 *state)
{
	word32 tmpstate;
	word8 *pch=(word8 *)state,*pchx=(word8 *)(&tmpstate);
	
	pchx[3]=pch[0]^pch[1]^mul(pch[2],0x03)^mul(pch[3],0x02);
	pchx[2]=pch[0]^mul(pch[1],0x03)^mul(pch[2],0x02)^pch[3];
	pchx[1]=mul(pch[0],0x03)^mul(pch[1],0x02)^pch[2]^pch[3];
	pchx[0]=mul(pch[0],0x02)^pch[1]^pch[2]^mul(pch[3],0x03);
	pch+=4;state[0]=tmpstate;
	pchx[3]=pch[0]^pch[1]^mul(pch[2],0x03)^mul(pch[3],0x02);
	pchx[2]=pch[0]^mul(pch[1],0x03)^mul(pch[2],0x02)^pch[3];
	pchx[1]=mul(pch[0],0x03)^mul(pch[1],0x02)^pch[2]^pch[3];
	pchx[0]=mul(pch[0],0x02)^pch[1]^pch[2]^mul(pch[3],0x03);
	pch+=4;state[1]=tmpstate;
	pchx[3]=pch[0]^pch[1]^mul(pch[2],0x03)^mul(pch[3],0x02);
	pchx[2]=pch[0]^mul(pch[1],0x03)^mul(pch[2],0x02)^pch[3];
	pchx[1]=mul(pch[0],0x03)^mul(pch[1],0x02)^pch[2]^pch[3];
	pchx[0]=mul(pch[0],0x02)^pch[1]^pch[2]^mul(pch[3],0x03);
	pch+=4;state[2]=tmpstate;
	pchx[3]=pch[0]^pch[1]^mul(pch[2],0x03)^mul(pch[3],0x02);
	pchx[2]=pch[0]^mul(pch[1],0x03)^mul(pch[2],0x02)^pch[3];
	pchx[1]=mul(pch[0],0x03)^mul(pch[1],0x02)^pch[2]^pch[3];
	pchx[0]=mul(pch[0],0x02)^pch[1]^pch[2]^mul(pch[3],0x03);
	state[3]=tmpstate;
}

//密钥加
inline void AddRoundKey(word32 *state,word32 *expkey)
{
	state[0]^=expkey[0];
	state[1]^=expkey[1];
	state[2]^=expkey[2];
	state[3]^=expkey[3];
}

//轮函数

inline void Round(word32 *state,word32 *expkey)
{
	printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
	SubBytes(state);
	//printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
	ShiftRows(state);
	//printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
	MixColumns(state);
	//printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
	AddRoundKey(state,expkey);
}


//最后一轮函数

 void FindalRound(word32 *state,word32 *expkey)
{
	SubBytes(state);
	//printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
	ShiftRows(state);
	//printf("\n%08x %08x %08x %08x\n",state[0],state[1],state[2],state[3]);
	
	AddRoundKey(state,expkey);
}

// AES加密函数
// 明文文件指针State 密钥CipherKey 明文块数bc

void AES_Enfun(unsigned int *State,unsigned int *CipherKey,int bc)
{
	
	unsigned int ExpandedKey[(Nr+1)*4];
	
	
	char i;
	KeyExpansion( CipherKey, ExpandedKey );
	
	
	for(int j=0;j<1;j++)
	{
			
		AddRoundKey( State,ExpandedKey );
		
		
		
		for(i=4;i<(Nr<<2);i+=4) 
			 Round ( State+j*4, ExpandedKey+i );
			
		FindalRound ( State+j*4, ExpandedKey+(Nr<<2));
		
		
	}
	printf("\n%08x %08x %08x %08x\n",State[0],State[1],State[2],State[3]);
	
}

⌨️ 快捷键说明

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