Реализация базовых операций защиты информации на сигнальных процессорах. Ч. 3. Учебное пособие
.pdfразлагаемый на простые множители, подобен простому числу; это свойство неприводимого полинома обеспечивает обратимость модульных операций. В общем виде свойство неприводимости полинома над полем можно проверить его делением на полиномы более низких степеней: остаток от деления при этом не должен обращаться в 0. Удобство использования тринома вида ( хn + х + 1 ) при больших значениях степени n заключается в наличии длинной последовательности нулей в слове, соответствующем триному, между старшим и первым разрядами, что, как будет показано далее, во многих случаях упрощает реализацию обработки.
Действия над элементами поля GF(pn) выполняются поразрядно по модулю р в пределах разряда без переносов между разрядами. Применительно к полям GF(2n), использующим фактически двоичную систему счисления и поэтому представляющим наибольший интерес в технике криптографии, это означает, что действия выполняются поразрядно по модулю два:
хm + хm = 0; |
|
хm + хm + хm = хm; |
(1.2) |
- хm = хm. |
|
Таким образом, операции сложения и вычитания в расширенных полях Галуа GF(2n) реализуются операцией «исключающее ИЛИ», не приводят к расширению разрядной сетки и если операнды являются элементами поля, то не требуют применения операции вычисления остатка от деления на образующий полином по отношению к результату операции.
Операция mod ( хn + х + 1 ) осуществляется как вычисление остатка от деления на полином ( хn + х + 1 ) по правилам действий над полиномами.
Пусть, например, необходимо вычислить произведение чисел 17 и 50 по модулю ( х6 + х + 1 ) в поле GF( 26 ). Для решения задачи необходимо:
1) |
представить числа в виде полиномов |
||||
|
17 = 24 + 20 |
=> х4 + 1 |
|||
|
50 = 25 + 24 + 21 |
=> х5 + х4 + х ; |
|||
2) |
вычислить произведение полиномов |
||||
|
(х4 + 1) * (х5 + х4 + х) = х9 + х8 + х5 + х5 + х4 + х = х9 + х8 + х4 + х ; |
||||
3) |
разделить полученный полином на ( х6 + х + 1 ) |
||||
|
х9 + х8 + х4 |
|
|
||
|
+ х |
x6 + х +1 |
|
||
|
х9 |
+ х4 + х3 |
|
х3 + х2 – частное |
|
|
х8 |
+ х3 |
|
+ х |
|
|
х8 |
+ х3 |
+ х2 |
|
|
|
|
|
х2 |
+ х – остаток => Ответ: 6; |
|
11
4) вычисленный остаток представить в форме числа х2 + х => 22 + 21 = 6, т.е. искомое произведение равно 6.
При построении расширенных полей Галуа часто используется понятие генератора над полем – примитивного элемента поля, под которым понимается такой элемент (полином), степени которого различны и образуют все элементы поля, за исключением нулевого. Используемый для построения поля GF(2n) примитивный элемент называется порождающим элементом поля.
Для построения поля GF(24) может быть использован, например, полином х1, который является примитивным (в отличие, например, от полинома х4 + х3 + х2 + х + 1); поле, порожденное элементом х1, представлено
втаблице 1.4.
Втаблице 1.4 в первой колонке приведены степени полинома х1 от (х1)1 до (х1)16, а во второй – показатели соответствующих степеней. В колонке «Полином» таблицы представлены остатки от деления (х1)Z на неприводимый трином (х4 + х + 1) в соответствии с ранее описанными правилами, а в колонках «Двоичное число» и «Число» – различные численные представления полинома.
По приведенным в таблице 1.4 данным видно, что ненулевые элементы поля составляют циклическую группу порядка 15 (это положение, вообще говоря, строго доказуемо); это означает что
х Z = х k * 15 + Z , |
где k – любое число. |
Таблица 1.4 иллюстрирует табличный способ вычислений в полях GF(24). При сложении и вычитании элементов удобно использовать их представление в виде полиномов.
Например, сумма чисел ( 5 + 14 ) mod ( х4 + х + 1) = 11:
5 + 14 => |
(х2+1) + (х3+ х2+х) = х2 +1+ х3+ х2 + х = х3+х +1 |
=> 11 |
|
|||||
|
|
|
|
|
|
|
|
|
колонка 5 |
|
колонка 3 |
|
колонка 3 |
|
колонка 5 |
||
«Число» |
«Полином» |
«Полином» |
«Число» |
|||||
При других видах вычислений удобнее пользоваться логарифмическим представлением:
• вычисление произведения ( 5 * 14 ) mod ( х4 + х + 1) = 3:
5 * 14 => ( х8 ) * ( х11 ) = x19 = x4 + х15 = х4 |
=> |
3 |
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
колонка 5 |
|
колонка 1 |
|
колонка 1 |
|
колонка 5 |
|
|
|
|||||||||
«Число» |
«Степень» |
|
«Степень» |
|
«Число» |
|
|
|
||||||||||
• вычисление обратного элемента |
7 – 1 mod ( х4 + х + 1) = 6: |
|
|
|
||||||||||||||
7– 1 |
|
=> (х10) – 1 = х– 10 = 1 * х– 10 = (х15) * (х– 10) = х15 – 10 = х5 |
=> |
6 |
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
колонка 5 |
|
|
колонка 1 |
колонка 5 |
колонка 1 |
|
колонка 1 |
колонка 5 |
||||||||||
«Число» |
|
|
«Степень» |
«Число» |
«Степень» |
|
«Степень» |
«Число» |
|
|||||||||
12
|
|
|
|
|
|
|
|
mod ( х4 + х + 1) = 7: |
|
|
|
|
|
|
||||||
|
|
• вычисление корня |
|
|
6 |
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
6 = 61/2 |
=> (x5)1/2 = |
(1*x5)1/2 = (x15+5)1/2 = (x20)1/2 = |
x10 |
|
=> |
|
|
7 |
|||||||||||
|
|
колонка 5 |
|
колонка 1 |
колонка 5 |
колонка 1 |
|
|
колонка 1 |
колонка 5 |
||||||||||
|
|
«Число» |
|
«Степень» |
|
«Число» |
«Степень» |
|
|
«Степень» «Число» |
||||||||||
|
|
|
Таблица 1.4 - Поле GF(24), порожденное примитивным элементом х1 |
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Степень |
|
Логарифм |
|
|
|
Полином |
|
|
Двоичное |
|
Число |
|
|
||||||
|
|
|
|
|
|
|
число |
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
2 |
|
3 |
|
|
4 |
|
5 |
|
|
|
|
||||||
|
0 = x– ∞ |
|
– ∞ |
|
0 |
|
|
0000 |
|
0 |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
1 = x0 |
|
0 |
|
1 |
|
|
0001 |
|
1 |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x1 |
|
1 |
|
|
|
|
|
х |
|
|
0010 |
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x2 |
|
2 |
|
|
|
|
|
x2 |
|
|
0100 |
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x3 |
|
3 |
|
|
|
|
|
x3 |
|
|
1000 |
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x4 |
|
4 |
|
|
|
|
|
х + 1 |
|
|
0011 |
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x5 |
|
5 |
|
|
|
|
|
x2+ х |
|
|
0110 |
|
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x6 |
|
6 |
|
|
|
|
|
x3+ x2 |
|
|
1100 |
|
12 |
|
|
|
|
|
|
|
x7 |
|
7 |
|
|
|
|
x3 + х + 1 |
|
|
1011 |
|
11 |
|
|
|
|
||
|
|
x8 |
|
8 |
|
|
|
|
|
x2+ 1 |
|
|
0101 |
|
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x9 |
|
9 |
|
|
|
|
|
x3 + х |
|
|
1010 |
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
x10 |
|
10 |
|
|
|
|
x2+ х + 1 |
|
|
0111 |
|
7 |
|
|
|
|
||
|
|
x11 |
|
11 |
|
|
|
x3 + x2+ х |
|
|
1110 |
|
14 |
|
|
|
|
|||
|
|
x12 |
|
12 |
|
|
x3 + x2+ х+1 |
|
1111 |
|
15 |
|
|
|
|
|||||
|
|
x13 |
|
13 |
|
|
|
x3 + x2+ 1 |
|
|
1101 |
|
13 |
|
|
|
|
|||
|
|
x14 |
|
14 |
|
|
|
|
|
x3 + 1 |
|
|
1001 |
|
9 |
|
|
|
|
|
|
|
x15 |
|
15 |
|
1 |
|
|
0001 |
|
1 |
|
|
|
|
|||||
|
|
x16 |
|
16 |
|
|
|
|
|
х |
|
|
0010 |
|
2 |
|
|
|
|
|
13
2. РЕАЛИЗАЦИЯ БАЗОВЫХ МАТЕМАТИЧЕСКИХ ОПЕРАЦИЙ, ИСПОЛЬЗУЕМЫХ В КРИПТОГРАФИЧЕСКИХ АЛГОРИТМАХ
2.1 РЕАЛИЗАЦИЯ МОДУЛЬНЫХ ОПЕРАЦИЙ И ДЕЙСТВИЙ В ПРОСТЫХ ПОЛЯХ ГАЛУА
2.1.1 Вычисление остатка от деления (операция modn)
Средствами процессора ADSP-2181 вычисление остатка от деления 32-разрядного целого беззнакового числа на аналогичное по формату 16-разрядное может быть выполнено с помощью подпрограммы, текст которой приведен на рисунке 2.1 (преобразовано из описанного в [ 4; 5 ]).
.module/ram |
delenie; |
|
|
.entry |
|
delen; |
|
|
{ |
|
|
|
подпрограмма вычисления остатка от деления |
||
|
32-разрядного числа из AY1 AY0 |
||
|
на 16-разрядное из AX0; возвращает: |
||
|
частное - в AR, остаток - в MR0 |
||
|
признак невозможности деления - AV |
||
|
попутно портит содержимое AX1 AF MR1 MR2 MY0 |
||
|
} |
|
|
delen: |
mr0 = ay0, |
af = pass ay1; |
|
|
mr1 = ay1, |
ar = pass ax0; |
|
ifgt jump tttt;
llll:astat = 4; rts;
tttt:ar = ay1 - ax0; ifge jump llll; astat = 0;
divq ax0; divq ax0; divq ax0; divq ax0; divq ax0; divq ax0; divq ax0; divq ax0; divq ax0; divq ax0; divq ax0; divq ax0; divq ax0; divq ax0; divq ax0; divq ax0;
mr2 = 0;
my0 = ax0, ar = pass ay0; mr = mr - ar * my0 (uu); rts;
.endmod;
Рисунок 2.1 - Вычисление остатка от деления
Делимое должно быть записано в регистры AY1 (старшие разряды) и AY0 (младшие), делитель – в AX0.
В результате выполнения подпрограмма возвращает значение частного в AR и остатка от деления в регистр MR0; в процессе выполнения изменяется
14
содержимое регистров AX1, AF, MY0, MR1, MR2. В случае невозможности деления (делимое меньше делителя) устанавливается флаг AV, в этом случае остаток от деления определяется значением младших разрядов делимого, записанным в AY0.
2.1.2 Конгруэнтный линейный генератор
Генерация псевдослучайных чисел по рекуррентной конгруэнтной процедуре осуществляется в соответствии с выражением:
xi = f ( xi – 1 , xi – 2 , … , xi – n),
где х – число заданной разрядности.
Генерация псевдослучайных чисел (ПСЧ) с использованием конгруэнтной процедуры имеет периодический характер.
Формально выражение для вычисления очередного значения ПСЧ совпадает с выражением, используемым для численного решения уравнений по алгоритму x = f (x) , совпадают также и вычислительные процедуры. С этой точки зрения особую важность имеет вопрос о правильном выборе функции f и входящих в нее параметров, поскольку их неправильный выбор приводит не к уменьшению периода последовательности ПСЧ, а к его полной остановке. Генерация последовательности ПСЧ прекратится, если уравнение f (x) – x = 0 имеет решение; в этом случае в результате каждого шага вычислений будет формироваться одно и то же число, являющееся корнем уравнения.
Линейный конгруэнтный генератор использует для вычисления очередного значения ПСЧ выражение:
xi = (A * xi – 1 + B) mod m.
В отличие от генераторов ПСП, нулевая комбинация х не является запрещенной для конгруэнтных генераторов. Период генерации не превышает m, последовательность ПСЧ максимальной длины определяется выбором чисел А и В для требуемого значения m. Рекомендации по выбору чисел А и В представлены в [ 6 ].
Рассмотрим в качестве примера реализацию на базе процессора ADSP2181 линейного конгруэнтного генератора с параметрами наиболее удобными для реализации в двоичной системе счисления вследствие кратности ей значения m:
А = 1664525 = 0х19660D
B = 32767 = 0x7FFF m = 2 32.
Такой генератор будет обеспечивать последовательность 32-разрядных ПСЧ (и ПСЧ меньшей разрядности) с периодом 2 32[ 6 ].
15
В рассмотренном примере множитель А представляет собой 24-разрядное число, для его хранения используются два регистра МY1 (старшие разряды) и МY0 (младшие). Слагаемое В может быть представлено в 16-разрядной сетке как целое без знака, его значение заносится в регистр MR0 и суммируется с младшими разрядами произведения.
Генерируемое число хранится и обновляется в регистрах SR1 (старшие разряды) и SR0 (младшие). 32-разрядное произведение вычисляется как сумма произведения младших 16-разрядных слов и двух произведений младшего слова одного множителя на старшее слово другого множителя.
Текст программы, реализующей генератор, представлен на рисунке 2.2.
.module/ram/abs=0 qqq;
{
множительА
}
my1 = 0x19; my0 = 0x660d;
{
начальный вброс
}
sr0 = 0x1234; sr1 = 0xabcd;
enam_mode; { режим целочисленного умножения }
{
генератор
}
do gen until forever;
{
произведение младших слов на старшие
}
mr = sr0 * my1 (uu); mr = mr + sr1 * my0 (uu);
{
перемещение в сторону старших разрядов и добавление к сумме произведений слагаемогоВ
}
mr1 = mr0; mr0 = 0x7fff;
{
добавление произведения младших слов
}
mr = mr + sr0 * my0 (uu); sr1 = mr1; sr0 = mr0;
{
вывод в файл - сугубо демонстрационный
}
gen: io(0) = sr0;
.endmod;
Рисунок 2.2 - Линейный конгруэнтный генератор ПСЧ
16
2.1.3 Генератор на числах Блюма
Генератор псевдослучайной последовательности (ПСП) на числах Блюма представляет собой еще одну разновидность конгруэнтного генератора. Он относится к нелинейным и в некоторых случаях допускает использование в качестве генератора гаммы шифра [6]. Для его реализации необходимо выбрать два больших простых числа p и q, удовлетворяющих условиям:
p mod 4 = 3, q mod 4 = 3
и вычислить значение
n = p * q.
Далее следует выбрать число x, взаимно простое с числами p и q, и
вычислить
x 0 = x2 mod n.
Псевдослучайная последовательность формируется из младших битов xi, генерируемых рекуррентной процедурой
xi = ( xi – 1 ) 2 mod n.
Числа p, q и x 0 составляют ключ генератора.
Если длина разрядной сетки, необходимой для представления числа (n–1), равна N, то для формирования ПСП могут быть использованы M младших
битов чисел xi:
M = log2 N.
Так, например, для организации (не особенно сложного) генератора ПСП, работающего в 16-разрядной сетке, в качестве p и q могут быть использованы числа:
p = 239 |
=> |
239 mod 4 = 3 |
q = 251 |
=> |
251 mod 4 = 3 |
n = p * q = 59989 = 0xEA55.
В качестве x можно выбрать число, взаимно простое с числами p и q:
x = 65535 = 0xFFFF.
Процедура вычисления xi средствами процессора ADSP-2181 может быть реализована, например, в виде программы, представленной на рисунке 2.3, в которой используется вызов ранее рассмотренной подпрограммы вычисления остатка от деления (см. рис. 2.1).
В генерируемую ПСП могут быть включены четыре младших бита содержимого регистра.
17
.module/ram blum;
.external delen; |
|
|
|
|
|
{ |
|
|
|
|
программа генератора на числах Блюма |
|||
|
} |
|
|
|
|
enam_mode; |
|
|
|
|
{ |
|
|
|
|
начальный вброс |
|
|
|
|
} |
|
|
|
|
mx0 = 0xffff; |
|
mr = mx0 * mx0 (uu); |
|
{ |
|
|
|
|
генератор |
|
|
|
|
} |
|
|
|
|
dogener until forever; |
|
|
||
|
{ |
|
|
|
|
вычисление остатка (х * х)mod n |
|||
|
n = 0xea55 -> AX0, |
(x^2) -> AY1 AY0 |
||
|
} |
|
|
|
|
ay1 = mr1; |
ay0 = mr0; |
ax0 = 0xea55; |
|
|
calldelen; |
|
|
|
|
{ |
|
|
|
|
остаток - в MR0, отсечение |
|
||
|
4-х младших разрядов в SR0 |
|
||
|
} |
|
|
|
|
sr = lshift mr0 by 12 (lo); |
|
||
|
sr = lshift sr0 by -12 (lo); |
|
||
|
{ |
|
|
|
|
вывод в файл - сугубо демонстрационный |
|||
|
} |
|
|
|
|
io(0) = sr0; |
|
|
|
|
{ |
|
|
|
|
возведение в квадрат |
|
||
|
} |
|
|
|
gener: |
mr = mr0 * mr0 (uu); |
|
||
.endmod;
Рисунок 2.3 - Генератор ПСП на числах Блюма
2.2 РЕАЛИЗАЦИЯ ОПЕРАЦИЙ АЛГОРИТМА IDEA
Алгоритм IDEA (International Data Encryption Algorithm – международный алгоритм шифрования информации) принят в качестве международного стандарта криптозащиты информации в 1992 году [ 9 ].
Длина ключа в алгоритме IDEA составляет 128 бит. Алгоритм относится к блочным, длина блока шифруемой (дешифруемой) информации составляет 64 бита. Процедуры шифрования и дешифрования выполняются по одному алгоритму.
18
Алгоритм IDEA использует три группы вычислительных операций, ориентирующих его реализацию на цифровые сигнальные процессоры:
•«исключающее ИЛИ», оно же сложение по модулю два.
•сложение в 16-разрядной сетке по модулю 216.
•умножение в 16-разрядной сетке по модулю (216 + 1) целых 16-разрядных операндов.
Для шифрования исходной информации 64-битный блок разбивается на четыре слова X 1 … X 4 по 16 разрядов каждое.
Формируется 52 16-разрядных ключевых слова КЕ 1 … КЕ 52 . Слова КЕ 1
…КЕ 8 формируются простым разбиением 128-битного ключа К. Затем ключ К сдвигается циклически на 25 разрядов влево и разбивается аналогично,
формируя ключи КЕ 8 … КЕ 16 и т.д.
Ключевые слова КЕ 1 … КЕ 52 и разбиваются на девять групп по шесть слов (с неполной последней группой). Слова при этом нумеруются как Z i
где i = 1…6 – номер слова в группе; j = 1…9 – номер группы.
Производится восемь кругов (раундов) преобразований. Действия в пределах раундов выполняются за девять этапов и иллюстрируются рисунком 2.4.
2.2.1 Сложение
Процедура сложения 16-разрядных операндов по модулю 216 не вызывает проблем при реализации на сигнальных процессорах ADSP-2181; она решается одной командой
ar = ax0 + ay0;
если операнды загружены в регистры ax0 и ay0. Операция modn как таковая не выполняется, ее эквивалентом выступает игнорирование переноса АС.
2.2.2 Умножение по модулю 65537
Умножение по модулю 65537 является наиболее таинственным моментом реализации алгоритма IDEA. Авторы доступных литературных источников [6; 7; 8] стыдливо обходят «неудобные» вопросы, такие, как – каким образом уместить в 16-разрядную сетку 65537 элементов и что делать с семнадцатым разрядом при подключении к 16-разрядным входам смежных узлов.
Некоторыми манипуляциями над [9] сформирована работоспособная программа умножения для использования в алгоритме IDEA; она представлена на рисунке 2.5 в виде подпрограммы на языке ассемблера процессора
ADSP-2181.
19
первый
этап
ещё
семь
этапов
девятый
этап
Рисунок 2.4 - Алгоритм IDEA
MUL_MOD:
mr=mx0*my0 (uu); ay0=mr1; ar=mr0-ay0;
if not ac ar=ar+1;
rts;
Рисунок 2.5 - Подпрограмма умножения по модулю 65537
20
