3189
.pdfEnd; |
|
|
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 ,