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

📄 aes.cpp

📁 aes cbc mode source code
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void Aes::invByteSub(Block *pBlk)
{
	int i;

	for(i = 0; i < BLK_SIZE; i++)
	{
		pBlk->blkByte[i] = SBoxInv[pBlk->blkByte[i]];
	}
}

/**************************
 * FUNCTION: shiftRow
 *
 * PARAMETERS: 
 *
 * DESCRIPTION:
 **************************/
void Aes::shiftRow(Block *pBlk)
{
	Block	tmp;

	tmp.blkByte[0] = pBlk->blkByte[0];
	tmp.blkByte[1] = pBlk->blkByte[5];
	tmp.blkByte[2] = pBlk->blkByte[10];
	tmp.blkByte[3] = pBlk->blkByte[15];

	tmp.blkByte[4] = pBlk->blkByte[4];
	tmp.blkByte[5] = pBlk->blkByte[9];
	tmp.blkByte[6] = pBlk->blkByte[14];
	tmp.blkByte[7] = pBlk->blkByte[3];

	tmp.blkByte[8] = pBlk->blkByte[8];
	tmp.blkByte[9] = pBlk->blkByte[13];
	tmp.blkByte[10] = pBlk->blkByte[2];
	tmp.blkByte[11] = pBlk->blkByte[7];

	tmp.blkByte[12] = pBlk->blkByte[12];
	tmp.blkByte[13] = pBlk->blkByte[1];
	tmp.blkByte[14] = pBlk->blkByte[6];
	tmp.blkByte[15] = pBlk->blkByte[11];

	memcpy(pBlk, &tmp, sizeof(Block));
}

/**************************
 * FUNCTION: invShiftRow
 *
 * PARAMETERS: 
 *
 * DESCRIPTION:
 **************************/
void Aes::invShiftRow(Block *pBlk)
{
	Block	tmp;

	tmp.blkByte[0] = pBlk->blkByte[0];
	tmp.blkByte[1] = pBlk->blkByte[13];
	tmp.blkByte[2] = pBlk->blkByte[10];
	tmp.blkByte[3] = pBlk->blkByte[7];

	tmp.blkByte[4] = pBlk->blkByte[4];
	tmp.blkByte[5] = pBlk->blkByte[1];
	tmp.blkByte[6] = pBlk->blkByte[14];
	tmp.blkByte[7] = pBlk->blkByte[11];

	tmp.blkByte[8] = pBlk->blkByte[8];
	tmp.blkByte[9] = pBlk->blkByte[5];
	tmp.blkByte[10] = pBlk->blkByte[2];
	tmp.blkByte[11] = pBlk->blkByte[15];

	tmp.blkByte[12] = pBlk->blkByte[12];
	tmp.blkByte[13] = pBlk->blkByte[9];
	tmp.blkByte[14] = pBlk->blkByte[6];
	tmp.blkByte[15] = pBlk->blkByte[3];

	memcpy(pBlk, &tmp, sizeof(Block));
}


/**************************
 * FUNCTION: mixColumn
 *
 * PARAMETERS: 
 *
 * DESCRIPTION:
 **************************/
void Aes::mixColumn(Block *pBlk)
{
	Block	tmp;
	int		i;

	for(i = 0; i < 4; i++)
	{
		tmp.blkByte[i*4] = f2(pBlk->blkByte[4*i]) ^ f3(pBlk->blkByte[4*i+1]) ^
						pBlk->blkByte[4*i+2] ^ pBlk->blkByte[4*i+3];

		tmp.blkByte[i*4+1] = pBlk->blkByte[4*i] ^ f2(pBlk->blkByte[4*i+1]) ^
						f3(pBlk->blkByte[4*i+2]) ^ pBlk->blkByte[4*i+3];

		tmp.blkByte[i*4+2] = pBlk->blkByte[4*i] ^ pBlk->blkByte[4*i+1] ^
						f2(pBlk->blkByte[4*i+2]) ^ f3(pBlk->blkByte[4*i+3]);

		tmp.blkByte[i*4+3] = f3(pBlk->blkByte[4*i]) ^ pBlk->blkByte[4*i+1] ^
						 pBlk->blkByte[4*i+2] ^ f2(pBlk->blkByte[4*i+3]);
	}
	memcpy(pBlk, &tmp, sizeof(Block));

}


/**************************
 * FUNCTION: invMixColumn
 *
 * PARAMETERS: 
 *
 * DESCRIPTION:
 **************************/
void Aes::invMixColumn(Block *pBlk)
{
	Block	tmp;
	int		i;

	for(i = 0; i < 4; i++)
	{
		tmp.blkByte[4*i] = fe(pBlk->blkByte[4*i]) ^ fb(pBlk->blkByte[4*i+1]) ^
						fd(pBlk->blkByte[4*i+2]) ^ f9(pBlk->blkByte[4*i+3]);

		tmp.blkByte[4*i+1] = f9(pBlk->blkByte[4*i]) ^ fe(pBlk->blkByte[4*i+1]) ^
						fb(pBlk->blkByte[4*i+2]) ^ fd(pBlk->blkByte[4*i+3]);

		tmp.blkByte[4*i+2] = fd(pBlk->blkByte[4*i]) ^ f9(pBlk->blkByte[4*i+1]) ^
						fe(pBlk->blkByte[4*i+2]) ^ fb(pBlk->blkByte[4*i+3]);

		tmp.blkByte[4*i+3] = fb(pBlk->blkByte[4*i]) ^ fd(pBlk->blkByte[4*i+1]) ^
						 f9(pBlk->blkByte[4*i+2]) ^ fe(pBlk->blkByte[4*i+3]);
	}
	memcpy(pBlk, &tmp, sizeof(Block));

}



/**************************
 * FUNCTION: makeKeys
 *
 * PARAMETERS: 
 *
 * DESCRIPTION:
 **************************/
void Aes::makeKeys(Block key)
{
	int i, j, k;
	Uint32 tmp, wi_4, wi_1;
	Uint8	*pTmp;
	Uint32	rndCnst[11] = {0x00, 0x01, 0x02, 
							0x04, 0x08, 0x10,
							0x20, 0x40, 0x80, 
							0x1b, 0x36};

	memcpy(&rndKeys[0], &key, sizeof(Block)); // copy the master key to block 0
	//rndKeys[0].pBlkWord = (Uint32 *)&rndKeys[0].blkByte + 3;

	for(i = 1; i < NUM_RND; i++)
	{
		// do transformation 
		rndKeys[i-1].pBlkWord = (Uint32 *)&rndKeys[i-1].blkByte + 3;
		rndKeys[i].pBlkWord = (Uint32 *)&rndKeys[i].blkByte; // set address
		
		//shift bytes
		tmp = (*rndKeys[i-1].pBlkWord << 24) |
				((*rndKeys[i-1].pBlkWord & 0xffffff00) >> 8);
		
		tmp = tmp;
		pTmp = (Uint8 *)&tmp;

		// SBox substitution
		for(k = 0; k<4; k++)
		{
			*pTmp = SBox[*pTmp];
			pTmp++;
		}
		
		// result
		rndKeys[i-1].pBlkWord = (Uint32 *)&rndKeys[i-1].blkByte;
		*rndKeys[i].pBlkWord = tmp ^ rndCnst[i] ^ *rndKeys[i-1].pBlkWord;  


		rndKeys[i].pBlkWord ++;
		rndKeys[i-1].pBlkWord ++;

		for(j = 1; j<4; j++)
		{
			wi_4 = *(rndKeys[i].pBlkWord - 1);
			wi_1 = *rndKeys[i-1].pBlkWord;
			*rndKeys[i].pBlkWord = wi_1 ^ wi_4;
			rndKeys[i].pBlkWord += 1;
			rndKeys[i-1].pBlkWord ++;
			
		}
		rndKeys[i].pBlkWord = (Uint32 *)&rndKeys[i].blkByte; // reset address
		rndKeys[i-1].pBlkWord = (Uint32 *)&rndKeys[i-1].blkByte;
	}
}


/**************************
 * FUNCTION: getRndKeys
 *
 * PARAMETERS: 
 *
 * DESCRIPTION:
 **************************/
void Aes::getRndKeys(int rndNum, Block *pKey)
{
	memcpy(pKey, &rndKeys[rndNum], sizeof(Block));
}















//-----------------------------------------------

#if 0
/**************************
 * FUNCTION: shiftRow
 *
 * PARAMETERS: 
 *
 * DESCRIPTION:
 **************************/
void Aes::shiftRow(Block *pBlk)
{
	//Uint32	tmp;

	pBlk->pBlkWord = (unsigned int *)pBlk->blkByte;

	pBlk->pBlkWord ++; // shift second row
	*pBlk->pBlkWord = (*pBlk->pBlkWord << 24) | 
		((*pBlk->pBlkWord & 0xffffff00) >> 8); // shift second row

	pBlk->pBlkWord ++; // shift third row
	*pBlk->pBlkWord = (*pBlk->pBlkWord << 16) | 
		((*pBlk->pBlkWord & 0xffff0000) >> 16); // shift third row

	pBlk->pBlkWord ++; // shift fourth row
	*pBlk->pBlkWord = (*pBlk->pBlkWord << 8) | 
		((*pBlk->pBlkWord & 0xffffff00) >> 24); // shift fourth row
}

/**************************
 * FUNCTION: invShiftRow
 *
 * PARAMETERS: 
 *
 * DESCRIPTION:
 **************************/
void Aes::invShiftRow(Block *pBlk)
{
	//Uint32	tmp;

	pBlk->pBlkWord = (unsigned int *)pBlk->blkByte;

	pBlk->pBlkWord ++; // shift second row
	*pBlk->pBlkWord = (*pBlk->pBlkWord << 8) | 
		((*pBlk->pBlkWord & 0xffffff00) >> 24); // shift second row

	pBlk->pBlkWord ++; // shift third row
	*pBlk->pBlkWord = (*pBlk->pBlkWord << 16) | 
		((*pBlk->pBlkWord & 0xffff0000) >> 16); // shift third row

	pBlk->pBlkWord ++; // shift fourth row
	*pBlk->pBlkWord = (*pBlk->pBlkWord << 24) | 
		((*pBlk->pBlkWord & 0xffffff00) >> 8); // shift fourth row
}



/**************************
 * FUNCTION: mixColumn
 *
 * PARAMETERS: 
 *
 * DESCRIPTION:
 **************************/
void Aes::mixColumn(Block *pBlk)
{
	Block	tmp;
	int		i;

	for(i = 0; i < 4; i++)
	{
		tmp.blkByte[i] = f2(pBlk->blkByte[i]) ^ f3(pBlk->blkByte[4+i]) ^
						pBlk->blkByte[8+i] ^ pBlk->blkByte[12+i];

		tmp.blkByte[4+i] = pBlk->blkByte[i] ^ f2(pBlk->blkByte[4+i]) ^
						f3(pBlk->blkByte[8+i]) ^ pBlk->blkByte[12+i];

		tmp.blkByte[8+i] = pBlk->blkByte[i] ^ pBlk->blkByte[4+i] ^
						f2(pBlk->blkByte[8+i]) ^ f3(pBlk->blkByte[12+i]);

		tmp.blkByte[12+i] = f3(pBlk->blkByte[i]) ^ pBlk->blkByte[4+i] ^
						 pBlk->blkByte[8+i] ^ f2(pBlk->blkByte[12+i]);
	}
	memcpy(pBlk, &tmp, sizeof(Block));

}


/**************************
 * FUNCTION: invMixColumn
 *
 * PARAMETERS: 
 *
 * DESCRIPTION:
 **************************/
void Aes::invMixColumn(Block *pBlk)
{
	Block	tmp;
	int		i;

	for(i = 0; i < 4; i++)
	{
		tmp.blkByte[i] = fe(pBlk->blkByte[i]) ^ fb(pBlk->blkByte[4+i]) ^
						fd(pBlk->blkByte[8+i]) ^ f9(pBlk->blkByte[12+i]);

		tmp.blkByte[4+i] = f9(pBlk->blkByte[i]) ^ fe(pBlk->blkByte[4+i]) ^
						fb(pBlk->blkByte[8+i]) ^ fd(pBlk->blkByte[12+i]);

		tmp.blkByte[8+i] = fd(pBlk->blkByte[i]) ^ f9(pBlk->blkByte[4+i]) ^
						fe(pBlk->blkByte[8+i]) ^ fb(pBlk->blkByte[12+i]);

		tmp.blkByte[12+i] = fb(pBlk->blkByte[i]) ^ fd(pBlk->blkByte[4+i]) ^
						 f9(pBlk->blkByte[8+i]) ^ fe(pBlk->blkByte[12+i]);
	}
	memcpy(pBlk, &tmp, sizeof(Block));

}
#endif

/**************************
 * FUNCTION: 
 *
 * PARAMETERS: 
 *
 * DESCRIPTION:
 **************************/

⌨️ 快捷键说明

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