50408 (Программная реализация алгоритма шифрования DES. Режим ECB), страница 3

2016-07-30СтудИзба

Описание файла

Документ из архива "Программная реализация алгоритма шифрования DES. Режим ECB", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "50408"

Текст 3 страницы из документа "50408"





Заключение

В процессе разработки курсового проекта были получены навыки работы и программирования приложений на языке C++ в среде Borland C++ Builder. В результате работы над проектом получена работоспособная программа, реализующая шифрование по алгоритму DES в режиме «электронная кодовая книга». Данный продукт может использоваться как учебное пособие, или для домашнего пользования. Симметричные алгоритмы шифрования еще долго будут актуальны.





Список использованных источников

1. Ю.В.Романец, П.А. Тимофеев, В.Ф. Шаньгин Защита информации в компьютерных системах и сетях: Радио и связь: Москва, 1999. - 328 с.

2 Брюс Шнайер, Прикладная криптография: БХВ-Питер: Санкт-Петербург,2004.-718 с.





Приложение А

Листинг программы А.1 –mainform.cpp

#include

#pragma hdrstop

#include "DESAlgorithms.h"

#include "MainForm.h"

#pragma package(smart_init)

#pragma link "SHDocVw_OCX"

#pragma link "DataFrame"

#pragma resource "*.dfm"

TMainDialogForm *MainDialogForm;

__fastcall TMainDialogForm::TMainDialogForm(TComponent* Owner)

: TForm(Owner)

{

KeysDataFrame->EditLeft = 80;

KeysDataFrame->AddField("Ключ", false);

SrcDataFrame->EditLeft = 100;

SrcDataFrame->AddField("Входная строка", false);

SrcDataFrame->AddField("Результат", true);

}

void __fastcall TMainDialogForm::BrowseInpFilePathButtonClick(TObject *Sender)

{

if (OpenDialog->Execute()) InpFilePathEdit->Text = OpenDialog->FileName;

}

void __fastcall TMainDialogForm::BrowsOutFilePathButtonClick(

TObject *Sender)

{

if (SaveDialog->Execute()) OutFilePathEdit->Text = SaveDialog->FileName;

}

void __fastcall TMainDialogForm::AutoStartButtonClick(TObject *Sender)

{

DESAlg.Key = KeysDataFrame->Field["Ключ"];

if ( IsCryptRadioButton->Checked ) DESAlg.Crypt = true;

else DESAlg.Crypt = false;

if (SourcePageControl->ActivePage == StringSrcSheet) {

//Входные данные берем из строки "Входная строка"

DESAlg.Data = SrcDataFrame-> Field["Входная строка"];

}

else if (SourcePageControl->ActivePage == FileSrcSheet) {

//Входные данные берем из файла, путь к которому находится в

//InpFilePathEdit

DESAlg.Data = ReadAnsiStringFromFile( InpFilePathEdit->Text );

}

DESAlg.Exectute();

if (SourcePageControl->ActivePage == StringSrcSheet) {

SrcDataFrame->Field["Результат"] = DESAlg.Data;

}

else if (SourcePageControl->ActivePage == FileSrcSheet) {

//Выходные данные записываем в файл, путь к которому находится в

//OutFilePathEdit

if (WriteAnsiStringToFile( DESAlg.Data, OutFilePathEdit->Text )) {

MessageBox(this->Handle,

((AnsiString)"Данные успешно записаны в файл\n" +

OutFilePathEdit->Text).c_str(), this->Caption.c_str(),

MB_ICONINFORMATION | MB_OK );

}

}

}

//Чтение файла в AnsiString

AnsiString __fastcall TMainDialogForm::ReadAnsiStringFromFile(

AnsiString FileName)

{

AnsiString Result;

try {

TFileStream *in = new TFileStream(FileName, fmOpenRead); //открываем файл

if( in != NULL ) {

int size = in->Size;

if( size != 0 ) {

try {

Result.SetLength(size);

in->Read((void *)(Result.data()), size);

}

catch( EOutOfMemory& ) {}

delete in;

}

}

}

catch ( EStreamError& ) {

MessageBox(this->Handle, ( (AnsiString)

"Не удается прочитать данные из файла:\n" + FileName).c_str(),

"Ошибка чтения файла", MB_ICONERROR | MB_OK );

return "";

}

return Result;

}

//Запись в файл из AnsiString

bool __fastcall TMainDialogForm::WriteAnsiStringToFile(AnsiString String,

AnsiString FileName)

{

try {

TFileStream *out = new TFileStream(FileName, fmCreate); // открываем файл

if( out != NULL ) {

if( String.Length() != 0 ) {

try {

out->Write((void *)(String.data()), String.Length());

}

catch( EOutOfMemory& ) {}

delete out;

}

}

}

catch (EStreamError&) {

MessageBox(this->Handle, ((AnsiString)

"Не удается записать данные в файл:\n" + FileName).c_str(),

"Ошибка записи файла",

MB_ICONERROR | MB_OK );

return false;

}

return true;

}

Листинг программы А.2 –des.cpp

#include

#pragma hdrstop

#include "DES.h"

#pragma package(smart_init)

//Извлечение бита из массива символов

int get_bit (unsigned char *data, int num)

{

return (int)((data[num/8] & (1 << (7 - (num % 8)))) != 0);

}

//Установка бита в массиве символов

void set_bit (unsigned char *data, int num, int bit)

{

if (bit == 1)//Нужно бит установить в 1

data[num/8] |= 1 << (7 - (num % 8));

else//Нужно бит сбросить в 0

data[num/8] &= ~(1 << (7 - (num % 8)));

}

//Циклический сдвиг влево массива data из num_elem элементов на num_shift

//позиций

void shift_left (unsigned char *data, int num_elem, int num_shift)

{

int save_bit;

for (int k=0; k < num_shift; ++k)

{

save_bit = get_bit(data, 0);

for (int i=0; i < num_elem - 1; ++i)

{

data[i] <<= 1;

set_bit(&data[i], 7, get_bit(&data[i+1], 0));

}

data[num_elem-1] <<=1;

set_bit (&data[num_elem-1], 7, save_bit);

}

}

//Циклический сдвиг вправо массива data из num_elem элементов на num_shift

//позиций

void shift_right (unsigned char *data, int num_elem, int num_shift)

{

int save_bit;

for (int k=0; k < num_shift; ++k)

{

save_bit = get_bit(&data[num_elem-1], 7);

for (int i=num_elem - 1; i >= 1 ; --i)

{

data[i] >>= 1;

set_bit(&data[i], 0, get_bit(&data[i-1], 7));

}

data[0] >>=1;

set_bit (&data[0], 0, save_bit);

}

}

//Циклический сдвиг влево массива data из 28 элементов (сдвиг ключа) на \

//num_shift позиций

void shift_left_key (unsigned char *key, int num_shift)

{

int save_bit;

for (int i=0; i

{

shift_left(key, 7, 1);

save_bit=get_bit(key, 27);

set_bit(key, 27, get_bit(key, 55));

set_bit(key, 55, save_bit);

}

}

//Циклический сдвиг влево массива data из 28 элементов (сдвиг ключа) на

//num_shift позиций

void shift_right_key (unsigned char *key, int num_shift)

{

int save_bit;

for (int i=0; i

{

shift_right(key, 7, 1);

save_bit=get_bit(key, 0);

set_bit(key, 0, get_bit(key, 28));

set_bit(key, 28, save_bit);

}

}

//Обменивает биты в соответсвии с таблицами перестановки

//data_src - входной массив данных. Если NULL тогда данные берутся из data_des

//data_des - входной/выходной массив данных.

//transposition_table - таблица перестановки

//num - кол-во элементов / 8 в data_des и элементов в transposition_table

void transposition (unsigned char *data_des, unsigned char *data_src,

int *transposition_table, int num)

{

bool delete_mem=false;

if (data_src==NULL)

{

data_src = new unsigned char[num / 8];

memcpy(data_src, data_des, num / 8);

delete_mem=true;

}

for (int i=0; i

set_bit(data_des, i, get_bit(data_src, transposition_table[i] - 1));

if (delete_mem) delete [] data_src;

}

//Возвращает значение S-подстановки

int get_S_substitution (int inp, int *S_table)

{

int string=0;//Строка в таблице

int column=0;//Столбец в таблице

string = get_bit((unsigned char*)(&inp), 2) |

get_bit((unsigned char *)(&inp), 5) << 1 ;

column = get_bit((unsigned char*)(&inp), 3) |

get_bit((unsigned char *)(&inp), 4) << 1 |

get_bit((unsigned char *)(&inp), 5) << 2 |

get_bit((unsigned char *)(&inp), 6) << 3;

return S_table[string * 16 + column];

}

//Реализует алгоритм подстановки S-блоков

void S_block (unsigned char *dest, unsigned char *src)

{

int S_inp;//6 бит, подающиеся на вход в S-блок

int S_out;//4 бита, получаемые из S-блока

for (int i=0; i<4; ++i) dest[i]=0;

for (int i=0; i<8; ++i)

{

shift_left (src, 6, i);

S_inp=(src[0] >> 2) & 0x3F;

S_out=get_S_substitution(S_inp, table_S_block[i]);

dest[i/2] |= S_out << (((i + 1) % 2) * 4);

}

}

//Сам алгоритм DES. i_key - 64 бита (8 байт) (с битами четности); data - 64 бита

//Алгоритм используется как при шифровании, так и при дешифровании. Ключ при

//дешифровании менять самим. При decode==false - зашифровка, если ==true -

//расшифровка

void DES_algorithm (unsigned char *i_key, unsigned char *data,

bool decode=false)

{

unsigned char key[7]; //Ключ без битов четности

unsigned char Li[4]; //сохраненная левая половина данных

unsigned char small_key[6]; //ключ после перестановки со сжатием

unsigned char big_data[6]; //данные после перестановки с расширением

unsigned char small_data[4]; //данные после подстановки с помощью

//S-блоков

//Перестановка ключа (+ избавление от 8х битов)

transposition (key, i_key, table_key_initial_transposition, 56);

//Первоначальная перестановка данных

transposition (data, NULL, table_initial_transposition, 64);

for (int i=0; i<16; ++i)

{

//Сохранение Li (берется из правой части)

memcpy(Li, &data[4], 4);

//Сдвиг ключа

if (!decode)

{

shift_left_key (key, table_shift_key[i]); //При зашифровке

}

else

{

shift_right_key (key, table_shift_key_right[i]); //При расшифровке

}

//Перестановка ключа со сжатием

transposition (small_key, key,

table_transposition_with_compression, 48);

//Перестановка данных с расширением

transposition (big_data, &data[4],

table_transposition_with_extension, 48);

//Сложение данных XOR с ключом

for (int k=0; k<6; ++k)big_data[k]^=small_key[k];

//Подстановка с помощью S-блоков

S_block (small_data, big_data);

//Перестановка данных с помощью P-блоков

transposition (small_data, NULL, table_transposition_P_block, 32);

//Сложение XOR данных левой и правой частей

for (int k=0; k<4; ++k) small_data[k] ^= data[k];

//Запись в data полученных результатов

memcpy(&data[0], Li, 4);

memcpy(&data[4], small_data, 4);

}

//Заключительный обмен полученных результатов

memcpy(Li, &data[0], 4);

memcpy(&data[0], &data[4], 4);

memcpy(&data[4], Li, 4);

//Заключительная перестановка

transposition (data, NULL, table_final_transposition, 64);

}

Размещено на Allbest.ru

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Нет! Мы не выполняем работы на заказ, однако Вы можете попросить что-то выложить в наших социальных сетях.
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
4125
Авторов
на СтудИзбе
667
Средний доход
с одного платного файла
Обучение Подробнее