Реализация базовых операций защиты информации на сигнальных процессорах. Часть 2. Учебное пособие
.pdfОбозначим символы любой из полученных после разбиения восьми гексад как 1 2 3 4 5 6. Крайние биты каждой гексады, т.е. 1 6, могут принимать четыре значения, а средние ( 2 3 4 5) – 16. Крайние биты играют роль параметра, задающего номер строки, а средние определяют номер столбца в таблице подстановок S1..S8 (S-box Substitution). Определенные стандартом таблицы подстановок S1..S8 приведены в таблицах 3.2 – 3.9 в шестнадцатеричной системе счисления.
|
S1 |
|
|
|
|
|
|
|
|
|
|
|
Таблица 3.2 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Е |
4 |
|
D |
1 |
2 |
F |
B |
8 |
3 |
A |
6 |
C |
5 |
9 |
0 |
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
F |
|
7 |
4 |
E |
2 |
D |
1 |
A |
6 |
C |
B |
9 |
5 |
3 |
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
1 |
|
E |
8 |
D |
6 |
2 |
B |
F |
C |
9 |
7 |
3 |
A |
5 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F |
C |
|
8 |
2 |
4 |
9 |
1 |
7 |
5 |
B |
3 |
E |
A |
0 |
6 |
D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S2 |
|
|
|
|
|
|
|
|
|
|
|
Таблица 3.3 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F |
1 |
|
8 |
E |
6 |
B |
3 |
4 |
9 |
7 |
2 |
D |
C |
0 |
5 |
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
D |
|
4 |
7 |
F |
2 |
8 |
E |
C |
0 |
1 |
A |
6 |
9 |
B |
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
E |
|
7 |
B |
A |
4 |
D |
1 |
5 |
8 |
C |
6 |
9 |
3 |
2 |
F |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
8 |
|
A |
1 |
3 |
F |
4 |
2 |
B |
6 |
7 |
C |
0 |
5 |
E |
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S3 |
|
|
|
|
|
|
|
|
|
|
|
Таблица 3.4 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A |
0 |
|
9 |
E |
6 |
3 |
F |
5 |
1 |
D |
C |
7 |
B |
4 |
2 |
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
7 |
|
0 |
9 |
3 |
4 |
6 |
A |
2 |
8 |
5 |
E |
C |
B |
F |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
6 |
|
4 |
9 |
8 |
F |
3 |
0 |
B |
1 |
2 |
C |
5 |
A |
E |
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
A |
D |
0 |
6 |
9 |
8 |
7 |
4 |
F |
E |
3 |
B |
5 |
2 |
C |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S4 |
|
|
|
|
|
|
|
|
|
|
|
Таблица 3.5 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
D |
E |
3 |
0 |
6 |
9 |
A |
1 |
2 |
8 |
5 |
B |
C |
4 |
F |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
8 |
|
B |
5 |
6 |
F |
0 |
3 |
4 |
7 |
2 |
C |
1 |
A |
E |
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A |
6 |
|
9 |
0 |
C |
B |
7 |
D |
F |
1 |
3 |
E |
5 |
2 |
8 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
F |
|
0 |
6 |
A |
1 |
D |
8 |
9 |
4 |
5 |
B |
C |
7 |
2 |
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S5 |
|
|
|
|
|
|
|
|
|
|
|
Таблица 3.6 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
C |
|
4 |
1 |
7 |
A |
B |
6 |
8 |
5 |
3 |
F |
D |
0 |
E |
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
E |
B |
|
2 |
C |
4 |
7 |
D |
1 |
5 |
0 |
F |
A |
3 |
9 |
8 |
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
2 |
|
1 |
B |
A |
D |
7 |
8 |
F |
9 |
C |
5 |
6 |
3 |
0 |
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B |
8 |
|
C |
7 |
1 |
E |
2 |
D |
6 |
F |
0 |
9 |
A |
4 |
5 |
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31
|
S6 |
|
|
|
|
|
|
|
|
|
|
|
Таблица 3.7 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
1 |
|
A |
F |
9 |
2 |
6 |
8 |
0 |
D |
3 |
4 |
E |
7 |
5 |
B |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A |
F |
|
4 |
2 |
7 |
C |
9 |
5 |
6 |
1 |
D |
E |
0 |
B |
3 |
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
E |
|
F |
5 |
2 |
8 |
C |
3 |
7 |
0 |
4 |
A |
1 |
D |
B |
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
3 |
|
2 |
C |
9 |
5 |
F |
A |
B |
E |
1 |
7 |
6 |
0 |
8 |
D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S7 |
|
|
|
|
|
|
|
|
|
|
|
Таблица 3.8 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
B |
|
2 |
E |
F |
0 |
8 |
D |
3 |
C |
9 |
7 |
5 |
A |
6 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
0 |
|
B |
7 |
4 |
9 |
1 |
A |
E |
3 |
5 |
C |
2 |
F |
8 |
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
4 |
|
B |
D |
C |
3 |
7 |
E |
A |
F |
6 |
8 |
0 |
5 |
9 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
B |
D |
8 |
1 |
4 |
A |
7 |
9 |
5 |
0 |
F |
E |
2 |
3 |
C |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S8 |
|
|
|
|
|
|
|
|
|
|
|
Таблица 3.9 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
2 |
|
8 |
4 |
6 |
F |
B |
1 |
A |
9 |
3 |
E |
5 |
0 |
C |
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
F |
D |
8 |
A |
3 |
7 |
4 |
C |
5 |
6 |
B |
0 |
E |
9 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
B |
|
4 |
1 |
9 |
C |
E |
2 |
0 |
6 |
A |
D |
F |
3 |
5 |
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
1 |
|
E |
7 |
4 |
A |
8 |
D |
F |
C |
9 |
0 |
3 |
6 |
5 |
B |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Пусть, например, первая гексада имеет в двоичной системе счисления вид: 1101112. Средние символы 10112 в десятичной записи изображают число 11 – номер столбца таблицы, а крайние символы представляют число 3 – номер строки таблицы (напоминаем, что нумерация строк и столбцов начинается с нуля!). На их пересечении в таблице S1 находится число Е, двоичная запись которого есть 11102. Таким образом, после подстановки вместо первой гексады используется тетрада 1110.
Наиболее естественной реализацией S – подстановок является представление ящиков S1…S8 как элементов памяти с организацией 26*4 бита. Такие ящики могут быть программно организованы как массивы (на всякий случай кольцевые) размером 64 ячейки памяти.
Для обеспечения возможности линейного доступа к элементам при записи в ячейки массив таблицы подстановок должны быть перестроены под линейный порядок следования адресов. В качестве примера в таблице 3.10 рассмотрено перестроение таблицы S1, при этом строки нумеруются от 0 до 3, а столбцы – от 0 до 15. Поскольку таблицы S – подстановок внесены в стандарт DES и не подлежат изменению, целесообразно их размещение в загрузочном кристалле процессора и запись в память данных с помощью псевдоинструкции ассемблера .init в соответствии с программой рис. 3.8.
32
Таблица 3.10
|
линейный порядок |
|
|
номер строки |
|
|
|
номер столбца |
|
|
эл-т S |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
1 |
|
6 |
|
|
2 |
3 |
|
4 |
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
0 |
= |
0 |
0 |
0 |
|
0 |
0 |
= |
0 |
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
0 |
0 |
0 |
1 |
0 |
|
1 |
= |
1 |
0 |
0 |
|
0 |
0 |
= |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
0 |
0 |
1 |
0 |
0 |
|
0 |
= |
0 |
0 |
0 |
|
0 |
1 |
= |
1 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
0 |
0 |
1 |
1 |
0 |
|
1 |
= |
1 |
0 |
0 |
|
0 |
1 |
= |
1 |
F |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
0 |
1 |
0 |
0 |
0 |
|
0 |
= |
0 |
0 |
0 |
|
1 |
0 |
= |
2 |
D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
0 |
1 |
0 |
1 |
0 |
|
1 |
= |
1 |
0 |
0 |
|
1 |
0 |
= |
2 |
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
0 |
1 |
1 |
0 |
0 |
|
0 |
= |
0 |
0 |
0 |
|
1 |
1 |
= |
3 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
0 |
1 |
1 |
1 |
0 |
|
1 |
= |
1 |
0 |
0 |
|
1 |
1 |
= |
3 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
1 |
0 |
0 |
0 |
0 |
|
0 |
= |
0 |
0 |
1 |
|
0 |
0 |
= |
4 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. |
. |
. |
. |
. |
. |
. |
|
. |
. |
. |
. |
. |
|
. |
. |
. |
. |
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
1 |
1 |
0 |
1 |
0 |
1 |
|
0 |
= |
2 |
1 |
1 |
|
0 |
1 |
= 13 |
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
1 |
1 |
0 |
1 |
1 |
1 |
|
1 |
= |
3 |
1 |
1 |
|
0 |
1 |
= 13 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
1 |
1 |
1 |
0 |
0 |
1 |
|
0 |
= |
2 |
1 |
1 |
|
1 |
0 |
= 14 |
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
1 |
1 |
1 |
0 |
1 |
1 |
|
1 |
= |
3 |
1 |
1 |
|
1 |
0 |
= 14 |
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
1 |
1 |
1 |
1 |
0 |
1 |
|
0 |
= |
2 |
1 |
1 |
|
1 |
1 |
= 15 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|
1 |
= |
3 |
1 |
1 |
|
1 |
1 |
= 15 |
D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
При организации линейного порядка обращения к элементам S – таблиц разбиение входного блока на гексады может быть выполнено в сдвигателе, а само обращение - с использованием режима косвенной поставтомодифицирующей адресации. Для хранения промежуточных результатов – выходных комбинаций подстановок S1…S8 – целесообразно использовать буфер buf_int на 8 ячеек памяти. Рассмотрим далее пример реализации S - подстановки на базе процессора ADSP-2181 в виде программы на языке ассемблера. Пусть на момент начала работы программы входная 48-разрядная входная комбинация S – подстановки размещена в регистрах MR1, MR0 и AR (в соответствии с результатом ранее рассмотренного примера реализации расширяющей подстановки). Согласно алгоритму DES, эта комбинация должна быть разбита на гексады в соответствии с рис. 3.4 для адресации каждого из массивов S1…S8, причем границы двух гексад будут размещены в разных регистрах исходной комбинации. Для адресации массивов S1…S8 используются регистры I2 и М2, запись/чтение промежуточных данных – выходных комбинаций S1…S8 – в/из буфера buf_int осуществляется под управлением регистра I1.
Выходная 32разрядная комбинация должна быть сформирована в регистрах SR1 (левая часть) и SR0 (правая).
Текст программы на языке ассемблера процессора ADSP-2181 представлен на рис. 3.8 с необходимыми комментариями.
33
{**********************************************************
Этот кусок следует разместить вначале в основной программе
---------------------------------------------------------- |
|
|
|
|
|
|
|
} |
.var/dm/circ |
buf_int[8]; |
|
|
|
|
|||
{ |
|
|
|
|
|
|
|
|
Инициализация S - ящиков |
|
|
|
|
||||
} |
|
|
|
|
|
|
|
|
.var/dm |
s1[64]; |
|
|
|
|
|
|
|
.init |
s1: |
0xe, 0x0, 0x4, 0xf, 0xd, 0x7, 0x1, 0x4, |
||||||
|
0x2, 0xe, 0xf, 0x2, 0xb, 0xd, 0x8, 0x1, |
|||||||
|
0x3, 0xa, 0xa, 0x6, 0x6, 0xc, 0xc, 0xb, |
|||||||
|
0x5, |
0x9, |
0x9, |
0x5, |
0x0, |
0x3, |
0x7, |
0x8, |
|
0x4, 0xf, 0x1, 0xc, 0xe, 0x8, 0x8, 0x2, |
|||||||
|
0xd, 0x4, 0x6, 0x9, 0x2, 0x1, 0xb, 0x7, |
|||||||
|
0xf, 0x5, 0xc, 0xb, 0x9, 0x3, 0x7, 0xe, |
|||||||
|
0x3, 0xa, 0xa, 0x0, 0x5, 0x6, 0x0, 0xd; |
|||||||
.var/dm |
s2[64]; |
|
|
|
|
|
|
|
.init |
s2: |
0xf, 0x3, 0x1, 0xd, 0x8, 0x4, 0xe, 0x7, |
||||||
|
0x6, 0xf, 0xb, 0x2, 0x3, 0x8, 0x4, 0xe, |
|||||||
|
0x9, 0xc, 0x7, 0x0, 0x2, 0x1, 0xd, 0xa, |
|||||||
|
0xc, 0x6, 0x0, 0x9, 0x5, 0xb, 0xa, 0x5, |
|||||||
|
0x0, 0xd, 0xe, 0x8, 0x7, 0xa, 0xb, 0x1, |
|||||||
|
0xa, 0x3, 0x4, 0xf, 0xd, 0x4, 0x1, 0x2, |
|||||||
|
0x5, 0xb, 0x8, 0x6, 0xc, 0x7, 0x6, 0xc, |
|||||||
|
0x9, 0x0, 0x3, 0x5, 0x2, 0xe, 0xf, 0x9; |
|||||||
.var/dm |
s3[64]; |
|
|
|
|
|
|
|
.init |
s3: |
0xa, 0xd, 0x0, 0x7, 0x9, 0x0, 0xe, 0x9, |
||||||
0x6, 0x3, 0x3, 0x4, 0xf, 0x6, 0x5, 0xa, 0x1, 0x2, 0xd, 0x8, 0xc, 0x5, 0x7, 0xe, 0xb, 0xc, 0x4, 0xb, 0x2, 0xf, 0x8, 0x1, 0xd, 0x1, 0x6, 0xa, 0x4, 0xd, 0x9, 0x0, 0x8, 0x6, 0xf, 0x9, 0x3, 0x8, 0x0, 0x7, 0xb, 0x4, 0x1, 0xf, 0x2, 0xe, 0xc, 0x3, 0x5, 0xb, 0xa, 0x5, 0xe, 0x2, 0x7, 0xc;
Рисунок 3.8 начало
34
.var/dm |
s4[64]; |
|
|
|
|
|
|
|
.init |
s4: |
0x7, 0xd, 0xd, 0x8, 0xe, 0xb, 0x3, 0x5, |
||||||
|
0x0, 0x6, 0x6, 0xf, 0x9, 0x0, 0xa, 0x3, |
|||||||
|
0x1, |
0x4, |
0x2, |
0x7, |
0x8, |
0x2, |
0x5, |
0xc, |
|
0xb, 0x1, 0xc, 0xa, 0x4, 0xe, 0xf, 0x9, |
|||||||
|
0xa, 0x3, 0x6, 0xf, 0x9, 0x0, 0x0, 0x6, |
|||||||
|
0xc, 0xa, 0xb, 0x1, 0x7, 0xd, 0xd, 0x8, |
|||||||
|
0xf, 0x9, 0x1, 0x4, 0x3, 0x5, 0xe, 0xb, |
|||||||
|
0x5, 0xc, 0x2, 0x7, 0x8, 0x2, 0x4, 0xe; |
|||||||
.var/dm |
s5[64]; |
|
|
|
|
|
|
|
.init |
s5: |
0x2, 0xe, 0xc, 0xb, 0x4, 0x2, 0x1, 0xc, |
||||||
|
0x7, 0x4, 0xa, 0x7, 0xb, 0xd, 0x6, 0x1, |
|||||||
|
0x8, 0x5, 0x5, 0x0, 0x3, 0xf, 0xf, 0xa, |
|||||||
|
0xd, 0x3, 0x0, 0x9, 0xe, 0x8, 0x9, 0x6, |
|||||||
|
0x4, 0xb, 0x2, 0x8, 0x1, 0xc, 0xb, 0x7, |
|||||||
|
0xa, 0x1, 0xd, 0xe, 0x7, 0x2, 0x8, 0xd, |
|||||||
|
0xf, 0x6, 0x9, 0xf, 0xc, 0x0, 0x5, 0x9, |
|||||||
|
0x6, 0xa, 0x3, 0x4, 0x0, 0x5, 0xe, 0x3; |
|||||||
.var/dm |
s6[64]; |
|
|
|
|
|
|
|
.init |
s6: |
0xc, 0xa, 0x1, 0xf, 0xa, 0x4, 0xf, 0x2, |
||||||
|
0x9, 0x7, 0x2, 0xc, 0x6, 0x9, 0x8, 0x5, |
|||||||
|
0x0, 0x6, 0xd, 0x1, 0x3, 0xd, 0x4, 0xe, |
|||||||
|
0xe, 0x0, 0x7, 0xb, 0x5, 0x3, 0xb, 0x8, |
|||||||
|
0x9, 0x4, 0xe, 0x3, 0xf, 0x2, 0x5, 0xc, |
|||||||
|
0x2, 0x9, 0x8, 0x5, 0xc, 0xf, 0x3, 0xa, |
|||||||
|
0x7, 0xb, 0x0, 0xe, 0x4, 0x1, 0xa, 0x7, |
|||||||
|
0x1, 0x6, 0xd, 0x0, 0xb, 0x8, 0x6, 0xd; |
|||||||
.var/dm |
s7[64]; |
|
|
|
|
|
|
|
.init |
s7: |
0x4, 0xd, 0xb, 0x0, 0x2, 0xb, 0xe, 0x7, |
||||||
|
0xf, 0x4, 0x0, 0x9, 0x8, 0x1, 0xd, 0xa, |
|||||||
|
0x3, 0xe, 0xc, 0x3, 0x9, 0x5, 0x7, 0xc, |
|||||||
0x5, 0x2, 0xa, 0xf, 0x6, 0x8, 0x1, 0x6, 0x1, 0x6, 0x4, 0xb, 0xb, 0xd, 0xd, 0x8, 0xc, 0x1, 0x3, 0x4, 0x7, 0xa, 0xe, 0x7, 0xa, 0x9, 0xf, 0x5, 0x6, 0x0, 0x8, 0xf, 0x0, 0xe, 0x5, 0x2, 0x9, 0x3, 0x2, 0xc;
Рисунок 3.8 продолжение
35
.var/dm |
s8[64]; |
|
|
|
|
|
|
|
.init |
s8: |
0xd, 0x1, 0x2, 0xf, 0x8, 0xd, 0x4, 0x8, |
||||||
|
0x6, 0xa, 0xf, 0x3, 0xb, 0x7, 0x1, 0x4, |
|||||||
|
0xa, 0xc, 0x9, 0x5, 0x3, 0x6, 0xe, 0xb, |
|||||||
|
0x5, 0x0, 0x0, 0xe, 0xc, 0x9, 0x7, 0x2, |
|||||||
|
0x7, 0x2, 0xb, 0x1, 0x4, 0xe, 0x1, 0x7, |
|||||||
|
0x9, 0x4, 0xc, 0xa, 0xe, 0x8, 0x2, 0xd, |
|||||||
|
0x0, 0xf, 0x6, 0xc, 0xa, 0x9, 0xd, 0x0, |
|||||||
|
0xf, |
0x3, |
0x3, |
0x6, |
0x5, |
0x5, |
0x8, |
0xb; |
{----------------------------------------------------
*******************************************************}
{######################################################
А это уже программа S – подстановок
#######################################################}
{
Извлечение восьми гексад из содержимого регистров MR1, MR0 и AR и запись их в ячейки буфера buf_int для дальнейшего использования как адресов обращения к ящикам S1..S8.
______________________________________________________
установка указателя I1 на начало буфера промежуточных результатов buf_int:
}
i1 = ^buf_int; l1 = %buf_int; m1 = 1;
{
правая гексада – адрес обращения к ящику S8 – извлечение из младших разрядов регистра AR, обнуление старших разрядов и запись в буфер промежуточных результатов
}
sr = lshift ar by 10 (lo); sr = lshift sr0 by -10 (lo); dm(i1,m1) = sr0;
Рисунок 3.8 продолжение
36
{
следующая гексада - адрес обращения
к ящику S7 - обнуление старших разрядов, позиционирование по месту младших разрядов и запись в буфер промежуточных результатов
} |
|
sr = lshift |
ar by 4 (lo); |
sr = lshift |
sr0 by -10 (lo); |
dm(i1,m1) = |
sr0; |
{ |
|
формирование следующей гексады - адреса обращения к ящику S6 - из 2-х младших разрядов регистра MR0 и 4-х старших регистра AR
и запись в буфер промежуточных результатов
} |
|
|
sr = lshift |
mr0 by |
14 (lo); |
sr = lshift |
sr0 by |
-10 (lo); |
sr = sr or lshift ar by -12 (lo); |
||
dm(i1,m1) = |
sr0; |
|
{ |
|
|
Дальнейшие действия аналогичны |
||
} |
|
|
sr = lshift |
mr0 by |
8 (lo); |
sr = lshift |
sr0 by |
-10 (lo); |
dm(i1,m1) = |
sr0; |
|
sr = lshift |
mr0 by |
2 (lo); |
sr = lshift |
sr0 by |
-10 (lo); |
dm(i1,m1) = |
sr0; |
|
sr = lshift |
mr1 by |
12 (lo); |
sr = lshift |
sr0 by |
-10 (lo); |
sr = sr or lshift mr0 by -14 (lo); |
||
dm(i1,m1) = |
sr0; |
|
sr = lshift |
mr1 by |
6 (lo); |
sr = lshift |
sr0 by |
-10 (lo); |
dm(i1,m1) = |
sr0; |
|
sr = lshift |
mr1 by |
-10 (lo); |
dm(i1,m1) = |
sr0; |
|
Рисунок 3.8 продолжение
37
{
_______________________________________________________
Формирование выходной комбинации S - подстановки
врегистрах SR1 SR0
}
l2 = 0;
{
извлечение правой гексады из буфера buf_int, использование ее как адреса обращения к ящику S8
врежиме косвенной поставтомодифицирующей адресации через регистр I2,
извлечение из ящика S8 соответствующей тетрады
и запись ее по месту младших разрядов в регистр SR0
}
i2 = ^s8;
si = dm(i1,m1); m2 = si; modify(i2,m2); sr0 = dm(i2,m1);
{
аналогичное обращение к ящикам S7..S1 и формирование выходной комбинации
врегистрах SR1 SR0
}
i2 = ^s7;
si = dm(i1,m1); m2 = si; modify(i2,m2); si = dm(i2,m1);
sr = sr or lshift si by 4 (lo); i2 = ^s6;
si = dm(i1,m1); m2 = si; modify(i2,m2); si = dm(i2,m1);
sr = sr or lshift si by 8 (lo); i2 = ^s5;
si = dm(i1,m1); m2 = si; modify(i2,m2); si = dm(i2,m1);
sr = sr or lshift si by 12 (lo); i2 = ^s4;
Рисунок 3.8 продолжение
38
si = dm(i1,m1); m2 = si; modify(i2,m2); si = dm(i2,m1);
sr = sr or lshift si by 16 (lo); i2 = ^s3;
si = dm(i1,m1); m2 = si; modify(i2,m2); si = dm(i2,m1);
sr = sr or lshift si by 20 (lo); i2 = ^s2;
si = dm(i1,m1); m2 = si; modify(i2,m2); si = dm(i2,m1);
sr = sr or lshift si by 24 (lo); i2 = ^s1;
si = dm(i1,m1); m2 = si; modify(i2,m2); si = dm(i2,m1);
sr = sr or lshift si by 28 (lo);
Рисунок 3.8 окончание
3.4.3. Операции циклических сдвигов
Операция рассмотренного ранее циклического сдвига влево на 11 разрядов, используемая в рамках криптографического алгоритма ГОСТ 28147–89, выполняется достаточно тривиально с помощью сдвигателя.
Пусть на момент начала работы программы сдвига комбинация размещена в регистрах MR1(левая часть) и MR0(правая).
В результате выполнения трех команд:
sr = lshift mr0 by 11 (lo);
sr = sr or lshift mr1 by 11 (hi); sr = sr or lshift mr1 by -5 (lo);
результат сдвига будет записан в регистры SR1(левая часть) и SR0(правая).
39
СПИСОК ЛИТЕРАТУРЫ
1.Schneier B. Applied Cryptography, second edition: protocols, algorithms, and source code in C (cloth) // J. Wiley & Sons, INC. New York, 1996.
2.ASDP-2100 Family user's manual. Third edition. Analog Devices, inc. Norwood, MA, 1995.
3.Шаврин С.С. Защита информации в многоканальных телекоммуникационных системах. Ч. 1. Защищенные системы связи: Учебное пособие / МТУСИ. - М., 2003.
4.ADSP-2100 Family Assembler tools & simulator manual. Analog Devices, inc. Norwood, MA, 1994.
5.Digital signal processing applications using the ADSP-2100 Family. Volume 1. Prentice Hall, Englewood Cliffs, NJ 07632.
6.NIST SP 800-131A, "Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths", Jan 2011.
7.RFC 4357. Additional Cryptographic Algorithms for Use with GOST 28147-89, GOST R 34.10-94, GOST R 34.10-2001, and GOST R 34.11-94 Algorithms. 2006.
8.Jaffe, J., Cassotta, L., and Feldstein, S. Markovian model of time patterns of speech. Science (New Series) 144, 3620 (May 1964), 884–886. doi:10.1126/science.144.3620.884.
9.Шаврин С.С., Климов Д.А. Реализация базовых операций защиты информации на сигнальных процессорах. Ч.1: Учебное пособие /
МТУСИ. – М., 2012.
40
