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

📄 aes.c

📁 C语言环境下的AES加密算法
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************** Function *************************************************
* 
*/
RET_VAL AES_DecKeySchedule(
		BYTE		*UserKey,		//	荤侩磊 厚剐虐 涝仿
		DWORD		UserKeyLen,		//	荤侩磊 厚剐虐狼 官捞飘 荐
		AES_ALG_INFO	*AlgInfo)	//	鞠龋侩/汗龋侩 Round Key 积己/历厘
{
	RIJNDAEL_CIPHER_KEY	*RK_Struct=(RIJNDAEL_CIPHER_KEY *) AlgInfo->RoundKey;
	DWORD	*d_key=RK_Struct->RK;	//	64 DWORDs
	DWORD	k_len, t_key[64];
	u4byte	i, t, u, v, w;

	//	UserKey狼 辨捞啊 何利例茄 版快 error 贸府
	if( (UserKeyLen!=16) && (UserKeyLen!=24) && (UserKeyLen!=32) )
		return CTR_INVALID_USERKEYLEN;

	////
	k_len = (UserKeyLen + 3) / 4;
	RK_Struct->k_len = k_len;

	RIJNDAEL_KeySchedule(UserKey, k_len, t_key);

	d_key[0] = t_key[4 * k_len + 24];
	d_key[1] = t_key[4 * k_len + 25];
	d_key[2] = t_key[4 * k_len + 26];
	d_key[3] = t_key[4 * k_len + 27];

	for( i=4; i<4*(k_len+6); i+=4) {
		imix_col(d_key[i+0], t_key[4*k_len+24-i+0]);
		imix_col(d_key[i+1], t_key[4*k_len+24-i+1]);
		imix_col(d_key[i+2], t_key[4*k_len+24-i+2]);
		imix_col(d_key[i+3], t_key[4*k_len+24-i+3]);
	}
	d_key[i+0] = t_key[4*k_len+24-i+0];
	d_key[i+1] = t_key[4*k_len+24-i+1];
	d_key[i+2] = t_key[4*k_len+24-i+2];
	d_key[i+3] = t_key[4*k_len+24-i+3];

	return CTR_SUCCESS;
}

/*
	DWORD	A, B, C, D, T0, T1, *K=AlgInfo->RoundKey;

	////
	if( UserKeyLen!=SEED_USER_KEY_LEN )
		return CTR_INVALID_USERKEYLEN;

	////
	BIG_B2D( &(UserKey[0]), A);
	BIG_B2D( &(UserKey[4]), B);
	BIG_B2D( &(UserKey[8]), C);
	BIG_B2D( &(UserKey[12]), D);

	T0 = A + C - KC0;
	T1 = B - D + KC0;
	K[0] = SEED_SL[0][(T0    )&0xFF] ^ SEED_SL[1][(T0>> 8)&0xFF]
		 ^ SEED_SL[2][(T0>>16)&0xFF] ^ SEED_SL[3][(T0>>24)&0xFF];
	K[1] = SEED_SL[0][(T1    )&0xFF] ^ SEED_SL[1][(T1>> 8)&0xFF]
		 ^ SEED_SL[2][(T1>>16)&0xFF] ^ SEED_SL[3][(T1>>24)&0xFF];;

	EncRoundKeyUpdate0(K+ 2, A, B, C, D, KC1 );
	EncRoundKeyUpdate1(K+ 4, A, B, C, D, KC2 );
	EncRoundKeyUpdate0(K+ 6, A, B, C, D, KC3 );
	EncRoundKeyUpdate1(K+ 8, A, B, C, D, KC4 );
	EncRoundKeyUpdate0(K+10, A, B, C, D, KC5 );
	EncRoundKeyUpdate1(K+12, A, B, C, D, KC6 );
	EncRoundKeyUpdate0(K+14, A, B, C, D, KC7 );
	EncRoundKeyUpdate1(K+16, A, B, C, D, KC8 );
	EncRoundKeyUpdate0(K+18, A, B, C, D, KC9 );
	EncRoundKeyUpdate1(K+20, A, B, C, D, KC10);
	EncRoundKeyUpdate0(K+22, A, B, C, D, KC11);
	EncRoundKeyUpdate1(K+24, A, B, C, D, KC12);
	EncRoundKeyUpdate0(K+26, A, B, C, D, KC13);
	EncRoundKeyUpdate1(K+28, A, B, C, D, KC14);
	EncRoundKeyUpdate0(K+30, A, B, C, D, KC15);

	//	Remove sensitive data
	A = B = C = D = T0 = T1 = 0;
	K = NULL;

	//
	return CTR_SUCCESS;
*/

/*************** Macros ***************************************************/
#define f_nround(bo, bi, k) {				\
	bo[0] = ft_tab[0][byte(bi[0],0)]		\
		  ^ ft_tab[1][byte(bi[1],1)]		\
		  ^ ft_tab[2][byte(bi[2],2)]		\
		  ^ ft_tab[3][byte(bi[3],3)] ^ k[0];\
	bo[1] = ft_tab[0][byte(bi[1],0)]		\
		  ^ ft_tab[1][byte(bi[2],1)]		\
		  ^ ft_tab[2][byte(bi[3],2)]		\
		  ^ ft_tab[3][byte(bi[0],3)] ^ k[1];\
	bo[2] = ft_tab[0][byte(bi[2],0)]		\
		  ^ ft_tab[1][byte(bi[3],1)]		\
		  ^ ft_tab[2][byte(bi[0],2)]		\
		  ^ ft_tab[3][byte(bi[1],3)] ^ k[2];\
	bo[3] = ft_tab[0][byte(bi[3],0)]		\
		  ^ ft_tab[1][byte(bi[0],1)]		\
		  ^ ft_tab[2][byte(bi[1],2)]		\
		  ^ ft_tab[3][byte(bi[2],3)] ^ k[3];\
	k += 4;									\
}

#define i_nround(bo, bi, k) {				\
	bo[0] = it_tab[0][byte(bi[0],0)]		\
		  ^ it_tab[1][byte(bi[3],1)]		\
		  ^ it_tab[2][byte(bi[2],2)]		\
		  ^ it_tab[3][byte(bi[1],3)] ^ k[0];\
	bo[1] = it_tab[0][byte(bi[1],0)]		\
		  ^ it_tab[1][byte(bi[0],1)]		\
		  ^ it_tab[2][byte(bi[3],2)]		\
		  ^ it_tab[3][byte(bi[2],3)] ^ k[1];\
	bo[2] = it_tab[0][byte(bi[2],0)]		\
		  ^ it_tab[1][byte(bi[1],1)]		\
		  ^ it_tab[2][byte(bi[0],2)]		\
		  ^ it_tab[3][byte(bi[3],3)] ^ k[2];\
	bo[3] = it_tab[0][byte(bi[3],0)]		\
		  ^ it_tab[1][byte(bi[2],1)]		\
		  ^ it_tab[2][byte(bi[1],2)]		\
		  ^ it_tab[3][byte(bi[0],3)] ^ k[3];\
	k += 4;					\
}

#ifdef LARGE_TABLES
	#define f_lround(bo, bi, k) {				\
		bo[0] = fl_tab[0][byte(bi[0],0)]		\
			  ^ fl_tab[1][byte(bi[1],1)]		\
			  ^ fl_tab[2][byte(bi[2],2)]		\
			  ^ fl_tab[3][byte(bi[3],3)] ^ k[0];\
		bo[1] = fl_tab[0][byte(bi[1],0)]		\
			  ^ fl_tab[1][byte(bi[2],1)]		\
			  ^ fl_tab[2][byte(bi[3],2)]		\
			  ^ fl_tab[3][byte(bi[0],3)] ^ k[1];\
		bo[2] = fl_tab[0][byte(bi[2],0)]		\
			  ^ fl_tab[1][byte(bi[3],1)]		\
			  ^ fl_tab[2][byte(bi[0],2)]		\
			  ^ fl_tab[3][byte(bi[1],3)] ^ k[2];\
		bo[3] = fl_tab[0][byte(bi[3],0)]		\
			  ^ fl_tab[1][byte(bi[0],1)]		\
			  ^ fl_tab[2][byte(bi[1],2)]		\
			  ^ fl_tab[3][byte(bi[2],3)] ^ k[3];\
	}

	#define i_lround(bo, bi, k) {				\
		bo[0] = il_tab[0][byte(bi[0],0)]		\
			  ^ il_tab[1][byte(bi[3],1)]		\
			  ^ il_tab[2][byte(bi[2],2)]		\
			  ^ il_tab[3][byte(bi[1],3)] ^ k[0];\
		bo[1] = il_tab[0][byte(bi[1],0)]		\
			  ^ il_tab[1][byte(bi[0],1)]		\
			  ^ il_tab[2][byte(bi[3],2)]		\
			  ^ il_tab[3][byte(bi[2],3)] ^ k[1];\
		bo[2] = il_tab[0][byte(bi[2],0)]		\
			  ^ il_tab[1][byte(bi[1],1)]		\
			  ^ il_tab[2][byte(bi[0],2)]		\
			  ^ il_tab[3][byte(bi[3],3)] ^ k[2];\
		bo[3] = il_tab[0][byte(bi[3],0)]		\
			  ^ il_tab[1][byte(bi[2],1)]		\
			  ^ il_tab[2][byte(bi[1],2)]		\
			  ^ il_tab[3][byte(bi[0],3)] ^ k[3];\
		}
#else
	#define f_rl(bo, bi, n, k)										\
		bo[n] = (u4byte)sbx_tab[byte(bi[n],0)] ^					\
			rotl(((u4byte)sbx_tab[byte(bi[(n + 1) & 3],1)]),  8) ^	\
			rotl(((u4byte)sbx_tab[byte(bi[(n + 2) & 3],2)]), 16) ^	\
			rotl(((u4byte)sbx_tab[byte(bi[(n + 3) & 3],3)]), 24) ^ *(k + n)

	#define i_rl(bo, bi, n, k)										\
		bo[n] = (u4byte)isb_tab[byte(bi[n],0)] ^					\
			rotl(((u4byte)isb_tab[byte(bi[(n + 3) & 3],1)]),  8) ^	\
			rotl(((u4byte)isb_tab[byte(bi[(n + 2) & 3],2)]), 16) ^	\
			rotl(((u4byte)isb_tab[byte(bi[(n + 1) & 3],3)]), 24) ^ *(k + n)

	#define f_lround(bo, bi, k) \
		f_rl(bo, bi, 0, k); 	\
		f_rl(bo, bi, 1, k); 	\
		f_rl(bo, bi, 2, k); 	\
		f_rl(bo, bi, 3, k)

	#define i_lround(bo, bi, k) \
		i_rl(bo, bi, 0, k); 	\
		i_rl(bo, bi, 1, k); 	\
		i_rl(bo, bi, 2, k); 	\
		i_rl(bo, bi, 3, k)
#endif

/*************** Function *************************************************
*	
*/
void	AES_Encrypt(
		void		*CipherKey,		//	鞠/汗龋侩 Round Key
		BYTE		*Data)			//	涝免仿阑 困茄 喉废阑 啊府虐绰 pointer
{
	RIJNDAEL_CIPHER_KEY	*RK_Struct=CipherKey;
	DWORD	*e_key=RK_Struct->RK;	//	64 DWORDs
	DWORD	k_len=RK_Struct->k_len;
	u4byte	b0[4], b1[4], *kp;

	LITTLE_B2D(&(Data[ 0]), b0[0]);
	LITTLE_B2D(&(Data[ 4]), b0[1]);
	LITTLE_B2D(&(Data[ 8]), b0[2]);
	LITTLE_B2D(&(Data[12]), b0[3]);

	//
	b0[0] ^= e_key[0];
	b0[1] ^= e_key[1];
	b0[2] ^= e_key[2];
	b0[3] ^= e_key[3];

	kp = e_key + 4;

	switch( k_len ) {
		case 8 :
			f_nround(b1, b0, kp); f_nround(b0, b1, kp);
		case 6 :
			f_nround(b1, b0, kp); f_nround(b0, b1, kp);
		case 4 :
			f_nround(b1, b0, kp); f_nround(b0, b1, kp);
			f_nround(b1, b0, kp); f_nround(b0, b1, kp);
			f_nround(b1, b0, kp); f_nround(b0, b1, kp);
			f_nround(b1, b0, kp); f_nround(b0, b1, kp);
			f_nround(b1, b0, kp); f_lround(b0, b1, kp);
	}

	//
	LITTLE_D2B(b0[0], &(Data[ 0]));
	LITTLE_D2B(b0[1], &(Data[ 4]));
	LITTLE_D2B(b0[2], &(Data[ 8]));
	LITTLE_D2B(b0[3], &(Data[12]));
}

/*************** Function *************************************************
*	
*/
void	AES_Decrypt(
		void		*CipherKey,		//	鞠/汗龋侩 Round Key
		BYTE		*Data)			//	涝免仿阑 困茄 喉废阑 啊府虐绰 pointer
{
	RIJNDAEL_CIPHER_KEY	*RK_Struct=CipherKey;
	DWORD	*d_key=RK_Struct->RK;	//	64 DWORDs
	DWORD	k_len=RK_Struct->k_len;
	u4byte	b0[4], b1[4], *kp;

	LITTLE_B2D(&(Data[ 0]), b0[0]);
	LITTLE_B2D(&(Data[ 4]), b0[1]);
	LITTLE_B2D(&(Data[ 8]), b0[2]);
	LITTLE_B2D(&(Data[12]), b0[3]);

	//
	b0[0] ^= d_key[0];
	b0[1] ^= d_key[1];
	b0[2] ^= d_key[2];
	b0[3] ^= d_key[3];

	kp = d_key + 4;

	switch( k_len ) {
		case 8 :
			i_nround(b1, b0, kp); i_nround(b0, b1, kp);
		case 6 :
			i_nround(b1, b0, kp); i_nround(b0, b1, kp);
		case 4 :
			i_nround(b1, b0, kp); i_nround(b0, b1, kp);
			i_nround(b1, b0, kp); i_nround(b0, b1, kp);
			i_nround(b1, b0, kp); i_nround(b0, b1, kp);
			i_nround(b1, b0, kp); i_nround(b0, b1, kp);
			i_nround(b1, b0, kp); i_lround(b0, b1, kp);
	}

	//
	LITTLE_D2B(b0[0], &(Data[ 0]));
	LITTLE_D2B(b0[1], &(Data[ 4]));
	LITTLE_D2B(b0[2], &(Data[ 8]));
	LITTLE_D2B(b0[3], &(Data[12]));
}

/*************** END OF FILE **********************************************/

⌨️ 快捷键说明

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