在 C++ 中实现 AES-128 混合列函数
Implementing AES-128 Mix-Column Function in C++
我正在尝试在 C++ 中实现 "Mix Column" 函数及其反函数。
我有一个实现 AES-128 的作业。我让所有其他功能(以及反函数)正常工作。但是,我正在努力让 mixcolumn 函数正常工作。我在应用函数之前打印明文,然后我应用混合列及其逆列并打印出结果。两个输出不匹配,我不知道为什么会这样。
void mixColumns(array< array<uint8_t, 4>, 4> &state)
{
//Create temp variable to store intermediate results
array< array<uint8_t,4>, 4> temp;
//Perform matrix multiplication under GF
for(int i=0;i<4;i++)
{
temp[0][i] = (0x02 * state[0][i]) ^ (0x03 * state[1][i]) ^ state[2][i] ^ state[3][i];
temp[1][i] = state[0][i] ^ (0x02 * state[1][i]) ^ (0x03 * state[2][i]) ^ state[3][i];
temp[2][i] = state[0][i] ^ state[1][i] ^ (0x02 * state[2][i]) ^ (0x03 * state[3][i]);
temp[3][i] = (0x03 * state[0][i]) ^ state[1][i] ^ state[2][i] ^ (0x02 * state[3][i]);
}
//Fill state with mix column data
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
state[j][i] = temp[j][i];
}
void invMixColumns(array< array<uint8_t, 4>, 4> &state)
{
//Create temp variable to store intermediate results
array< array<uint8_t,4>, 4> temp;
for(int i=0;i<4;i++)
{
temp[0][i] = (0x0E * state[0][i]) ^ (0x0B * state[1][i]) ^ (0x0D * state[2][i]) ^ (0x09 * state[3][i]);
temp[1][i] = (0x09 * state[0][i]) ^ (0x0E * state[1][i]) ^ (0x0B * state[2][i]) ^ (0x0D * state[3][i]);
temp[2][i] = (0x0D * state[0][i]) ^ (0x09 * state[1][i]) ^ (0x0E * state[2][i]) ^ (0x0B * state[3][i]);
temp[3][i] = (0x0B * state[0][i]) ^ (0x0D * state[1][i]) ^ (0x09 * state[2][i]) ^ (0x0E * state[3][i]);
}
//Fill state with inverse column data
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
state[j][i] = temp[j][i];
}
输入(和预期输出):110110101110110110001011011101100110011000011011010110001011010010011001000101010101010011100101111001111101110[110110]
使用 mixCoulmns 和 invMixColumns 的输出:
10111010111010010011111110010010011101101010111110001100001000000100100101101001001011111110101011111101100011011001101011=100[110]
设法修复它,但忘记更新我的 post。正如@doug 指出的那样,我没有在 GF(2^8) 下使用乘法,所以我得到了无效的答案。只需为这些字段硬编码查找 table 即可解决此问题(尽管我不确定这是否是最有效的方法)。
我正在尝试在 C++ 中实现 "Mix Column" 函数及其反函数。
我有一个实现 AES-128 的作业。我让所有其他功能(以及反函数)正常工作。但是,我正在努力让 mixcolumn 函数正常工作。我在应用函数之前打印明文,然后我应用混合列及其逆列并打印出结果。两个输出不匹配,我不知道为什么会这样。
void mixColumns(array< array<uint8_t, 4>, 4> &state)
{
//Create temp variable to store intermediate results
array< array<uint8_t,4>, 4> temp;
//Perform matrix multiplication under GF
for(int i=0;i<4;i++)
{
temp[0][i] = (0x02 * state[0][i]) ^ (0x03 * state[1][i]) ^ state[2][i] ^ state[3][i];
temp[1][i] = state[0][i] ^ (0x02 * state[1][i]) ^ (0x03 * state[2][i]) ^ state[3][i];
temp[2][i] = state[0][i] ^ state[1][i] ^ (0x02 * state[2][i]) ^ (0x03 * state[3][i]);
temp[3][i] = (0x03 * state[0][i]) ^ state[1][i] ^ state[2][i] ^ (0x02 * state[3][i]);
}
//Fill state with mix column data
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
state[j][i] = temp[j][i];
}
void invMixColumns(array< array<uint8_t, 4>, 4> &state)
{
//Create temp variable to store intermediate results
array< array<uint8_t,4>, 4> temp;
for(int i=0;i<4;i++)
{
temp[0][i] = (0x0E * state[0][i]) ^ (0x0B * state[1][i]) ^ (0x0D * state[2][i]) ^ (0x09 * state[3][i]);
temp[1][i] = (0x09 * state[0][i]) ^ (0x0E * state[1][i]) ^ (0x0B * state[2][i]) ^ (0x0D * state[3][i]);
temp[2][i] = (0x0D * state[0][i]) ^ (0x09 * state[1][i]) ^ (0x0E * state[2][i]) ^ (0x0B * state[3][i]);
temp[3][i] = (0x0B * state[0][i]) ^ (0x0D * state[1][i]) ^ (0x09 * state[2][i]) ^ (0x0E * state[3][i]);
}
//Fill state with inverse column data
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
state[j][i] = temp[j][i];
}
输入(和预期输出):110110101110110110001011011101100110011000011011010110001011010010011001000101010101010011100101111001111101110[110110]
使用 mixCoulmns 和 invMixColumns 的输出: 10111010111010010011111110010010011101101010111110001100001000000100100101101001001011111110101011111101100011011001101011=100[110]
设法修复它,但忘记更新我的 post。正如@doug 指出的那样,我没有在 GF(2^8) 下使用乘法,所以我得到了无效的答案。只需为这些字段硬编码查找 table 即可解决此问题(尽管我不确定这是否是最有效的方法)。