Шифрование данных. Алгоритм Blowfish

Автор: Пользователь скрыл имя, 15 Декабря 2010 в 01:27, курсовая работа

Краткое описание

Предмет исследования – криптографический алгоритм Blowfish. Цель работы – разработка программного продукта обеспечивающего шифрование/расшифрование данных по алгоритму Blowfish. Алгоритм Blowfish — блочный шифр, основанный на сети Файстеля. Алгоритм прост в реализации, он является стойким ко всем, известнымна сегодняшний день, методам криптоанализа.

Оглавление

Введение 4
1 Понятие шифрования данных 7
2 Описание алгоритма blowfish 11
2.1 Структура алгоритма 11
2.2 Процедура расширения ключа 13
2.3 Достоинства и недостатки алгоритма 14
3 Практическая реализация алгоритма blowfish 16
4 Описани работы с программным продуктом 21
4.1 Минимальные требования для работы программного продукта 21
4.2 Шифрование данных 21
4.3 Расшифрование данных 23
4.4 Генерация пароля 25
Заключение 26
Список использованных источников 27
Приложение 1. Содержимое заголовочного файла 28
Приложение 2. Содержимое основного файла 29

Файлы: 1 файл

Курсовая работа.docx

— 690.11 Кб (Скачать)

     public:

           unsigned long long Encrypt(unsigned long long);

           unsigned long long Decrypt(unsigned long long);

           void initialization(unsigned int*);

           TBlowfish();

           ~TBlowfish();

     } 

     После написания класса необходимо описать  методы этого класса. Это будет  вторым шагом в реализации алгоритма.

     Описание  методов класса начинаем с конструктора, потому что именно он будет вызваться автоматически каждый раз, когда происходит создание объекта. Обычное назначение конструктора заключается в инициализации элементов данных объекта. Конструктор представляет собой метод класса, который имеет такое же имя, как и класс. Конструктор нашего класса выглядит следующим образом: 

    TBlowfish::TBlowfish(){

          copy(K1, K1+256, S1);

          copy(K2, K2+256, S2);

          copy(K3, K3+256, S3);

          copy(K4, K4+256, S4);

          copy(keys, keys+18, key);

    } 

     В конструкторе встречается функция  copy, это функция, которая копирует содержимое из одного массива в другой. В качестве первого параметра функции необходимо указать место в массиве, с которого производится копирование, в качестве второго параметра указывается  место в массиве, до которого производится копирование и в качестве третьего параметра указывается массив, в который производится копирование.

     Деструктор  представляет собой функцию, которую C++ автоматически запускает, когда  он или программа уничтожает объект. Деструктор имеет такое же имя, как  и класс объекта; однако имя деструктора предваряется символом тильды (~). Деструктор нашего класса имеет следующий вид: 

     TBlowfish::~TBlowfish(){} 

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

      Опишем  метод, который будет производить  шифрование данных. Данный метод имеет  следующий вид:  

    unsigned long long TBlowfish::Encrypt(unsigned long long block){

          unsigned int block_p=0,block_l=0,temp=0;

          block_p=block & mask;

          block_l=(block >> 32) & mask;

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

                block_l=block_l^key[i];

                block_p=block_p^F(block_l);

                if (i != 15){

                      temp=block_p;

                      block_p=block_l;

                      block_l=temp;

                }

          }

          block_l=block_l^key[17];

          block_p=block_p^key[16];

          unsigned long long result=block_l;

          result=(result << 32) | block_p;

          return result;

    } 

     Данный  метод на вход принимает 64 битный блок данных, которые записывается в переменную block. После того как была вызвана функция, в соответствии с описанным во 2 главе алгоритмом, входной 64 битный блок делится на два блока по 32 бита. Правые 32 бита записывается в переменную block_p, а второй 32 битный блок данных записывается в переменную block_l. Для определения первых и вторых 32 бит используется наложение маски на 64 битный блок. В качестве маски используется переменная mask, она инициализирована в заголовочном файле (см. приложение 2). Затем в цикле от 0 до 16 на второй 32 битный блок накладывается i-ый ключ, после чего полученный 32 битный блик подается на вход функции F, которая будет описана нами далее. После выполнения всех 16 раундов происходит наложение 17-го подключа на левый блок и 18-го подключа на правый блок. Затем эти блоки меняются мести и объединяются в один 64 битный блок данных. Полученный 64 битный блок данных и будет результатом шифрования.

     Опишем  метод F, который был использован нами в функции шифровании. Этот метод выглядит следующим образом: 

    unsigned int TBlowfish::F(unsigned int sub_block){

          short x1=0,x2=0,x3=0,x4=0;

          x1=sub_block & 0xFF; x2=(sub_block >> 8) & 0xFF;

          x3=(sub_block >> 16) & 0xFF; x4=(sub_block >> 24) & 0xFF;

          unsigned int y1=0,y2=0,y3=0,y4=0,temp=0;

          y1=S1[x1];

          y2=S2[x2];

          y3=S3[x3];

          y4=S4[x4];

          temp=(y1+y2)% mask;

          temp^=y3;

          temp=(temp+y4) % mask;

          return temp;

    } 

     На  вход данный метод принимает 32 битный блок данных. После того как метод был вызван входной 32 битный блок делиться на четыре 8-ми битные блоки. Для определения 8-ми битного блока используется наложение маски на число. После того, как были определены все 4 блока, они подвергаются процедуре замены в соответствии с таблицами замен. Каждый блок подвергается замене по соответствующей таблице замены. После замены 8-ми битные блоки расширяются до 32 бит. После чего происходит сложение первого и второго блока по модулю 232, а затем полученный результат складывается по модулю 2 с третьим блоком. Полученный результат на предыдущем шаге складывается по модулю 232 с последними 32 битами. Это и будет результатом выполнения данной функции.

     Рассмотрим  реализацию метода, который производит расшифрование данных. Его код выглядит следующим образом: 

    unsigned long long TBlowfish::Decrypt(unsigned long long block){

          unsigned int block_p=0,block_l=0,temp=0;

          block_p=block & mask;

          block_l=(block >> 32) & mask;

          for (int i=17;i>1;i--){

                block_l=block_l^key[i];

                block_p=block_p^F(block_l);

                temp=block_p;

                block_p=block_l;

                block_l=temp;

          }

          block_p=block_p^key[0];

          block_l=block_l^key[1];

          temp=block_p;

          block_p=block_l;

          block_l=temp;

          unsigned long long result=block_l;

          result=(result << 32) | block_p;

          return result;

    } 

     Данный  метод аналогичен работе методу для  шифрования данных, отличие заключается  в порядке использования ключей шифрования. В данном методе ключи  используются в обратном порядке.

     Опишем  метод initialization. Данный метод на вход принимает ключ и производит инициализацию всех таблиц (таблиц замен и таблицу ключей шифрования). Его программный код выглядит следующим образом: 

    void TBlowfish::initialization(unsigned int* kluch){

          int j=0;

          for (int i=0;i<18;i++){

                if (j>=8) j%=8;

                key[i]=key[i]^kluch[j];

          }

          final(key,18);

          final(S1,256);

          final(S2,256);

          final(S3,256);

          final(S4,256);

    } 

     Как уже говорилось выше, функция на вход принимает ключ шифрования, а  точнее указатель на массив, в котором  хранится ключ для шифрования. Данный метод накладывает на таблицу ключей ключ, который используется для шифрования, а так же в этом методе происходит шифрование таблиц замен и таблицу с ключами шифрования.

     В выше указанном методе используется вспомогательный метод final. Программный код которого выглядит следующим образом: 

    void TBlowfish::final(unsigned int* mass, int len){

          unsigned long long bl=0x0;

          for (int i=0; i<len;i+=2){ 

                      bl=Encrypt(bl);

                      mass[i]=bl & mask;

                      mass[i+1]=(bl >> 32) & mask;

          }

    } 

     Данный  метод на вход принимает указатель  на массив и количество элементов  в этом массиве. Он написан для того, что бы упростить программный код программы. И выполняет шифрование массива, который подается на вход этого метода.

 

     

  1. ОПИСАНИ РАБОТЫ С ПРОГРАММНЫМ ПРОДУКТОМ
    1. Минимальные требования для работы программного продукта
 

     Для нормальной работы программного продукта необходимо:

    • Операционная система — Windows 2000 / XP / Vista / Seven;
    • 15 Мб оперативной памяти;
    • Наличие 1,27 Мб свободного места на жестком диске;
    • Платформа – x86.
    1. Шифрование  данных
 

     Для того, что бы зашифровать данные при помощи этой программой необходимо выполнить следующие действия:

  1. Из предложенных действий выбрать «Шифровать»;
  2. Необходимо выбрать файл, который Вы хотите зашифровать. Для этого нажмите на кнопку «Выбрать файл» (см. рис. 3);

Рисунок 3. – Главное окно программы

  1. После этого появится диалоговое окно, в котором Вы выбираете файл для шифрования (см. рис. 4);

Информация о работе Шифрование данных. Алгоритм Blowfish