Реализация функции смешанного столбца AES-128 в C ++ - PullRequest
1 голос
/ 02 июня 2019

Я пытаюсь реализовать функцию «Смешать столбец» и ее инверсию в C ++.

У меня есть кусок домашнего задания для реализации 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];

}

Ввод (и ожидаемый вывод): 110110101110110110001011011101100110011000011011010110001011010010011001000101010101010011010101010000110101010100001101010101010011010101010000110101010100001101010101010000010101010100001101010101000011010101010100000101010101000011010101010000110101010100001101010101010000010101010100000101010101000011011

Вывод с помощью mixCoulmns & invMixColumns: 10111010111010010011111110010010011101101010111110001100001000000100100101101001001011001101010111111011000110110011010100110110

1 Ответ

0 голосов
/ 05 июня 2019

Успел починить, но забыл обновить свой пост.Как отметил @doug, я не использовал умножение в GF (2 ^ 8), поэтому я получал неверные ответы.Простое программирование таблицы поиска для этих полей решило эту проблему (хотя я не уверен, что это был самый эффективный способ сделать это).

...