Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
84
Добавлен:
16.04.2013
Размер:
461.25 Кб
Скачать

Последовательность

Многочлен

Степень

Логарифм

длины 2

 

 

 

00

0

0

− ∞

10

1

1

0

01

α

α

1

11

1+α

α2

2

Таблица 2.5: Расширение поля GF(4) по модулю многочлена π(x) = x2 + x +1.

Правила сложения и умножения в этом поле приведены в Таблицах 2.6 и 2.7

+

0

1

α

α2

0

0

1

α

α2

1

1

0

α2

α

α

α

α2

0

1

α2

α2

α

1

0

Таблица 2.6: Сложение в поле GF(4) по модулю π(x) = x2 + x +1.

0

1

α

α2

0

0

0

0

0

1

0

1

α

α2

α

0

α

α2

1

α2

0

α2

1

α

Таблица 2.7: Умножение в поле GF(4) по модулю π(x) = x2 + x +1.

Формирование первой строки, первого столбца и диагональных элементов сложения, а также двух первых строк и двух первых столбцов таблицы умножения не вызывает затруднения. Поясним формирование других элементов.

На основе соотношения для примитивного элемента

α2 +α +1 = 0 имеем 1+α =α2 ,1+α2 =α,α +α2 =1.

Отсюда

αα2 =α3 =α(1+α) =α +α2 =1

α2 α2 =α4 =α 1 =α

ВТаблице 2.8 представлены элементы поля GF(8) , полученные как расширенное

поле по модулю многочлена π(x) = x3 + x +1.

Здесь примитивный элемент α является корнем π(x) , т.е. α3 +α +1 = 0 .

Последователь-

Многочлен

Коэффициенты

Степень

Логарифмы

ность длины 3

 

многочлена

 

 

000

0

β0

0

-

001

1

β1

α0

0

010

α

β2

α1

1

100

α2

β3

α2

2

011

α+1

β4

α3

3

110

α2 +α

β5

α4

4

111

α2 +α +1

β6

α5

5

101

α2 +1

β7

α6

6

001

1

β8=β1

α7=α0

0

Таблица 2.8: Элементы GF(8) - расширение поля по модулю π(x) = x3 + x +1.

Основные свойства полей Галуа

Число элементов поля Галуа равно степени простого числа.

27

Для любого простого p и целого положительного m наименьшим подполем поля GF( pm ) является поле GF( p) . Элементы поля GF( p) называются целыми числами поля GF( pm ) , а число p – его характеристикой.

В поле характеристики 2 ( p = 2) для каждого элемента a поля выполняется равенство a = −a .

Для любого простого p и целого положительного m существует поле с pm эле-

ментами.

Каждое поле GF(q) содержит хотя бы один примитивный элемент.

Над каждым полем существует хотя бы один примитивный многочлен любой положительной степени.

Каждый примитивный элемент имеет над любым подполем простой минимальный многочлен.

Два поля с одним и тем же числом элементов изоморфны.

Для любого q , являющегося степенью простого числа, и любого положительного целого m поле GF( p) является подполем в GF(qm ) , а GF(qm ) является расширением поля GF(q) .

Если n не делит m , то GF(qn ) не является подполем GF(qm ) .

Для любого элемента поля GF(qm ) степень минимального многочлена над GF(q) является делителем m.

Высокопроизводительная реализация арифметических операций в GF(2n )

Кодирование описанных в главе «Основы теории чисел для ЭВМ» базовых алгоритмов на одном из языков программирования не представляет никакой практической сложности. Однако, существует подход позволяющий значительно повысить производи-

тельность последних учитывая возможность представления элементов поля GF(2x ) посредством элементов GF(2y ) , для y x и предварительно сконструированных таблиц

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

AES.

Для обычных вычислений над полями GF(2n ) их элементы должны быть пред-

ставлены в определенном базисе. Большинство реализаций используют один из двух возможных базисов: стандартный базис или оптимальный нормальный базис. В стандартном

базисе элементы поля представляются в виде полиномов an1xn1 +…+a1x +a0 , где ai GF(2) , т.е. равны либо 0 либо 1, а сложение выполняется по модулю 2 . Полевые

операции над этими элементами представляют собой операции выполняемые над полиномами, например, полевое умножение должно вычисляться, как умножение полиномов с последующим взятием результата по модулю неприводимого многочлена степени n . В

нормальном базисе элементы поля представляются в виде bn1β2n1 +…+b2β22 +b1β2 +b0β , где β - фиксированный элемент поля , а bi GF(2) .

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

28

Приводимая ниже методика выполнения вычислений в полях GF(2n ) представляет собой третий вариант подхода более предпочтительный для программных реализаций.

Альтернативное представление элементов поля

Математика говорит, что поле может быть представлено векторным пространством посредством одного из его субполей. Соответствующие субполя GF(2n ) - это поля GF(2b ) , с b n и 0 < b < n . Большинство реализаций принимают b =1, выбирая тем самым

базис {γ0 ,γ1,,γn1} GF(2n ) и элементы поля, в таком случае, имеют представление вида a0γ0 +a1γ1 +…+an1γn1 , где все ai GF(2) . Программные реализации для этого типа

базиса характеризуются большим числом битовых операций такими, как проверка (тестирование) битов и их сдвиг на некоторое число позиций, что существует, практически, на всех современных микропроцессорных реализациях.

Вообще то b может представлять собой любой делитель n , например, 8 для субполя GF(28 ) (ниже рассматривается более общий случай, когда b кратно 8). Это несколько

ограничивает возможные значения n , но для небольших b эти ограничения несущественны. В принципе для данного подхода нет ограничений на выбор типа базиса (полиномиальный, нормальный …), однако, полиномиальный базис имеет большее преимущество по сравнению с нормальным для b 1.

Если положить m = n b , то элемент поля GF(2n ) может быть представлен в виде

am1xm1 +…+a1x +a0 , где ai GF(2b ) . Важное преимущество данного базиса заключается

в том, что каждый коэффициент представляется b битами и отлично согласуется с машинными словами для b =8,16,32 . Арифметика полиномов в данном случае имеет обыч-

ный вид, за исключением того, что все вычисления коэффициентов производятся над по-

лем GF(2b ) .

Вычисления над GF(2b ) в соответствующем базисе могут быть упрощены с привлечением так называемых таблиц пересчета (lookup tables). После выбора конкретного базиса для GF(2b ) разрабатывается генератор значений γ и рассчитываются все пары (a,i) , такие что a =γi , для (0 i < 2b 1) . Эти пары могут быть размещены в двух таблицах: log-таблице отсортированной по a и alog-таблице отсортированной по i . Каждая из них займет 2b слов по b битов (например, для b =8 - 512 байт, для b =16 - 256К; для b =32,64,применение данного метода оказывается нецелесообразным по причине неоправданного количества требующейся памяти). Эти таблицы могут быть использованы для эффективных вычислений над полями GF(2b ) , например, произведение двух элементов α, β GF(2b ) вычисляется:

αβ = (alog[log[a] +log[b]) mod(2b 1)] ,

операция нахождения мультипликативной инверсии:

a1 = (alog[log[a]) mod(2b 1)] .

Для выполнения операций над полиномами в конечных полях, эти операции должны выполняться по модулю неприводимого многочлена степени m . В принципе, этот по-

лином может иметь коэффициенты из GF(2b ) , но предпочтительнее, чтобы его коэффициенты принадлежали GF(2) , тем самым в вычислениях значительно сократиться общее

число обращений к таблицам пересчета. Поиск таких полиномов может быть существенно облегчен использованием того факта, что неприводимый полином m -той степени над

GF(2) , является также неприводимым над GF(2b ) , при условии, если gcd(m,b) =1. Это ограничивает m множеством нечетных чисел, поскольку b - степень двух.

29

Операции над полем.

В полиномиальном базисе, полевые операции разбиваются на операции над полиномами. Например, полевое умножение разбивается на умножение двух полиномов представленных мультипликантами, за чем следует взятие результата по модулю неприводимого многочлена.

Представление полиномов в памяти ЭВМ.

Естественно хранение коэффициентов полинома k -ой степени требует выделения последовательности из k +1 b -битовых слов в памяти ЭВМ. Для упрощения реализации алгоритмов будем выделять массив A из k +2 машинных слов, достаточных для хранения значений коэффициентов, а в нулевом элементе A0 массива разместим их количество;

A1 = a0 , A2 = a1,, Ak +1 = am1 . Полином, равный 0, представляется, как A0 = 0 .

Сложение

Сложение в конечных полях степени 2 чрезвычайно просто: складываем соответствующие биты по модулю 2 (исключающее ИЛИ ). Заметим, что сложение и вычитание по модулю 2 представляют собой одну и ту же операцию:

ALGORITHN ADD(a,b) RETURN (a b) ENDIF

ALGORITHN SUB(a,b) RETURN (a b) ENDIF

Умножение

Умножение полиномов осуществляется с использованием метода «сдвинуть-и- добавить», где сложение, как было сказано выше, представляет собой операцию исключающего ИЛИ. Алгоритм, представленный ниже вычисляет произведение A и B , и возвращает результат в C :

ALGORITHM MUL(A, B)

 

 

IF A0 = 0

OR

B0 = 0

THEN

C0 = 0

ELSE

 

 

 

 

 

Инициализируем C 0

 

FOR

i =1

TO A0 DO

 

 

 

IF

Ai 0

THEN

B0 DO

 

 

FOR

j =1

TO

 

 

 

IF

Bj 0

THEN

Ci+ j1 = Ci+ j1 alog[(log[Ai ] +log[Bj ]) mod(2b 1)]

ENDIF ENDFOR

ENDIF ENDFOR

ENDIF RETURN C

30

Возведение в квадрат

Возведение в квадрат полиномов с коэффициентами GF(2b ) может быть вычисле-

но более эффективно чем умножение «самого-на-себя». Причина в том, что квадрат суммы равен сумме квадратов при вычислении по модулю 2. Значит квадрат полинома можно получить так:

 

 

 

m1

m1

 

 

 

(ai xi )2 = ai2 x2i

 

 

 

i=1

i=1

Результатом является следующий алгоритм B = A2 :

ALGORITHM SQR(A, B)

 

IF A0 = 0

THEN B0 = 0

 

ELSE

 

THEN B1 = alog[2log[A1]mod(2b 1)]

IF

A1 0

ELSE B1 = 0

A0 1 DO

FOR

i = 2

TO

 

IF

Ai 0

THEN

B2i1 = alog[2log[Ai ]mod(2b 1)]

 

ELSE B2i1 = 0

 

 

B2i = 0

 

 

ENDFOR

 

 

 

B

= alog[2log[A ]mod(2b 1)]

2 A 1

 

 

A

 

0

 

 

0

 

B0 = 2A0 1

ENDIF RETURN B

Сложность данного алгоритма пропорциональна размерам аргументов. Для существующих вычислений намного более эффективен чем умножение.

Взятие по модулю.

В большинстве случаев, результаты умножения полиномов или возведения в квадрат сопровождаются операцией взятием по модулю неприводимого многочлена. В основном она применяется для уничтожения старших степеней результата. Говорят, для A взятого по модулю B сокращается старшая степень A при сложении (вычитании) множителя

в виде αBxiB0 из A , где α = A B1 . Эта операция повторяется для уменьшения значения

i B0

степени i , пока степень A не станет меньше степени B .

Получается наиболее простой алгоритм, если B - трехчлен с коэффициентами из GF(2) , поскольку вычисления α и αB тривиальны. Пусть A полином, который необхо-

димо взять по модулю B , l - число коэффициентов у B , t - номер некоторого среднего коэффициента B (1 <t <l) . Все Bi = 0 , кроме Bl = Bt = B1 =1.

ALGORITHM MOD(A, B) FOR i = A0 DOWNTO l DO

Ai+1l = Ai+1l Ai

Ai+1l = Ai+1l Ai

Ai = 0

ENDFOR RETURN B

31

Каждую итерацию из A исключается b битов.

Мультипликативная инверсия

B = A1 mod M если существует X : BA + XM =1, где A, B, X , M полиномы. B

(также как и X ) может быть вычислено с использованием расширенного алгоритма Евклида (см. «Элементы теории чисел для ЭВМ»). Алгоритм вычисления мультипликативной

инверсии для полиномиального базиса GF(2b ) оказывается быстрее, чем для нормального базиса: необходимо найти полином B и целое число k удовлетворяющее уравнению

BA + XM = xk . В данном случае, инверсия может быть найдена делением B на xk по модулю M . Сначала рассмотрим алгоритм нахождения инверсии для стандартного базиса, а

потом расширим его для полиномов из GF(2b ) .

ALGORITHM MINV(A, M )

k 0; B 1;C 0; F A;G M

 

1

WHILE F

содержит множитель x DO F = F / x;C = Cx;k = k +1;

2

IF

F =1

THEN RETURN

(B, k)

3

IF

deg(F) < deg(G) THEN

swap(F,G);swap(B,C)

4F = F +G; B = B +C;

5GOTO 1

Для того, чтобы применить данный алгоритм к полиномам с коэффициентами из GF(2b ) , строку 4 необходимо изменить следующим образом:

4 F = F +φγ 1G; B = B +φγ 1C

Также в строке 2 необходимо F проверять на равенство φ . Показатель φ в последствии

удаляется делением B , которое очень просто реализуется, если M является трехчленом. Для иллюстрации, приведем алгоритм реализующий данный подход на языке С для

GF(28 ) :

int deg(const int x)

{int r = (int)((x >> 1) | (x >> 2));

r |= (r >> 2); r |= (r >> 4);

return (r + 1) >> 1;

}

int minv(const int x)

{

int p1 = x, p2 = BPOLY, n1 = deg(x), n2 = 0x80, v1 = 1, v2 = 0;

if(x < 2) return x;

for(;;)

{

if(!n1) return v1;

while(n2 >= n1)

{

n2 /= n1; p2 ^= p1 * n2; v2 ^= v1 * n2; n2 = deg(p2);

}

if(!n2) return v2;

while(n1 >= n2)

{

n1 /= n2; p1 ^= p2 * n1; v1 ^= v2 * n1; n1 = deg(p1);

}

}

}

32

Соседние файлы в папке Шифрование AES