Скачиваний:
49
Добавлен:
01.05.2014
Размер:
120.32 Кб
Скачать

Санкт-Петербургский

государственный электротехнический университет

ЛЭТИ”

______________________________________________________________________

кафедра МОЭВМ

МЕТОДЫ И СРЕДСТВА ЗАЩИТЫ КОМПЬЮТЕРНОЙ ИНФОРМАЦИИ

Лабораторная работа N2 Симметричное шифрование. Блочные шифры

Вариант 2

Выполнили: ст. гр. 3341 Постникова О. Е.

Злобин А.Н.

Проверил: Горячев Г.А.

Санкт-Петербург

2008

Лабораторная работа № 1

Простые шифры

Цель работы: Ознакомление с блочными симметричными криптографическими шифрами на основе алгоритма TEA

1. Содержательная постановка задачи:

Разработка и программная реализация варианта симметричного блочного криптографического алгоритма (структура, расширение ключа, анализ):

TEA.

2. Описание алгоритма:

      1. Блочный шифр TEA

Рассмотрим один из самых простых в реализации, но признанно стойких криптоалгоритмов – TEA (Tiny Encryption Algorithm).

Параметры алгоритма : Размер блока – 64 бита. Длина ключа – 128 бит. В алгоритме использована сеть Фейштеля с двумя ветвями в 32 бита каждая. Образующая функция F обратима. Сеть Фейштеля несимметрична из-за использования в качестве операции наложения не исключающего "ИЛИ", а арифметического сложения.

Схема работы алгоритма приведена на рисунке 1.

Рис.1.

Отличительной чертой криптоалгоритма TEA является его размер. Простота операций, отсутствие табличных подстановок и оптимизация под 32-разрядную архитектуру процессоров позволяет реализовать его на языке ASSEMBLER в предельно малом объеме кода. Недостатком алгоритма является некоторая медлительность, вызванная необходимостью повторять цикл Фейштеля 32 раза (это необходимо для тщательного "перемешивания данных" из-за отсутствия табличных подстановок).

3. Реализация алгоритма:

Алгоритмы реализованы на языке С++:

alg.cpp:

#pragma hdrstop

#include <stdlib.h>

#include "alg.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

using namespace std;

CTea::CTea() : m_passSize(16),m_appendChar(' ')

{

}

void CTea::setPassword(std::string str)

{

for(uint i = str.length();i<m_passSize;++i)

str.append(&m_appendChar);

for(uint i = 0;i<4;++i)

{

convert tmp;

for(uint k = 0;k<4;++k)

tmp.m_char[k] = str[i*4+k];

m_password[i] = tmp.m_long;

}

}

void CTea::encrypt(std::string str)

{

div_t divStruct;

divStruct = div(str.length(),8);

m_origString = str;

m_encString.clear();

if(divStruct.rem!=0)

for(uint i = 8-divStruct.rem;i!=0;--i)

str.append(&m_appendChar);

divStruct = div(str.length(),8);

for(int i = 0;i<divStruct.quot;++i)

{

convert first,second;

for(uint k = 0;k<4;++k)

{

first.m_char[k] = str[i*8+k];

second.m_char[k] = str[i*8+k+4];

}

uint left = first.m_long, //Инициализация алгоритма

right = second.m_long,

sum = 0;

uint delta=0x9e3779b9; //Значение для улучшения ключа

for (uint i = 0;i<32;++i)

{

sum += delta;

left += ((right<<4)+m_password[0])^(right+sum)^((right>>5)+m_password[1]);

right += ((left<<4)+m_password[2])^(left+sum)^((left>>5)+m_password[3]);

}

first.m_long =left;

second.m_long=right;

for(uint k = 0;k<4;++k)

m_encString.push_back(first.m_char[k]);

for(uint k = 0;k<4;++k)

m_encString.push_back(second.m_char[k]);

}

}

void CTea::decrypt(std::string str)

{

div_t divStruct;

divStruct = div(str.length(),8);

m_encString = str;

m_origString.clear();

for(int i = 0;i<divStruct.quot;++i)

{

convert first,second;

for(uint k = 0;k<4;++k)

{

first.m_char[k] = str[i*8+k];

second.m_char[k] = str[i*8+k+4];

}

uint left = first.m_long, //Инициализация алгоритма

right = second.m_long,

sum;

uint delta=0x9e3779b9;

sum = delta<<5;

for (uint i = 0;i<32;++i)

{

right -= ((left<<4)+m_password[2])^(left+sum)^((left>>5)+m_password[3]);

left -= ((right<<4)+m_password[0])^(right+sum)^((right>>5)+m_password[1]);

sum -= delta;

}

first.m_long =left;

second.m_long=right;

for(uint k = 0;k<4;++k)

m_origString.push_back(first.m_char[k]);

for(uint k = 0;k<4;++k)

m_origString.push_back(second.m_char[k]);

}

}

std::string CTea::getEncrypted()

{

return m_encString;

}

std::string CTea::getDecrypted()

{

return m_origString;}

gui.cpp:

#include <vcl.h>

#pragma hdrstop

#include "gui.h"

#include <string>

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

Tm_form *m_form;

using namespace std;

//---------------------------------------------------------------------------

__fastcall Tm_form::Tm_form(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall Tm_form::m_bLaunchClick(TObject *Sender)

{

char tmp[512];

m_ePassword->GetTextBuf(tmp,16);

m_tea.setPassword(string(tmp));

m_output->Clear();

m_input->GetTextBuf(tmp,m_input->MaxLength);

if(m_bEncrypt->Checked)

{

m_tea.encrypt(string(tmp));

m_output->SetTextBuf((char*)m_tea.getEncrypted().c_str());

}

else

{

m_tea.decrypt(string(tmp));

m_output->SetTextBuf((char*)m_tea.getDecrypted().c_str());

}

}

Tea.cpp:

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

USEFORM("gui.cpp", m_form);

//---------------------------------------------------------------------------

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{ try

{

Application->Initialize();

Application->CreateForm(__classid(Tm_form), &m_form);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;}

4. Контрольный пример:

Внешний вид интерфейса программы имеет вид, представленный на Error: Reference source not found.1.:

Error: Reference source not found.1.

По-умолчанию в программе выбрано Шифрование:

Error: Reference source not found.2.

Результаты работы программы при Дешифровании:

Error: Reference source not found.2.

5. Ответы на контрольные вопросы:

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 предыдущим блоком шифротекста

6. Выводы:

При выполнении лабораторной работы были получены навыки в использовании блочных шифров.

Соседние файлы в папке Лабораторная работа 21
  • #
    01.05.201480.63 Кб31alg.obj
  • #
    01.05.20141.13 Кб35gui.cpp
  • #
    01.05.20142.53 Кб30gui.dfm
  • #
    01.05.20141.09 Кб35gui.h
  • #
    01.05.201480.34 Кб31gui.obj
  • #
    01.05.2014120.32 Кб49lab2.doc
  • #
    01.05.20144.34 Кб33TEA.bpr
  • #
    01.05.2014854 б33TEA.cpp
  • #
    01.05.201417.41 Кб31TEA.obj
  • #
    01.05.2014876 б30TEA.res
  • #
    01.05.20143.87 Mб30TEA.tds