2010-06-02 4 views
1

В алгоритме 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

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

byte b = 0x1000; 

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

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

1

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

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

+0

Разве что big-endian/little-endian не имеет значения? –

+0

@ Dan McG: Нет, это все в прямых вычислениях, даже на байтовых размерах. Никакие проблемы с контентом не должны влиять на результаты здесь. – unwind

+0

Действительно, я просто бросил его на Solaris/Sparc и Linux/Intel с C++, и он вел себя точно так же. –

Смежные вопросы