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

📄 aescodec.cpp

📁 AES加密解密
💻 CPP
📖 第 1 页 / 共 2 页
字号:
输入:
    state = {
		0x04, 0xe0, 0x48, 0x28, 
		0x66, 0xcb, 0xf8, 0x06, 
		0x81, 0x19, 0xd3, 0x26, 
		0xe5, 0x9a, 0x7a, 0x4c}

输出:
    state = {
		0xd4, 0xe0, 0xb8, 0x1e,
		0xbf, 0xb4, 0x41, 0x27,
		0x5d, 0x52, 0x11, 0x98,
		0x30, 0xae, 0xf1, 0xe5}
******************************************/
void AesCodec::InvMixColumns(AES_STATE state)
{
	int i, j;
    AES_BYTE temp[4];

	for(j = 0; j < 4; j++) //按列操作
	{
		for(i = 0; i < 4; i++) //保存中间,避免丢失数据
			temp[i] = state[i * 4 + j];

		for(i = 0; i < 4; i++) //转化二维为一维运算,提高速度
			state[i * 4 + j] = AesGF28(temp[0], m_AES_InvMix_poly[i * 4])
			                  ^AesGF28(temp[1], m_AES_InvMix_poly[i * 4 + 1])
			                  ^AesGF28(temp[2], m_AES_InvMix_poly[i * 4 + 2])
			                  ^AesGF28(temp[3], m_AES_InvMix_poly[i * 4 + 3]);
	}

}


/******************************************
功能:进行AES的GF28乘法运算

运行实例:

输入:
    s1 = 0x57 
	s2 = 0X13

输出:
    res = 0xfe
******************************************/
AES_BYTE AesCodec::AesGF28(AES_BYTE s1, AES_BYTE s2)
{
	AES_BYTE res;
	int i;
	
	res = 0;
	for(i = 0; i < 8; i++) //从高位开始运算
	{
		if(s2 & 0x80) res ^= s1; //乘数高位为1,则进行异或即GF28加法

		s2 = s2 << 1; //为下次一运算做好准备

		if(i < 7)
		{
			if(res & 0x80) //结果高位为1则要除去多项式100011011,使用减法运算
			{
			    res = (res << 1) ^ AESG28T; //GF28减法运算
			}
			else
			{
			    res = res << 1; //直接左移,为下一次运算做准备
			}
		}
	}
	return res;
}


/******************************************
功能:进行AES的KeyExpansion

运行实例:

输入:
	key[16] = {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 
                 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c};
输出:
	output w[44] = {
		0x2b7e1516, 0x28aed2a6, 0xabf71588, 0x09cf4f3c,
		0xa0fafe17, 0x88542cb1, 0x23a33939, 0x2a6c7605,
		0xf2c295f2, 0x7a96b943, 0x5935807a, 0x7359f67f,
		0x3d80477d, 0x4716fe3e, 0x1e237e44, 0x6d7a883b,
		0xef44a541, 0xa8525b7f, 0xb671253b, 0xdb0bad00,
		0xd4d1c6f8, 0x7c839d87, 0xcaf2b8bc, 0x11f915bc,
		0x6d88a37a, 0x110b3efd, 0xdbf98641, 0xca0093fd,
		0x4e54f70e, 0x5f5fc9f3, 0x84a64fb2, 0x4ea6dc4f,
		0xead27321, 0xb58dbad2, 0x312bf560, 0x7f8d292f,
		0xac7766f3, 0x19fadc21, 0x28d12941, 0x575c006e,
		0xd014f9a8, 0xc9ee2589, 0xe13f0cc8, 0xb6630ca6}
******************************************/
void AesCodec::KeyExpansion(AES_BYTE * key, AES_WORD * w)
{
	AES_WORD temp;
	int i, j;

	for(i = 0; i < 4; i++)
	{
		w[i] = key[4 * i];
		for(j = 1; j< 4; j++)
			w[i] = (w[i] << 8) | key[4 * i + j];
	}



	for(i = 4; i < 44; i++)
	{
		temp = w[i - 1];
		if(i % 4 == 0)
		{
			temp = SubWord(RotWord(temp)) ^ m_AES_Rocn[i/4];
		}
		w[i] = w[i - 4] ^ temp;
	}
}


/******************************************
功能:进行AES的SubWord

运行实例:

输入:
    w = 0x19a09ae9

输出:
    w = 0xd4e0b81e
******************************************/
AES_WORD AesCodec::SubWord(AES_WORD w)
{
	AES_WORD res;
	int i;

	for(i = 0, res = 0; i < 4; i++)
	{
		res = res << 8; //为运算做准备
		res |= m_AES_S_box[(int)((w >> ((3 - i) * 8)) & 0xff)]; //分四字节依次求,依次加入字中
	}

	return res;
}


/******************************************
功能:进行AES的加密运算

运行实例:

输入:
	w[44] = {
		0x2b7e1516, 0x28aed2a6, 0xabf71588, 0x09cf4f3c,
		0xa0fafe17, 0x88542cb1, 0x23a33939, 0x2a6c7605,
		0xf2c295f2, 0x7a96b943, 0x5935807a, 0x7359f67f,
		0x3d80477d, 0x4716fe3e, 0x1e237e44, 0x6d7a883b, 
		0xef44a541, 0xa8525b7f, 0xb671253b, 0xdb0bad00,
		0xd4d1c6f8, 0x7c839d87, 0xcaf2b8bc, 0x11f915bc,
		0x6d88a37a, 0x110b3efd, 0xdbf98641, 0xca0093fd,
		0x4e54f70e, 0x5f5fc9f3, 0x84a64fb2, 0x4ea6dc4f,
		0xead27321, 0xb58dbad2, 0x312bf560, 0x7f8d292f,
		0xac7766f3, 0x19fadc21, 0x28d12941, 0x575c006e,
		0xd014f9a8, 0xc9ee2589, 0xe13f0cc8, 0xb6630ca6}
	state[16] = {
		0x32, 0x88, 0x31, 0xe0,
		0x43, 0x5a, 0x31, 0x37,
		0xf6, 0x30, 0x98, 0x07,
		0xa8, 0x8d, 0xa2, 0x34};

输出:
	state[16] = {
 		0x39, 0x02, 0xdc, 0x19,
 		0x25, 0xdc, 0x11, 0x6a,
		0x84, 0x09, 0x85, 0x0b,
		0x1d, 0xfb, 0x97, 0x32}
******************************************/
void AesCodec::Cipher(AES_STATE state, AES_WORD * w)
{
	int i;

	AddRoundKey(state,  w);
	
	for(i = 1; i < 10; i++)
	{
		SubBytes(state);
		ShiftRow(state);
		MixColumns(state);
		AddRoundKey(state, (w + (i * 4)));
	}

	SubBytes(state);
	ShiftRow(state);
	AddRoundKey(state, (w + 40));
}


/******************************************
功能:进行AES的解密运算

运行实例:

输入:
	w[44] = {
		0x2b7e1516, 0x28aed2a6, 0xabf71588, 0x09cf4f3c,
		0xa0fafe17, 0x88542cb1, 0x23a33939, 0x2a6c7605,
		0xf2c295f2, 0x7a96b943, 0x5935807a, 0x7359f67f,
		0x3d80477d, 0x4716fe3e, 0x1e237e44, 0x6d7a883b, 
		0xef44a541, 0xa8525b7f, 0xb671253b, 0xdb0bad00,
		0xd4d1c6f8, 0x7c839d87, 0xcaf2b8bc, 0x11f915bc,
		0x6d88a37a, 0x110b3efd, 0xdbf98641, 0xca0093fd,
		0x4e54f70e, 0x5f5fc9f3, 0x84a64fb2, 0x4ea6dc4f,
		0xead27321, 0xb58dbad2, 0x312bf560, 0x7f8d292f,
		0xac7766f3, 0x19fadc21, 0x28d12941, 0x575c006e,
		0xd014f9a8, 0xc9ee2589, 0xe13f0cc8, 0xb6630ca6}
	state[16] = {
		0x32, 0x88, 0x31, 0xe0,
		0x43, 0x5a, 0x31, 0x37,
		0xf6, 0x30, 0x98, 0x07,
		0xa8, 0x8d, 0xa2, 0x34};

输出:
	state[16] = {
 		0x39, 0x02, 0xdc, 0x19,
 		0x25, 0xdc, 0x11, 0x6a,
		0x84, 0x09, 0x85, 0x0b,
		0x1d, 0xfb, 0x97, 0x32}
******************************************/
void AesCodec::InvCipher(AES_STATE state, AES_WORD * w)
{
	int i;

	AddRoundKey(state,  w + 40);
	
	for(i = 9; i > 0; i--)
	{
		InvShiftRow(state);
		InvSubBytes(state);
		AddRoundKey(state, (w + (i * 4)));
		InvMixColumns(state);
	}

	InvShiftRow(state);
	InvSubBytes(state);
	AddRoundKey(state, w);
}


/******************************************
功能:针对特殊的GF28运算,加快AES的InvMixColumns的速度
输入:AES_BYTE B
输出:B * 0x09
******************************************/
AES_BYTE AesCodec::GF2809(AES_BYTE B)
{
	AES_BYTE Mul2,Mul4,Mul8;
	Mul2=(B & '\x80') ? ((B << 1) ^ '\x1b') : (B <<1);
	Mul4=(Mul2 & '\x80') ? ((Mul2 << 1) ^ '\x1b') : (Mul2 <<1);
	Mul8=(Mul4 & '\x80') ? (( Mul4<< 1) ^ '\x1b') : (Mul4 <<1);
	return (Mul8 ^ B );
}


/******************************************
功能:针对特殊的GF28运算,加快AES的InvMixColumns的速度
输入:AES_BYTE B
输出:B * 0x0b
******************************************/
AES_BYTE AesCodec::GF280B(AES_BYTE B)
 {
	AES_BYTE Mul2,Mul4,Mul8;
	Mul2=(B & '\x80') ? ((B << 1) ^ '\x1b') : (B <<1);
	Mul4=(Mul2 & '\x80') ? ((Mul2 << 1) ^ '\x1b') : (Mul2 <<1);
	Mul8=(Mul4 & '\x80') ? (( Mul4<< 1) ^ '\x1b') : (Mul4 <<1);
	return (Mul8 ^ Mul2 ^ B );
 }


/******************************************
功能:针对特殊的GF28运算,加快AES的InvMixColumns的速度
输入:AES_BYTE B
输出:B * 0x0d
******************************************/
AES_BYTE AesCodec::GF280D(AES_BYTE B)
 {
	AES_BYTE Mul2,Mul4,Mul8;
	Mul2=(B & '\x80') ? ((B << 1) ^ '\x1b') : (B <<1);
	Mul4=(Mul2 & '\x80') ? ((Mul2 << 1) ^ '\x1b') : (Mul2 <<1);
	Mul8=(Mul4 & '\x80') ? (( Mul4<< 1) ^ '\x1b') : (Mul4 <<1);
	return (Mul8 ^ Mul4 ^ B );
 }


/******************************************
功能:针对特殊的GF28运算,加快AES的InvMixColumns的速度
输入:AES_BYTE B
输出:B * 0x0e
******************************************/
AES_BYTE AesCodec::GF280E(AES_BYTE B)
 {
	AES_BYTE Mul2,Mul4,Mul8;
	Mul2=(B & '\x80') ? ((B << 1) ^ '\x1b') : (B <<1);
	Mul4=(Mul2 & '\x80') ? ((Mul2 << 1) ^ '\x1b') : (Mul2 <<1);
	Mul8=(Mul4 & '\x80') ? (( Mul4<< 1) ^ '\x1b') : (Mul4 <<1);
	return (Mul8 ^ Mul4 ^ Mul2 );
 }

⌨️ 快捷键说明

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