Приложение 1. Модульные диаграммы, диаграмма последовательности
116
117
118
119
120
Приложение 2. Описание основных функций
Описание main.c
switch(index_crypto)
case 0:
test_aes(); // aes.c: шифрование/дешифрование. Для тестов
test_des(); // des.c: шифрование/дешифрование. Для тестов
break;
case 1:
test_ant_aes(); // ant_aes.c: муравьиный криптоанализ алгоритма aes.
break;
case 2:
test_ant_des(); // ant_des.c: муравьиный криптоанализ алгоритма des
break;
case 3:
test_gen_aes(); // gen_aes.c: генетический криптоанализ алгоритма aes
break;
case 4:
test_gen_des(); // gen_des.c: генетический криптоанализ алгоритма des
break;
aes.c → int test_aes()
des.c → void test_des(void)
ops.h
ops — original population seed
Так как интерфейсы des и aes отличаются, а выбор при реализации был сделан в
сторону единообразной работы, то для достижения этой цели был реализован интерфейс,
описанный в ops.h.
Реализованный интерфейс позволяет работать с оригинальным текстом,
зашифрованным текстом и ключом шифрования. Для определения с каким типом данных
будет происходить работа используется
enum ops_data_type
{
OPS_DATA_CIPHER,
OPS_DATA_TEXT,
OPS_DATA_KEY
};
В программе создана структура, описывающая операции с данными. Структура имеет
следующий вид:
struct ops_data
{
int key_length;
int text_length;
int cipher_length;
void* (*allocate)(struct ops_data *ops, enum ops_data_type type);
void (*destroy)(struct ops_data *ops, enum ops_data_type type, void *data);
void (*random)(struct ops_data *ops, enum ops_data_type type, void *data);
int (*get_bit)(struct ops_data *ops, enum ops_data_type type, void *data, int n);
void (*set_bit)(struct ops_data *ops, enum ops_data_type type, void *data, int n, int value);
void (*print)(struct ops_data *ops, enum ops_data_type type, void *data, FILE *f);
121
void (*copy)(struct ops_data *ops, enum ops_data_type type, void *src, void *dst);
void (*cipher)(struct ops_data *ops, void *text, void *key, void *cipher);
void (*breed)(struct ops_data *ops, void *parent_key1, void *parent_key2, void *child_key);
void (*mutate)(struct ops_data *ops, void *key, double mutation_rate);
};
Данная структура содержит определенный набор параметров и функций, которые позволяют
наиболее унифицировано обрабатывать данные.
В структуре объявлены следующие параметры, определяющие данные, с которыми будет
происходить работа
key_length
длина ключа: для DES — 56 бит, для AES — 128, 192, 256
бит
text_length
длина текста: для DES — 64 бит, для AES — 128 бит
cipher_length
длина шифрованного текста:
для DES — 64 бит, для AES — 128 бит
Рассмотрим более подробно основные функции работы с данными.
Указатель на функцию выделения памяти для данных
void* (*allocate)(struct ops_data *ops, enum ops_data_type type)
в качестве входных данных принимает следующие параметры:
struct ops_data *ops
указатель на объект, содержащий параметры
заданного
шифрования
enum ops_data_type type тип данных, для которых выделяется память
(шифрованный текст, оригинальный текст или
ключ).
Функция возвращает указатель на выделенную память
По окончании работы с данными необходимо освободить память, для чего написана
функция освобождения памяти
void (*destroy)(struct ops_data *ops, enum ops_data_type type, void *data);
в качестве входных данных принимает следующие параметры:
struct ops_data *ops
указатель на объект, содержащий параметры
заданного
шифрования
enum ops_data_type type тип данных, для которых была выделена память
void *data
указатель на память, которую надо освободить
Для формирования данных случайным образом написана функция заполнения
void (*random)(struct ops_data *ops, enum ops_data_type type, void *data)
в качестве входных данных принимает следующие параметры:
struct ops_data *ops
указатель на объект, содержащий параметры
заданного
шифрования
enum ops_data_type type тип данных, с которым будет осуществляться работа
void *data
указатель на данные, которые будут заполнены
случайным образом
Функция для получения значения бита на определенной позиции в строке данных
int (*get_bit)(struct ops_data *ops, enum ops_data_type type, void *data, int n);
в качестве входных данных принимает следующие параметры:
struct ops_data *ops
указатель на объект, содержащий параметры
заданного
шифрования
122
enum ops_data_type type тип данных, с которым будет осуществляться работа
void *data
указатель на данные
int n
позиция бита в строке
Возвращает значение бита в позиции n
Функция установки значения бит в строке данных
void (*set_bit)(struct ops_data *ops, enum ops_data_type type, void *data, int n, int value);
в качестве входных данных принимает следующие параметры:
struct ops_data *ops
указатель на объект, содержащий параметры
заданного
шифрования
enum ops_data_type type тип данных, с которым будет осуществляться работа
int n
номер изменяемого бита
int value
значение, которое будет установлено в изменяемом
бите
Функция печати данных в поток ввода-вывода
void (*print)(struct ops_data *ops, enum ops_data_type type, void *data, FILE *f);
в качестве входных данных принимает следующие параметры:
struct ops_data *ops
указатель на объект, содержащий параметры
заданного
шифрования
enum ops_data_type type тип данных, с которым будет осуществляться работа
void *data
данные, которые будут печататься
FILE *f
поток ввода-вывода
Вспомогательная функция копирования данных
void (*copy)(struct ops_data *ops, enum ops_data_type type, void *src, void *dst);
в качестве входных данных принимает следующие параметры:
struct ops_data *ops
указатель на объект, содержащий параметры
заданного
шифрования
enum ops_data_type type тип данных, с которым будет осуществляться работа
void *src
указатель на источник данных
void *dst
указатель на приемник данных
Функция шифрования блока данных, в которой происходит обращение к реализованным
алгоритмам шифрования
void (*cipher)(struct ops_data *ops, void *text, void *key, void *cipher);
в качестве входных данных принимает следующие параметры:
struct ops_data *ops
указатель на объект, содержащий параметры
заданного
шифрования
enum ops_data_type type тип данных, с которым будет осуществляться работа
void *text
оригинальный незашифрованный текст
void *key
ключ
void *cipher
зашифрованный текст
Обращение к тому или иному алгоритму шифрования определяется вариантом, выбранным
при запуске программы.
Для исследования генетического алгоритма реализованы две функции необходимые для
обеспечения работы алгоритма:
1. Функция порождения потомка
void (*breed)(struct ops_data *ops, void *parent_key1, void *parent_key2, void *child_key);
в качестве входных данных принимает следующие параметры:
123
struct ops_data *ops
указатель на объект, содержащий параметры
заданного
шифрования
void *parent_key1
указатель на ключ родителя №1
void *parent_key2
указатель на ключ родителя №2
void *child_key
указатель на ключ потомка, принцип формирования
которого будет описан ниже
2. Функция мутации генов потомка
void (*mutate)(struct ops_data *ops, void *key, double mutation_rate);
в качестве входных данных принимает следующие параметры:
struct ops_data *ops
указатель на объект, содержащий параметры
заданного
шифрования
void *key
ключ
double mutation_rate
вероятность мутации гена (mutation_rate *
key_length. <=1)
Заголовочные файлы ops_aes.h и ops_des.h и соответствующие им *.с файлы содержат
определение специфичных функций для AES и DES соответственно.
Функции инициализация ops_data для работы с алгоритмами AES и DES:
Do'stlaringiz bilan baham: |