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

Реализация базовых операций защиты информации на сигнальных процессорах. Ч. 3. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
703 Кб
Скачать

2.3 РЕАЛИЗАЦИЯ ОПЕРАЦИЙ В РАСШИРЕННЫХ ПОЛЯХ ГАЛУА

Ранее было показано, что в расширенных полях Галуа GF(216) операции сложения и вычитания реализуются логической операцией «исключающее ИЛИ», не приводят к расширению разрядной сетки и, если операнды являются элементами поля, то не требуют применения операции вычисления остатка от деления на образующий полином по отношению к результату операции. Остальные операции реализуются несколько сложнее.

2.3.1 Деление

Во многих случаях программной реализации операций оказывается эффективным «лобовой» подход к решению задачи; этот подход часто обеспечивает оптимальный алгоритм решения задач и почти всегда – высокую скорость отладки программ. Рассмотрим использование лобового подхода на примере реализации операции вычисления остатка от деления полиномов.

Если при делении полиномов «в столбик» заменить на нули отсутствующие члены полиномов в порядке следования степеней и в примитивах деления выписывать полную (во всяком случае, справа) строку деления, нетрудно обнаружить простую закономерность формирования примитива деления. Так, например, при делении числа

409 = 28 + 27 + 24 + 23 + 1

=> x8 + x7 + x4 + x3 + 1

на число

 

19 = 24 + 2 + 1 => x4 + x + 1

имеет место следующая картина деления.

x8 + x7 + 0 + 0 + x4 + x3 + 0 + 0 + 1 x4 + 0 + 0 + x +1

x8 + 0 + 0 + x5 + x4

x4 + x3 + 0 + x + 1

0

+ x7 + 0 + x5 + 0+ x3 + 0 + 0 + 1

частное

 

x7 + 0 + 0 + x4 + x3

 

0+ 0+ 0 + x5 + x4 + 0+ 0 + 0 + 1

 

 

x5 + 0 + 0 + x2 + x

 

 

 

0+ 0+ 0 + 0 + x4 + 0 + x2 + x + 1

 

 

x4 + 0 + 0 + x+ 1

 

 

 

 

0

+ 0+ 0 + 0 + 0 + 0 + x2 + 0 + 0

– остаток

Процесс деления организуется последовательным сдвигом делителя относительно изначально выравненного по старшим разрядам делимого – каждый раз на одну позицию в сторону младших разрядов. Закономерность

21

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

Отмеченная закономерность (помечена рамками) связана с отсутствием межразрядных переносов и может быть реализована операцией «исключающее ИЛИ». Заменяя значащие позиции многочлена на единицы (приведение в форму представления в процессоре) и устраняя из рассмотрения порядок вычисления частного:

 

1

1

0

0

1

1

0

0

1

– делимое

+

1

0

0

1

1

 

 

 

 

– делитель

 

 

 

 

 

 

 

 

 

 

 

 

0

1

0

1

0

1

0

0

1

 

+

 

 

 

 

 

 

 

 

 

 

 

1

0

0

1

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

0

1

1

0

0

0

1

 

+

 

 

 

 

 

 

 

 

 

 

 

 

 

1

0

0

1

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

0

0

1

0

1

1

1

 

+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

0

0

1

1

 

 

0

0

0

0

0

0

1

0

0

– остаток

 

 

 

 

 

 

 

 

 

 

 

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

1.До начала деления следует убедиться в том, что делитель не равен нулю. Если же он равен нулю, следует выставить флаг невозможности деления (в программу не включено).

2.До начала деления следует убедиться в том, что делимое не равно нулю. Если же делимое равно нулю, остаток от деления равен нулю (в программу не включено).

3.До начала деления следует убедиться в том, что степень делителя не больше степени делимого, в противном случае остаток от деления равен делимому. Выполнение операций 2 и особенно 3 во многих случаях ускоряет выполнение программы.

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

22

5.Проанализировать значение старшего разряда разрядной сетки делимого. Если оно равно единице, выполнить операцию «исключающее ИЛИ» над операндами делимого и делителя, результат занести по месту делимого.

6.Сдвинуть делитель на один разряд вправо.

7.Проанализировать значение следующего по старшинству разряда разрядной сетки делимого, и, если оно равно единице, выполнить операцию «исключающее ИЛИ» аналогично п. 5).

8.Повторить операции 6 и 7 n раз, где n – количество разрядов, на которые был сдвинут делитель в операции 3. Изложенный принцип организации операций вычисления остатка от деления может быть реализован с помощью программы, текст которой приведен на рисунке 2.6.

.module/ram

delenie;

 

.entry

 

pdelen;

 

 

{

 

 

 

подпрограмма вычисления остатка от деления

 

16-разрядного полинома из AY1 на аналогичный из MR1

 

по правилам деления полиномов; возвращает остаток

 

- в AR попутно портит содержимое AF MR0 SR1 SR0 SE

 

}

 

 

pdelen:

mr0 = 0x8000; { единица в старшем разряде }

 

disar_sat;

 

 

{

 

 

 

проанализировать старший разряд делителя

 

если он равен 1, обработка короче

 

}

 

 

 

af = tstbit 0xf of mr1;

if ne jump obr1;

 

{

 

 

 

если же он равен 0, найти разность делимого и делителя

 

если они равны, остаток = 0

 

если делитель больше делимого (по степени

 

полинома), остаток = делимому

 

}

 

 

 

ar = mr0 and ay1;

if ne jump viv_del;

 

af = ay1 - mr1;

if eq jump viv0;

 

iflt jump viv_del;

 

 

{

 

 

 

возможности коротких обходов кончились

 

сдвинуть делитель старшим ненулевым

 

разрядом в крайнюю левую позицию

 

}

 

 

 

se = exp mr1 (hi);

ar = se;

 

ar = ar - 1;

se = ar;

 

sr = norm mr1 (hi);

mr1 = sr1;

Рисунок 2.6 (начало) - Вычисление остатка от деления в расширенных полях Галуа

23

{

 

проанализировать старший разряд делимого

если он равен 1, скорректировать делимое

}

 

af = pass ay1;

none = mr0 and af;

 

if ne af = mr1 xoraf;

 

 

{

 

 

 

 

CNTR = количеству позиций сдвига делителя

 

}

 

 

 

 

ar = abs ar;

 

cntr = ar;

 

se = -1;

 

 

sr = lshift mr0 (lo);

 

dottttuntilce;

 

 

 

{

 

 

 

 

сдвинуть делитель на 1 позицию вправо

 

}

 

 

 

 

sr = lshift mr1 (lo),

mr0 = sr0;

 

{

 

 

 

 

проанализировать соответствующий разряд делимого

 

}

 

 

 

 

ar = mr0 andaf,

mr1 = sr0;

 

{

 

 

 

 

если он равен 1, скорректировать делимое

 

}

 

 

 

 

if ne af = mr1 xoraf;

 

 

{

 

 

 

 

перейти к следующему разряду

 

}

 

 

 

tttt:

sr = lshift mr0 (lo);

 

{

 

 

 

 

возвращение результата

 

 

}

 

 

 

 

ar = passaf;

 

rts;

 

 

{

 

 

 

 

если старший разряд делителя равен 1,

 

проанализировать старший разряд делимого

 

}

 

 

 

obr1:

af = mr0 anday1;

 

ifeqjumpviv_del;

 

{

 

 

 

 

если он равен 1, один раз скорректировать делимое

 

}

 

 

 

 

ar = mr1 xor ay1;

 

rts;

 

{

 

 

 

 

вывод остатка равного делимому

 

}

 

 

 

viv_del:

ar = ay1;

rts;

 

 

 

{

 

 

 

 

вывод остатка равного 0

 

 

}

 

 

 

viv0:

ar = 0;

rts;

 

 

.endmod;

 

 

 

 

Рисунок 2.6 (окончание) - Вычисление остатка от деления в расширенных полях Галуа

24

2.3.2 Умножение на x1 и генерация М-последовательностей

Умножение элемента а поля GF(2n)

a = a n – 1 * xn – 1 + a n – 2 * xn – 2 + ... + a 1 * x1 + a 0 * x0

на x1 приведет к сдвигу элемента на одну позицию в сторону старших разрядов:

(a * x) = a n – 1 * xn + a n – 2 * xn – 1 + ... + a 1 * x2 + a 0 * x1.

При вычислении (a * x) mod (xn + x + 1) следует иметь в виду следующее положение вещей:

• если an – 1 = 0, то степень полинома (a * x) ниже степени полинома (xn + x + 1)

(a * x) mod (xn + x + 1) = а * х ;

• если an – 1 = 1, то полином содержит член xn, уничтожение которого операцией mod (xn + x + 1) в соответствии с ранее изложенными правилами требует суммирования сдвинутого полинома с полиномом (х+1) в силу того, что

xn + x + 1 = 0 => xn = x + 1.

Формально результат операции (a * x) mod (xn + x + 1) для любого значения an – 1 может быть записан следующим образом:

(a* x) mod (xn + x + 1) = a n – 2 * xn – 1 +...+ a 1 * x2 + (a 0 + a n – 1 ) * x + a n – 1 .

Реализация описанной процедуры в системе команд процессора ADSP-2181 может быть выполнена в виде программы, представленной на рисунке 2.7. Значение элемента а должно быть занесено в регистр АR, а в регистр AY0 должна быть записана двоичная комбинация с единичными значениями в разрядах D15… Dn и нулевыми в остальных.

.module/ram/abs=0 qqq;

.entryumn_x;

umn_x: dis ar_sat;

ay1 = 3; { единицы в младших разрядах }

{

сдвигполиномаА

}

af = pass ar; ar = ar + af;

{

проверка значения разряда n

если оно равно 1, суммировать полином с х + 1

}

none = ar and ay0; if ne ar = arxor ay1;

{

уничтожениестаршихразрядов

}

af = not ay0; ar = ar and af; rts;

.endmod;

Рисунок 2.7 - Вычисление (a * x) mod (xn+ x + 1)

25

Если полином х является генератором над полем GF(2n) с образующим полиномом ( xn + x + 1), то зацикливание программы на рисунке 2.7 сформирует генератор псевдослучайной М-последовательности, основанный на выражении xn = x + 1. Период последовательности будет равен (n – 1).

Строго говоря, вид полинома не обязательно должен описываться как ( xn + x + 1). Необходимо и достаточно, чтобы полином х1 являлся генератором над полем, в этом случае умножение на х будет соответствовать возведению в степень полинома х1.

Отыскание генераторов не является тривиальной задачей; ее рассмотрение выходит за рамки настоящего пособия. Таблицы генераторов (примитивных полиномов) вплоть до степени 29689, приведены в [6]. Данными этих таблиц целесообразно пользоваться при разработке генераторов ПСП, при этом следует иметь в виду свойство примитивных полиномов, согласно которому, если полином

x a + x b + x c + 1

является примитивным, то примитивным является и полином x a + xa – c + xa – b + 1.

Также является примитивным любой полином x n p(1/x), если примитивным является полином p(x).

2.3.3 Самосинхронизующиеся М-последовательности

Последовательности, сформированные генератором на основе выражения xn через остальные члены образующего полинома (в примере предшествующего подраздела xn = x + 1), не обладают свойством самосинхронизации. Это свойство заключается в возможности обеспечения в любой момент после приема n последовательных битов одного генератора ПСП засинхронизировать относительно него другой генератор ПСП. Самосинхронизующиеся последовательности часто используются для измерения коэффициента ошибок в каналах связи.

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

Так, например, генератор самосинхронизующейся М-последовательности с периодом (211 – 1), основанный на выражении х11 + х9 = 1 (образующий полином х11 + х9 + 1), может быть реализован в виде программы для процессора ADSP-2181, представленной на рисунке 2.8.

26

.module/ram/abs=0 qq;

disar_sat; { снять режим ограничения по переполнению } ar = 0xffe0; { начальное значение }

dogenuntilforever;

{

сдвиг AR на 1 разряд влево эквивалентен умножению числа на 2, реализуется сложением операнда самого с собой

}

ay0 = ar; ar = ar + ay0;

{

формированиемладшегоразряда

}

if ac ar = tglbit 5 of ar;

af = tstbit 0xe of ar; if ne ar = tglbit 5 of ar;

{

вывод - сугубо демонстрационный

}

gen: io(0) = ar;

.endmod;

Рисунок 2.8 - Генератор самосинхронизующейся М-последовательности (образующий полином х11 + х9 + 1)

2.3.4 Умножение

Произведение с двух произвольных элементов а и b поля GF(2n)

a= a n – 1 * x n – 1 + a n – 2 * xn – 2 + ... + a 1 * x 1 + a 0 * x 0,

b= b n – 1 * x n – 1 + b n – 2 * xn – 2 + ... + b 1 * x 1 + b 0 * x 0,

c = c n – 1 * x n – 1 + c n – 2 * xn – 2 + ... + c 1 * x 1 + c 0 * x 0

может быть вычислено по рекурсивной процедуре:

c = a * b = b0 * a + b1 *(a * x) mod q + b2 *(a * x2) mod q +...+ b n – 1 *(a * x n – 1) mod q =

=b0 * a + b1 *(a * x) mod q + b2* (((a * x) mod q) * x) mod q +...

+b n – 1 *((((a * x) mod q) * x) mod q ... * x) mod q,

где q – образующий полином, например, q = xn + x + 1.

Вычисление по рекурсивной процедуре состоит в n-кратном условном

(по значению бита bi) суммировании домноженного на х элемента а (по процедуре (a * x) mod q , описанной ранее в подразделе 2.3.2).

27

В рамках 16-разрядной сетки вычисление произведения может быть реализовано, например, с помощью программы, представленной на рисунке 2.9. В программе использован образующий полином (х16 + х15 + х13 + х4 + 1).

.module/ram/abs=0 qqq;

.entryumn_ab;

{

подпрограмма умножения AR на MR0 по правилам умножения полиномов в расширенных полях Галуа

}

umn_ab: dis ar_sat; ay0 = 0;

af = pass ay0; { обнуление AF для организации накопления } ay1 = 0xa011; { полином = х16 + х15 + х13 + х4 + 1 }

sr0 = 1; { единица в младшем разряде }

se = 1; { шаг сдвига содержимого SR0 для последовательного опроса разрядов множителя MR0 }

{

a * b0 -> AF

}

ay0 = sr0; none = mr0 and ay0; if ne af = pass ar;

{

анализ остальных разрядов множителя

}

 

 

 

cntr = 15;

 

 

doumnojuntilce;

 

 

 

{

 

 

 

переход к следующему разряду множителя

 

}

 

 

 

sr = lshift sr0 (lo),

ay0 = ar;

 

{

 

 

 

умножение на х mod q,

 

 

}

 

 

 

ar = ar + ay0,

ay0 = sr0;

 

if ac ar = arxor ay1;

 

 

{

 

 

 

если bi = 1, накопление

 

 

}

 

 

 

none = mr0 and ay0; if ne af = arxoraf;

umnoj:

nop;

 

 

 

ar = pass af;

 

 

rts;

.endmod;

Рисунок 2.9 - Вычисление (a * b) mod (х16 + х15 + х13 + х4 + 1)

Операнды а и b должны быть записаны, соответственно, в регистры AR и MR0. Произведение сбудет в результате выполнения программы записано в регистр AR.

28

2.3.5 Возведение в степень

Возведение в степень является одной из наиболее часто используемых в криптографии математических операций. Функцию возведения в степень принято рассматривать как одностороннюю, поскольку вычисление обратной функции – дискретного логарифма – вызывает значительные трудности. На основе этой функции строятся многие двухключевые алгоритмы – такие как RSA, алгоритм Эль-Гамаля, алгоритм распространения ключей Диффи-Хеллмана и др.

Вобщем виде возведение в степень m соответствует (m – 1) - кратному повторению операции умножения, рассмотренной в предшествующем подразделе. Однако, как было показано ранее в разделе 1, более рациональной

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

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

Разложение по степеням двойки показателя степени в совокупности с использованием табличных операций открывает возможность дальнейшего снижения объема вычислений в расширенных полях Галуа. Для этого может быть использовано полезное свойство степени полинома, кратной степени основания системы счисления:

(a)p = (a n – 1 * xn – 1 + a n – 2 * xn – 2 + ... + a 1 * x1 + a 0 * x0 ) р =

(2.1)

= a n – 1 * x(n – 1) * p + a n – 2 * x(n – 2) * p + ... + a 1 * xp + a 0 * x0 ,

где р = 2k, k – любое целое число.

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

Используя свойства операции mod q, в целях повышения скорости выполнения операции возведения в степень представляется целесообразной

29

предварительная подготовка таблиц предполагаемых к использованию степеней всех битов операнда по модулю образующего полинома ( xi mod q ). Размер каждой такой таблицы будет определяться разрядностью полинома q. Если степень полинома q равна n, то каждая таблица будет содержать n строк по n двоичных разрядов.

Формирование таблиц может быть выполнено в основной программе, например, в соответствии с блок-схемой алгоритма рисунка 2.10. Вычисляются значения Yi = xi* p для i от 0 до (n – 1), где p = 2k, и заносятся в таблицу MY, содержащую n строк по n двоичных разрядов.

Рисунок 2.10 - Блок-схема алгоритма формирования таблицы для возведения в степень

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]