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

Лабораторная работа 2 / Защита_информации_2

.doc
Скачиваний:
68
Добавлен:
01.05.2014
Размер:
262.66 Кб
Скачать

Министерство образования и науки РФ

Санкт-Петербургский государственный электротехнический университет «ЛЭТИ»

кафедра математического обеспечения ЭВМ

Отчет

по лабораторной работе №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. Что называется ключом шифрования.

Ответ: Ключ – последовательность бит, как правило держащаяся в секрете, используемая для шифрования/дешифрования.

  1. Какие шифры называются шифрами на открытом ключе и какие – шифрами на секретном ключе? Ответ : в шифрах на секретном ключе один и тот же ключ используется как для шифрования, так и для дешифрования данных. В шифрах на открытом ключе при шифровании и дешифровании используются разные ключи: открытый и общеизвестный – при шифровании, закрытый, секретный – при дешифровании.

  2. Чем отличается поточное шифрование от блочного? Ответ : Поточный шифр способен обрабатывать информацию побитно, т. е. подобная схема может, получив порцию из произвольного количества бит (может быть, даже одного), зашифровать/дешифровать ее и передать для дальнейшей обработки другим модулям. В блочных шифрах преобразования могут применяться только над информацией строго определенного объема.

  3. Чему равна длина секретного ключа алгоритма DES? Ответ: длина секретного ключа DES составляет 64 бита из них 8 используются для учета контрольных разрядов, 56 – непосредственно для шифрования.

  4. Чему может быть равна длина секретного ключа алгоритма Rijndael? Ответ: алгоритм поддерживает размер ключа, кратный 32 битам

  5. Какая архитектура лежит в основе алгоритма DES? Ответ: Алгоритм представляет собой классическую сеть Файстеля из 16 раундов с добавлением входной и выходной перестановки бит

  6. Какой параметр определяет криптостойкость современного алгоритма? Основным параметром криптостойкости является длина секретного ключа.

  7. Что такое 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');