Лабораторная работа 21 / lab2
.docСанкт-Петербургский
государственный электротехнический университет
“ЛЭТИ”
______________________________________________________________________
кафедра МОЭВМ
МЕТОДЫ И СРЕДСТВА ЗАЩИТЫ КОМПЬЮТЕРНОЙ ИНФОРМАЦИИ
Лабораторная работа N2 Симметричное шифрование. Блочные шифры
Вариант 2
Выполнили: ст. гр. 3341 Постникова О. Е.
Злобин А.Н.
Проверил: Горячев Г.А.
Санкт-Петербург
2008
Лабораторная работа № 1
Простые шифры
Цель работы: Ознакомление с блочными симметричными криптографическими шифрами на основе алгоритма TEA
1. Содержательная постановка задачи:
Разработка и программная реализация варианта симметричного блочного криптографического алгоритма (структура, расширение ключа, анализ):
TEA.
2. Описание алгоритма:
-
Блочный шифр 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. Что называется ключом шифрования.
Ответ: Ключ – последовательность бит, как правило держащаяся в секрете, используемая для шифрования/дешифрования.
-
Какие шифры называются шифрами на открытом ключе и какие – шифрами на секретном ключе? Ответ : в шифрах на секретном ключе один и тот же ключ используется как для шифрования, так и для дешифрования данных. В шифрах на открытом ключе при шифровании и дешифровании используются разные ключи: открытый и общеизвестный – при шифровании, закрытый, секретный – при дешифровании.
-
Чем отличается поточное шифрование от блочного? Ответ : Поточный шифр способен обрабатывать информацию побитно, т. е. подобная схема может, получив порцию из произвольного количества бит (может быть, даже одного), зашифровать/дешифровать ее и передать для дальнейшей обработки другим модулям. В блочных шифрах преобразования могут применяться только над информацией строго определенного объема.
-
Чему равна длина секретного ключа алгоритма DES? Ответ: длина секретного ключа DES составляет 64 бита из них 8 используются для учета контрольных разрядов, 56 – непосредственно для шифрования.
-
Чему может быть равна длина секретного ключа алгоритма Rijndael? Ответ: алгоритм поддерживает размер ключа, кратный 32 битам
-
Какая архитектура лежит в основе алгоритма DES? Ответ: Алгоритм представляет собой классическую сеть Файстеля из 16 раундов с добавлением входной и выходной перестановки бит
-
Какой параметр определяет криптостойкость современного алгоритма? Основным параметром криптостойкости является длина секретного ключа.
-
Что такое ECB, CBC Ответ: В режиме электронной шифровальной книги (electronic codebook - ECB) каждый блок открытого текста преобразуется в один и тот же блок шифротекста. В режиме сцепления блоков (cipher block chaining - CBC) блок открытого текста перед шифрованием подвергается операции побитового исключающего ИЛИ c предыдущим блоком шифротекста
6. Выводы:
При выполнении лабораторной работы были получены навыки в использовании блочных шифров.