Лабораторная работа 2 / Защита_информации_2
.docМинистерство образования и науки РФ
Санкт-Петербургский государственный электротехнический университет «ЛЭТИ»
кафедра математического обеспечения ЭВМ
Отчет
по лабораторной работе №2
«Симметричное шифрование. Блочные шифры»
по дисциплине «Методы и средства защиты компьютерной информации»
Выполнили: студенты гр 3341 Рыжок М.С. Гвоздякова Е.А.
Проверил: доцент кафедры МО ЭВМ Горячев Г.А.
Санкт-Петербург 2008-05-05
Лабораторная работа №2
Блочные шифры
Цель работы: Ознакомление с блочными симметричными криптографическими шифрами на основе алгоритма ГОСТ 28147-89.
Задание: Разработка и программная реализация алгоритма шифрования ГОСТ-28147-89
Схема алгоритма : ГОСТ является 64-битовым алгоритмом с 256-битовым ключом. В процессе работы алгоритма на всех 32 этапах последовательно выполняется следующий алгоритм шифрования
Блок сначала разбивается на левую половину L и правую половину R. На этапе i алгоритма выполняется следующее:
Li = Ri-1
Ri = Li-1 XOR f(Ri-1, Ki)
Этап ГОСТ показан на рисунке1. Функция f проста. Сначала правая половина и i-ый подключ складываются по модулю 232. Результат разбивается на 8 4-х битовых кусочков, каждый из которых поступает на вход своего S-блока. ГОСТ использует 8 различных S-блоков, первые 4 бит а попадают в первый S-блок, вторые 4 – во второй и.т.д. Каждый S-блок представляет собой перестановку чисел от 0 до 15.
S- блок может выглядеть так:7, 10, 2, 4, 15, 9, 0, 3, 6, 12, 5, 13, 1, 8, 11. В этом случае, если на входе 0, на выходе 7, если на входе 1, на выходе 10 и.т.д.
Выходы всех S-блоков объединяются в 32-х битовое слово, затем все слово циклически сдвигается влево на 11 битов. Наконец результат объединяется с помощью XOR с левой половиной.
Генерация ключей проста. 256-битный ключ K разбивается на восемь 32-битных подключей. На каждом этапе используется свой подключ. При дешифровании ключи берутся в обратном порядке
Дешифрование осуществляется примерно по той же схеме, что и шифрование, но функция f применяется не к правой, а к левой половине блока (рисунок 2)
Пусть Li-1 = R
Ri-1 = L XOR f(R, K), согласно схеме шифрования ГОСТ, тогда при дешифровании
Li = Ri-1 XOR f(Li-1, K) = L XOR f(R, K) XOR f(R, K) = L
Ri = Li-1 = R
Таким образом доказано, что данная схема действительно выполняет дешифрование.
Контрольный пример : Пусть мы хотим зашифровать блок
М = 0110000111110110111110000100000010011000010110000010010110100111
с помощью подключа K = 00110010111000101010111101001101
Разбиваем блок на две половины
L = 01100001111101101111100001000000
R = 10011000010110000010010110100111
Суммируем правую часть с ключом по модулю 232
(R+L)mod232 = 11001011001110101101010011110100
Разбиваем полученный результат на 8 блоков по 4 бита
1 1 0 0
1 0 1 1
0 0 1 1
1 0 1 0
1 1 0 1
0 1 0 0
1 1 1 1
0 1 0 0
Используем S-блоки из приложений Центрального Банка РФ
S-1 |
4 |
10 |
9 |
2 |
13 |
8 |
0 |
14 |
6 |
11 |
1 |
12 |
7 |
15 |
5 |
3 |
S-2 |
14 |
11 |
4 |
12 |
6 |
13 |
15 |
10 |
2 |
3 |
8 |
1 |
0 |
7 |
5 |
9 |
S-3 |
5 |
8 |
1 |
13 |
10 |
3 |
4 |
2 |
14 |
15 |
12 |
7 |
6 |
0 |
9 |
11 |
S-4 |
7 |
13 |
10 |
1 |
0 |
8 |
9 |
15 |
14 |
4 |
6 |
12 |
11 |
2 |
5 |
3 |
S-5 |
6 |
12 |
7 |
1 |
5 |
15 |
13 |
8 |
4 |
10 |
9 |
14 |
0 |
3 |
11 |
2 |
S-6 |
4 |
11 |
10 |
0 |
7 |
2 |
1 |
13 |
3 |
6 |
8 |
5 |
9 |
12 |
15 |
14 |
S-7 |
13 |
11 |
4 |
1 |
3 |
15 |
5 |
9 |
0 |
10 |
14 |
7 |
6 |
8 |
2 |
12 |
S-8 |
1 |
15 |
13 |
0 |
5 |
7 |
10 |
4 |
9 |
2 |
3 |
14 |
6 |
11 |
8 |
12 |
После пропускания через S-блоки получим таблицу
0 1 1 1
0 0 0 1
1 1 0 1
0 1 1 0
0 0 1 1
0 1 1 1
1 1 0 0
0 1 0 1
Объединяем 4-битовые фрагменты в 32-битную половину блока
S(R+K) = 01110001110101100011011111000101
Сдвигаем циклически результат на 11 битов влево
F(R, K) = 0 1110001110101100011011111000101
Итоговый блок:011100011101011000110111110001010110000111110110111110000 1000000
Реализация алгоритма: при выполнении лабораторной работы с помощью пакета инженерных вычислений MATLAB 7.5.0 было создано приложение с графическим интерфейсом, позволяющее пользователю зашифровать любое текстовое сообщение, загруженным из файла ‘text.txt’. Ключ шифрования загружается из файла ‘key.txt’. Результат сообщения сохраняется в файл ‘out.txt’. Интерфейс приложения представлен на рисунке 1.
При выборе режима Encrypt при нажатии клавиши Load Text загружается открытый текст, а при выборе режима Decrypt – шифротекст. Операцию шифрования имеет смысл проводить только с открытым текстом, а дешифрования – только с закрытым. Результат шифрования/дешифрования сохраняется в файле out.txt
Результаты работы программы
1. Открытый текст: Когда на сердце тяжесть и холодно в груди, к ступеням Эрмитажа ты тихо подойди
Ключ 00000000000000000000000000000000000000000000000000000000
Шифротекст:EДкUzjазW>/сОoшщЋ$шэᄃAj}\вґ'л26лес5“Ѓ7Єђ+`pыdAlc/С—Ф "ЇoИыuрт)RхFэйLҐᄂЮоГ«п
2. Открытый текст: Все отболит и мудрый говорит: каждый костер когда-то догорит
Ключ 00000000000000000000000000000000000000000000000000000000
Шифротекст: Oэ.зюъвHkв=жуцYсd_ђгимY(B—п}©™¦—К<{‹Ьлељйс“ᄉѕw^ђњшлdР B_к]
Ответы на контрольные вопросы:
1. Что называется ключом шифрования.
Ответ: Ключ – последовательность бит, как правило держащаяся в секрете, используемая для шифрования/дешифрования.
-
Какие шифры называются шифрами на открытом ключе и какие – шифрами на секретном ключе? Ответ : в шифрах на секретном ключе один и тот же ключ используется как для шифрования, так и для дешифрования данных. В шифрах на открытом ключе при шифровании и дешифровании используются разные ключи: открытый и общеизвестный – при шифровании, закрытый, секретный – при дешифровании.
-
Чем отличается поточное шифрование от блочного? Ответ : Поточный шифр способен обрабатывать информацию побитно, т. е. подобная схема может, получив порцию из произвольного количества бит (может быть, даже одного), зашифровать/дешифровать ее и передать для дальнейшей обработки другим модулям. В блочных шифрах преобразования могут применяться только над информацией строго определенного объема.
-
Чему равна длина секретного ключа алгоритма DES? Ответ: длина секретного ключа DES составляет 64 бита из них 8 используются для учета контрольных разрядов, 56 – непосредственно для шифрования.
-
Чему может быть равна длина секретного ключа алгоритма Rijndael? Ответ: алгоритм поддерживает размер ключа, кратный 32 битам
-
Какая архитектура лежит в основе алгоритма DES? Ответ: Алгоритм представляет собой классическую сеть Файстеля из 16 раундов с добавлением входной и выходной перестановки бит
-
Какой параметр определяет криптостойкость современного алгоритма? Основным параметром криптостойкости является длина секретного ключа.
-
Что такое ECB, CBC Ответ: В режиме электронной шифровальной книги (electronic codebook - ECB) каждый блок открытого текста преобразуется в один и тот же блок шифротекста. В режиме сцепления блоков (cipher block chaining - CBC) блок открытого текста перед шифрованием подвергается операции побитового исключающего ИЛИ c предыдущим блоком шифротекста
Выводы: при выполнении лабораторной работы были получены навыки в использовании блочных шифров.
Приложение 1
Текст программы на языке среды инженерных разработок MATLAB
function varargout = GOST_28147_89(varargin)
% GOST_28147_89 M-file for GOST_28147_89.fig
% GOST_28147_89, by itself, creates a new GOST_28147_89 or raises the existing
% singleton*.
%
% H = GOST_28147_89 returns the handle to a new GOST_28147_89 or the handle to
% the existing singleton*.
%
% GOST_28147_89('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in GOST_28147_89.M with the given input arguments.
%
% GOST_28147_89('Property','Value',...) creates a new GOST_28147_89 or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before GOST_28147_89_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to GOST_28147_89_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help GOST_28147_89
% Last Modified by GUIDE v2.5 04-May-2008 16:23:58
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @GOST_28147_89_OpeningFcn, ...
'gui_OutputFcn', @GOST_28147_89_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before GOST_28147_89 is made visible.
function GOST_28147_89_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to GOST_28147_89 (see VARARGIN)
% Choose default command line output for GOST_28147_89
handles.output = hObject;
set(handles.cryptbutton, 'Enable', 'off');
set(handles.decryptbutton, 'Enable', 'off');
handles.flags.textflag = false;
handles.flags.keyflag = false;
IMG = imread('arrows.bmp');
h = image(IMG);
set(gca, 'XTick', []);
set(gca, 'YTick', []);
set(gca, 'LineWidth', 0.0001);
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes GOST_28147_89 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = GOST_28147_89_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in loadbutton.
function loadbutton_Callback(hObject, eventdata, handles)
%Загрузка открытого текста в символьном виде
if get(handles.Encrypt, 'Value')
k = fopen('text.txt', 'rt');
else
k = fopen('out.txt', 'rt');
end
textstring = '';
fileflag = 0;
while fileflag ~= -1
fileflag = fgets(k);
textstring = strcat(textstring, fileflag);
end
set(handles.outpanel, 'String', textstring);
fclose(k);
%Загрузка открытого текста в виде потока байт
if get(handles.Encrypt, 'Value')
k = fopen('text.txt', 'r');
else
k = fopen('out.txt', 'r');
end
T = fread(k, Inf);
T = T';
set(handles.binpanel, 'String', num2str(num2bin(T)));
fclose(k);
%Отображение в окнах исходного текста
handles.Data = num2bin(T);
handles.flags.textflag = true;
guidata(hObject, handles);
if and(handles.flags.keyflag == true, handles.flags.textflag == true)
set(handles.cryptbutton, 'Enable','on');
set(handles.decryptbutton, 'Enable','on');
end
% hObject handle to loadbutton (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
% --- Executes during object creation, after setting all properties.
function slider1_CreateFcn(hObject, eventdata, handles)
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on button press in cryptbutton.
function cryptbutton_Callback(hObject, eventdata, handles)
D = arr2matr(handles.Data, 64);
N = size(D);
CT = [];
set(handles.Encrypt, 'Enable', 'off');
set(handles.Decrypt, 'Enable', 'off');
for i = 1:N(1)
[L, R] = divide(D(i, :));
set(handles.leftside, 'String', num2str(L));
set(handles.rightside, 'String', num2str(R));
key = arr2matr(handles.Key, 32);
for j = 1:32
index = keyorder(j);
[L, R] = one_round(L, R, key(index, :));
set(handles.leftencrypt, 'String', num2str(L));
set(handles.rightencrypt, 'String', num2str(R));
pause(0.01)
set(handles.leftside, 'String', num2str(L));
set(handles.rightside, 'String', num2str(R));
pause(0.01)
end
M1 = [L R];
k = fopen('temp.txt', 'w');
fwrite(k, CT);
fclose(k);
k = fopen('temp.txt', 'rt');
tempstring = '';
tempflag = 0;
while tempflag ~= -1
tempflag = fgets(k);
tempstring = strcat(tempstring, tempflag);
end
set(handles.cyphertext, 'String', tempstring);
M1 = arr2matr(M1, 8);
M1 = bin2str(M1);
CT = [CT M1];
pause(0.1)
end
k = fopen('out.txt', 'w');
fwrite(k, CT);
fclose(k);
k = fopen('out.txt', 'rt');
textstring = '';
fileflag = 0;
while fileflag ~= -1
fileflag = fgets(k);
textstring = strcat(textstring, fileflag);
end
set(handles.cyphertext, 'String', textstring);
fclose(k);
set(handles.Encrypt, 'Enable', 'on');
set(handles.Decrypt, 'Enable', 'on');
% hObject handle to cryptbutton (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in keybutton.
function keybutton_Callback(hObject, eventdata, handles)
k = fopen('key.txt', 'r');
key = fread(k, Inf);
fclose(k);
key = num2bin(key);
if length(key) < 256
error('The key size must be more then 256 bit');
end
key = key(1:256);
handles.Key = key;
handles.flags.keyflag = true;
guidata(hObject, handles);
if and(handles.flags.keyflag == true, handles.flags.textflag == true)
set(handles.cryptbutton, 'Enable','on');
set(handles.decryptbutton, 'Enable','on');
end
% hObject handle to keybutton (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in decryptbutton.
function decryptbutton_Callback(hObject, eventdata, handles)
D = arr2matr(handles.Data, 64);
N = size(D);
CT = [];
set(handles.Encrypt, 'Enable', 'off');
set(handles.Decrypt, 'Enable', 'off');
for i = 1:N(1)
[L, R] = divide(D(i, :));
set(handles.leftside, 'String', num2str(L));
set(handles.rightside, 'String', num2str(R));
key = arr2matr(handles.Key, 32);
for j = 1:32
index = keyorder(33 - j);
[L, R] = one_round_back(L, R, key(index, :));
set(handles.leftencrypt, 'String', num2str(L));
set(handles.rightencrypt, 'String', num2str(R));
pause(0.01)
set(handles.leftside, 'String', num2str(L));
set(handles.rightside, 'String', num2str(R));
pause(0.01)
end
M1 = [L R];
k = fopen('temp.txt', 'w');
fwrite(k, CT);
fclose(k);
k = fopen('temp.txt', 'rt');
tempstring = '';
tempflag = 0;
while tempflag ~= -1
tempflag = fgets(k);
tempstring = strcat(tempstring, tempflag);
end
set(handles.cyphertext, 'String', tempstring);
M1 = arr2matr(M1, 8);
M1 = bin2str(M1);
CT = [CT M1];
pause(0.1)
end
k = fopen('out.txt', 'w');
fwrite(k, CT);
fclose(k);
k = fopen('out.txt', 'rt');
textstring = '';
fileflag = 0;
while fileflag ~= -1
fileflag = fgets(k);
textstring = strcat(textstring, fileflag);
end
set(handles.cyphertext, 'String', textstring);
fclose(k)
set(handles.Encrypt, 'Enable', 'on');
set(handles.Decrypt, 'Enable', 'on');