Эти две функции одинаковы? - PullRequest
1 голос
/ 02 июня 2010

В алгоритме AES есть функция умножения байта на 2 в поле Галуа.

Это функция, указанная на сайте

private static byte gfmultby02(byte b)
    {
      if (b < 0x80)
        return (byte)(int)(b <<1);
      else
        return (byte)( (int)(b << 1) ^ (int)(0x1b) );
    }

Это функция, которую я написал.

private static byte MulGF2(byte x)
            {
            if (x < 0x80)
                return (byte)(x << 1);
            else
            {
                return (byte)((x << 1) ^ 0x1b);

            }

}

Что мне нужно знать, так это дать любой байт, будет ли он работать так же. На самом деле я беспокоюсь о дополнительном приведении к int, а затем снова к байту. Пока я проверил, и это выглядит хорошо. Имеет ли значение дополнительное приведение к int, а затем к байту в редких случаях?

Ответы [ 2 ]

2 голосов
/ 02 июня 2010

Я думаю, что в этом случае приведение к int ничего не делает, потому что приведение выполняется после сдвига влево. Итак, давайте рассмотрим небольшой пример:

byte b = 0x1000;

//temp1 == 0x00000000;
int temp1 = (int)(b << 1);
//temp2 == 0x00010000;
int temp2 = ((int)b) << 1);

Итак, как вы можете видеть, скобки сильно влияют на результат, но если вы взяли формулу с правильного веб-сайта, ваш код должен вести себя так же.

1 голос
/ 02 июня 2010

Я думаю, что это правильно, но:

Лучший способ убедиться в этом - просто протестировать его; Есть только 256 случаев, и написание тестового примера не займет много времени.

...