Правильна ли моя реализация MixColumns? - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь реализовать AES в J2ME, я реализовал мой на основе C# примера из Википедии: https://en.wikipedia.org/wiki/Rijndael_MixColumns#Implementation_example Моя реализация AES дает неверные результаты, и это код, который я Я менее уверен в этом, поэтому я хотел бы убедиться, что это правильно:

state - это массив байтов, хранящий матрицу состояний в главном порядке столбцов.

  public void mix_columns() {
    byte[] new_state = new byte[16];

    for (int i = 0; i < 4; i++) {
      new_state[0|(i<<2)] = (byte)(
        galois_field_multiply((byte)0x02, state[0|(i<<2)]) ^
        galois_field_multiply((byte)0x03, state[1|(i<<2)]) ^
        state[2|(i<<2)] ^
        state[3|(i<<2)]
      );
      new_state[1|(i<<2)] = (byte)(
        state[0|(i<<2)] ^
        galois_field_multiply((byte)0x02, state[1|(i<<2)]) ^
        galois_field_multiply((byte)0x03, state[2|(i<<2)]) ^
        state[3|(i<<2)]
      );
      new_state[2|(i<<2)] = (byte)(
        state[0|(i<<2)] ^
        state[1|(i<<2)] ^
        galois_field_multiply((byte)0x02, state[2|(i<<2)]) ^
        galois_field_multiply((byte)0x03, state[3|(i<<2)])
      );
      new_state[3|(i<<2)] = (byte)(
        galois_field_multiply((byte)0x03, state[0|(i<<2)]) ^
        state[1|(i<<2)] ^
        state[2|(i<<2)] ^
        galois_field_multiply((byte)0x02, state[3|(i<<2)])
      );
    }

    state = new_state;
  }

1 Ответ

0 голосов
/ 18 апреля 2020

Реализация правильная, на странице есть раздел с несколькими тестовыми векторами. Каждый столбец входных данных может быть проверен индивидуально с одним из этих тестовых векторов, и они дают правильные результаты. Например, вы можете предоставить следующее состояние:

        (byte)0xDB, (byte)0x13, (byte)0x53, (byte)0x45,
        (byte)0xDB, (byte)0x13, (byte)0x53, (byte)0x45,
        (byte)0xDB, (byte)0x13, (byte)0x53, (byte)0x45,
        (byte)0xDB, (byte)0x13, (byte)0x53, (byte)0x45,

, и оно предоставит значение:

        (byte)0x8E, (byte)0x4D, (byte)0xA1, (byte)0xBC,
        (byte)0x8E, (byte)0x4D, (byte)0xA1, (byte)0xBC,
        (byte)0x8E, (byte)0x4D, (byte)0xA1, (byte)0xBC,
        (byte)0x8E, (byte)0x4D, (byte)0xA1, (byte)0xBC,
...