📄 aescodec.cpp
字号:
输入:
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 + -