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

3189

.pdf
Скачиваний:
6
Добавлен:
15.11.2022
Размер:
8.9 Mб
Скачать

End;

 

 

For i:=l to 16 do

 

 

Begin //число сесси1 =16

 

 

For j:=l to 28 do

 

 

Begin

 

 

C28[j]:=K156[j];

// левая половина ключа

D28[j]:=K156[j+28];

//

правая половина ключа

End;

 

 

If i inf1,2,9,16]

 

 

then

 

 

Begin // Для 1,2,9,16 сс.влево сдвиг на 1 бит

А:= С28[1];

 

 

В:= D28[l];

 

 

For j:=l to 27 do

 

 

Begin

 

 

C28[j]:=c28(j+1];

//

сдвиг на 1 бит влево

D28[j]:=D28[j+l];

//

сдвиг на 1 бит влево

End;

С28[28]:=А;

D28[28]:=B; // добавление справа 1 левого бита End;

else Begin

А:= C28[l];

В:= С28[2]; // для остальных сессий сдвиг влево на 2 бита С:= D28[l];

D:= D28[2]; For j:=l to 26 do

Begin C28[j]:=c28[j+2]; D28[j]:=D28[j+2];

End;

C28[28]:=A;

C28[27]:=B;

D28[28]:=C;

D28[27]:=D;

End;

II сборка ключа в 56 бит For j:=l to 28 do

Begin KL56[j]:=C28[j];

K156[j+28]:=D28[j];

End; Forj:=lto48 do

//заполнение ключа с перестановкой по [PC_2[j]] Kil[ij]:=K156[PC_2[j]];

End;

Ввод сообщения для шифрования

Дано слово и двоичный массив 64

//ввод сообщения для шифрования

//вводится строка, переводится в массив кодов

//формируется переменная длиной Int64 Data

//в которую помещается 8 байт слов

//переменная Data переводится в двоичный массив Ь64 st8:-Текст для шифрования=';

st8:-axfgnaqc'; st:- '; data0:=0; Data:=0; For j:=l to 8 do

Begin

B16[j]:=ord(st8[j]);

// заполнение массива кодом

dataO:= В16[j];

// формирование промежуточной перемен­

ной

st:=st+' '+inttostr(bl6[j]); // формирование строки

datal :=(dataO and $FF) shl (64-8*j); // сдвиг влево побайтно data:=data or datal; // формирование общей строки

End;

st:-Двоичное зн. ’;Wr(St); st:- '; For j:=0 to 63 do

bit:=(data shl j) shr (63); //выделение бита, начиная со старшего s1 :=chr(ord('0')+bit); //занесение бита в строку

st:=st+sl; Ь64Ц+1]:=strtoint(s 1);

End;

Перестановка битов согласно массива Ip(j]

For j:=l to 64 do

b641 [j]:=b64[Ip[j]]; st:- ’;wr(St);

s t:- 1- перестановка'; wr(st); wr4(64,b641);

End;

Деление вектора в64 бит на 2 по 32 бита

//после перестановки 64 битов вектор в64 бит

//делится на 2 по 32 бита

For j:=l to 64 do Ifj<=32

then B32L[j]:=b641[j] else B32R[j-32]:=b641 [j];

End;

Цикловое преобразование шифрование

For i:=l to 16 do Begin

For j:=l to 48 do

K148[j]:= Kil[ij]; //Вызов ключа

F(B32R,K148,swap32); //48 вектор разбивается на 8 групп по 6 бит For j:=l to 32 Do

B32[j]:=swap32[j] xor B32L[j];

B32L:=B32R; // правая часть помещается в левую

из

B32R:=B32;

End;

Сборка зашифрованного текста

Дана текстовая переменная

For j:=l to 64 do //собирается 2 полуслова в 32 бит в слово 64 бит Ifj<=32

then b64[j]:=B32R[j] // правая часть else B64[j]:=B32L[j-32]; // левая часть

st:- ’;Wr(St);

st:-После кодирования. wr(st);

wr4(64,b64); // вывод

For j:=l to 64 do //перестановка битов Ь641 [j]:=b64[lnvlp[j]];

st:- ’;wr(St); st:-Таблица 2 wr(st);

wr4(64,b641); // вывод результатов

Символьный зашифрованный текст

Дано байтовые переменные data:=0;

For i:=l to 8 do

Begin // перебор элементов массива

For j:=l to 8 do

 

 

Begin

//

помещение бита

bitl:= B64[j+8*(i-l)];

bit:= bitl and $FF;

//

выделение бита

datal := (bit shl (8-j));

//

сдвиг влево

data:=dataxor datal;

//

сборка слова

datal :=0;

 

 

End;

Дешифрование

 

 

Дано: текстовая переменная, массив

 

For j:=l to 64 do

 

 

b64[j]:=b641[Ip[j]];

// первичная перестановка

For j:=l to 64 do

 

 

//сборка вектора 64 бит из 2 векторов по 32 бита

Ifj<=32

 

 

 

then B32R[j]:=b64[j]

 

 

else B32L[j-32]:=b64[j];

 

For i:=16 downto 1 do

 

 

Begin

// цикловая обработка наоборот

For j:=l to 48 do

 

 

K148[j]:= Kil[ij]; // выбор сессионного ключа

F(B32L,K148,swap32); // Sboxex обработка

For j:=l to 32 do

 

 

B32[j]:=swap32[j] xor B32R[j]; // + по модулю 2

B32R:=B32L;

// смена левой и правой части

B32L:=B32;

// результат обработки в левую часть

For j:=l to 64 do

 

 

Ifj<=32

 

 

 

then b64[j]:=B32L[j] // сборка 2 векторов по 32 бита в 64 бит

 

else B64[j]:=B32R[j-32];

 

For j:=l to 64 do

 

End;

b641 (j]:=b64[lnvlp[j]];

// обратная перестановка

 

 

 

For i:=l to 8 do

 

 

Begin // перебор элементов массива по 8 групп

а:=0;

 

For j:=l to 8 do

// выбор 8 битов в группе

b[9-j]:= b641[j+8*(i-l)];

For j:=0 to 7 do

// формирование числа из 8 битов

А:=А + b[j+l]* round(exp(j*ln(2)));

End;

Вывод текста

st:—

For j:=l to n do Begin

st:=st+inttostr(c[j]); Ifj mod 8=0

then Begin

Form2.Memo 1 .Lines.Add(st);

st:- End;

End;

Деление вектора в 48 бит на 8 групп по 6 бит

Дан вектор 48 бит, массив sboxex Begin

//Для этого используется массив sboxex[l..8,0..3,0.. 15]

//в sboxex 8 групп 4 строки и 16 столбцов

//строки S-бокса нумеруются (0,0),(ОД),(1,00,(1,1)

//столбцы S-бокса нумеруются 4-битовыми двоичными наборами

//номер группы определяет номер строки в S-бокс

//номер строки определяется (х1,х6) битами 6-битовой группе

//номер столбца определяется (х2,хЗ,х4,х6) битами 6-битовой группе

//в процедуру F передается 32-бит. слово-текста и 48-бит. ключ

//результатом процедуры является 32-битовый вектор С

Forj:=l to 48 do

tempi U]:=R[E[j]] xor kl48[j];

//вектор R 32-битовый, вектор К148-битовый

//вектор R преобразуется перестановкой из 32-битного в 48-битный

//два вектора R и вектор ключа К1 складываются по модулю 2

//и формируется 48-битный вектор Tempi

//в Tempi находятся биты

For n:=l to 8 do

i:=(n-l)*6; // переменная для 6-битового набора j:=(n-l)*4; // переменная для 4-битового набора

row:= templ[i+l]*2+templ[i+6];// находится номер строки // для Row нужен 1 и 6 бит и им кратные 1 *2+1*1

//из 1,6 бита сформируется в 10-значное число в пределах 0-3 colomn:=

tempi [i+2]*8+templ [i+3]*4+templ [i+4]*2+templ [i+5];

//для столбца берутся 2,3,4,5 биты и им кратные

//из 2-5 бита сформируется в 10-значное число в пределах 0-15 For h:=l to 4 do

Begin //выделяется 8 групп по 4 бита case h of

l:temp2[j+h]:=(sboxes[n,row,colomn] and 8)div 8; 2:temp2[j+h]:=(sboxes[n,row,colomn] and 4)div 4; 3:temp2[j+h]:=(sboxes[n,row,colonin] and 2)div 2; 4:temp2[j+h]:=(sboxes[n,row,colomn] and 1); End;

End;

End; {n}

//Temp2[j+h] - для N=l-Temp2[l,2,3,4]; для n=2-emp2[5,6,7,8]

//для n=8 - emp2[29,30,31,32] бит

//Sboxes[n,Row,Colomn] - номер Sboxex, строки, столбца

//Sboxes[n,Row,Colomn] - выдает число от 0-15

//AND 8,4,2,1 означает выбор 3, 2,1,0 бит, т.е. 8,4,2,1

//(Sboxes[n,Row,Colomn] and 8)Div 8 - формирует 0 или 1

//и помещает их в соответствующие биты Тешр2

For n:=l to 32 Do Swap32[n]:=Temp2[pp[n]];

//в полученном массиве Тешр2 переставляются биты согласно масси­ ву рр

End;

//

Задание 2. Реализация ГОСТа №28147-89

Студент должен на основании приведенного теоретического ма­ териала составить задание на программирование ГОСТ №28147-89.

Контрольные вопросы

1.Укажите основное отличие блочных шифров от поточных.

2.Как формируется раундовый ключ в алгоритме DES?

3.Каким образом идет расшифровка сообщений, шифрованных

спомощью тройного DES?

4.В чем отличие алгоритма SAFER от его предшественников?

5.Имеет ли смысл повторно шифровать сообщение тем же ал­ горитмом?

6.Объясните суть гаммирования, применяемого в ГОСТ №28147-89.

Отчет по практической работе

Отчет должен содержать программные реализации алгоритмов

DES и ГОСТ 28147-89.

10. ИЗУЧЕНИЕ СИММЕТРИЧНОГО ШИФРОВАНИЯ ДАННЫХ НА ПРИМЕРЕ DISKREET, CRYPTON И ДРУГИХ ПАКЕТОВ

Цели работы

1.Изучить возможности и уяснить порядок работы с перечис­ ленными стандартными пакетами для шифрования (в режиме защиты файлов).

2.Сравнить основные характеристики пакетов (скорость шиф­ рования, длина паролей (ключей), сервис и т.д.).

Сведения из теории

Изучаемые в данной лабораторной работе средства шифрования DiskReet и Crypton-З относятся к блочным шифрам и реализуют стандарты шифрования DES и ГОСТ 28147-89.

Рассмотрим некоторые основы построения блочных шифров. Они состоят из заданной определенным образом комбинации неко­ торых преобразований. Очень сильно стойкость полученного шифра зависит от того, насколько удачно была составлена комбинация. На­ пример, будем применять несколько простых преобразований не­ сколько раз. Будет ли это достаточно хорошо? Предположим, мы два раза применим для шифрования каждой буквы текста две разные подстановки одинаковой степени (или даже много разных подстано­ вок). При этом получится, что мы воздействовали на каждую букву всего одной подстановкой, которая является произведением всех, использованных для шифрования. С другой стороны, подстановки тоже бывают разные, и их всевозможные произведения в композиции будут давать лишь некоторые из множества всех возможных —это ослабляет шифр, поскольку некоторые символы алфавита не будут встречаться в шифртексте.

С качественной точки зрения метод синтеза стойких шифров описал Клод Шеннон. Он состоит в следующем:

1.Пусть имеется алгоритм шифрования S с известной стойко­ стью, равной t элементарных операций.

2.Пусть также имеется размешивающее преобразование Т (под размешивающим преобразованием Шеннон понимает некоторое ото­ бражение векторного пространства на себя, при котором каждая (или почти каждая) его компактная область в отображении распределяется

вбольшую область).

3.Преобразования S и Т обратимы (взаимно однозначны) (об­ ратимость S следует из определения шифра).

4. Шифрующее

отображение

описывается итеративно Е(А)=

= T(S(T(S(....(T(S(A)))

...)))) - к

раз применяется суперпозиция

T(S(A)), А - символ открытого текста.

Поясним немного понятие размешивающего преобразования. Рассмотрим множество двоичных векторов длиной 3:

0 0 0

0

0 0 1

1

0 1 0

2

0 1 1

3

1 0 0

4

1 0 1

5

1 10

6

1 1 1

7

Рассмотрим преобразование x+a(mod 2), а=(1 1 1).

Хорошо видно, что это преобразование не является размеши­ вающим, действительно, компактная область (1, 2, 3) отобразится как

(0 0 1)+(1 1 1)=(1 1 0)6

(0 1 0)+(1 1 1)=(1 0 1)5 (0 1 1)+(1 1 1И1 0 0)4

тоже в отдельную компактную область (6,5,4).

Рассматривая векторы как числа и применив подстановку 0 1 2 3 4 5 6 7 7 3 1 5 4 2 3 0 ,

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