20942

Шифрування та дешифрування даних за допомогою блокових алгоритмів

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

Информатика, кибернетика и программирование

Програма дешифрування інформації (повернення початкового вигляду файла) а також оцінити правильність процедури шифрування – дешифрування (відсутність зміни результату відносно початкового файлу).

Украинкский

2017-03-13

321.24 KB

8 чел.

Міністерство освіти, науки, молоді та спорту України

Національний технічний Університет “ХПІ”

“ХАРКІВСКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”

Кафедра “ Обчислювальна техніка та програмування ”

Лабораторна робота №5

по курсу “Захист інформації у комп’ютерних системах та мережах”

 

                                                                                                Виконав:

                                                                                                      ст. гр КІТ 39

 Родін С.І

                                                                                                 Перевірив:

Межерицький С.Г

Харків 2012

Варіант №15

Тема: “Шифрування та дешифрування даних за допомогою

блокових алгоритмів”

Мета роботи:  Створення програм для шифрування та дешифрування інформації за допомогою шифрів підстановки.

Постановка задачі

Необхідно розробити і налагодити дві програми:

 Програма шифрування інформації з використанням визначених алгоритмів.

 У якості інформації використовувати копію файлу з розробленою програмою.

 програма дешифрування інформації (повернення початкового вигляду файла) а також оцінити правильність процедури “шифрування – дешифрування” (відсутність зміни результату відносно початкового файлу).

Завдання:

Алгоритм Blowfish

Вхідний файл:

До стиснення

Текст програми:

#include "blowfish.h"

#include "blowfish2.h" // holds the random digit tables

#define S(x,i) (SBoxes[i][x.w.byte##i])

#define bf_F(x) (((S(x,0) + S(x,1)) ^ S(x,2)) + S(x,3))

#define ROUND(a,b,n) (a.dword ^= bf_F(b) ^ PArray[n])

CBlowFish::CBlowFish (){

 PArray = new DWORD [18] ;

 SBoxes = new DWORD [4][256] ;}

CBlowFish::~CBlowFish (){

 delete PArray ;

 delete [] SBoxes ;}

 // the low level (private) encryption function

void CBlowFish::Blowfish_encipher (DWORD *xl, DWORD *xr){

 union aword  Xl, Xr ;

Xl.dword = *xl ;

Xr.dword = *xr ;

Xl.dword ^= PArray [0];

ROUND (Xr, Xl, 1) ;  ROUND (Xl, Xr, 2) ;

ROUND (Xr, Xl, 3) ;  ROUND (Xl, Xr, 4) ;

ROUND (Xr, Xl, 5) ;  ROUND (Xl, Xr, 6) ;

ROUND (Xr, Xl, 7) ;  ROUND (Xl, Xr, 8) ;

ROUND (Xr, Xl, 9) ;  ROUND (Xl, Xr, 10) ;

ROUND (Xr, Xl, 11) ; ROUND (Xl, Xr, 12) ;

ROUND (Xr, Xl, 13) ; ROUND (Xl, Xr, 14) ;

ROUND (Xr, Xl, 15) ; ROUND (Xl, Xr, 16) ;

Xr.dword ^= PArray [17] ;

*xr = Xl.dword ;

*xl = Xr.dword ;}

 // the low level (private) decryption function

void CBlowFish::Blowfish_decipher (DWORD *xl, DWORD *xr){

  union aword  Xl ;

  union aword  Xr ;

  Xl.dword = *xl ;

  Xr.dword = *xr ;

  Xl.dword ^= PArray [17] ;

  ROUND (Xr, Xl, 16) ;  ROUND (Xl, Xr, 15) ;

  ROUND (Xr, Xl, 14) ;  ROUND (Xl, Xr, 13) ;

  ROUND (Xr, Xl, 12) ;  ROUND (Xl, Xr, 11) ;

  ROUND (Xr, Xl, 10) ;  ROUND (Xl, Xr, 9) ;

  ROUND (Xr, Xl, 8) ;   ROUND (Xl, Xr, 7) ;

  ROUND (Xr, Xl, 6) ;   ROUND (Xl, Xr, 5) ;

  ROUND (Xr, Xl, 4) ;   ROUND (Xl, Xr, 3) ;

  ROUND (Xr, Xl, 2) ;   ROUND (Xl, Xr, 1) ;

  Xr.dword ^= PArray[0];

  *xl = Xr.dword;

  *xr = Xl.dword;}

 // constructs the enctryption sieve

void CBlowFish::Initialize (BYTE key[], int keybytes){

 int    i, j ;

DWORD    data, datal, datar ;

 union aword temp ;

 // first fill arrays from data tables

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

 PArray [i] = bf_P [i] ;

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

  for (j = 0 ; j < 256 ; j++)

   SBoxes [i][j] = bf_S [i][j] ;}

j = 0 ;

 for (i = 0 ; i < NPASS + 2 ; ++i){

 temp.dword = 0 ;

 temp.w.byte0 = key[j];

 temp.w.byte1 = key[(j+1) % keybytes] ;

 temp.w.byte2 = key[(j+2) % keybytes] ;

 temp.w.byte3 = key[(j+3) % keybytes] ;

 data = temp.dword ;

 PArray [i] ^= data ;

 j = (j + 4) % keybytes ;}

datal = 0 ;

datar = 0 ;

 for (i = 0 ; i < NPASS + 2 ; i += 2){

 Blowfish_encipher (&datal, &datar) ;

 PArray [i] = datal ;

 PArray [i + 1] = datar ;}

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

 for (j = 0 ; j < 256 ; j += 2){

   Blowfish_encipher (&datal, &datar) ;

   SBoxes [i][j] = datal ;

   SBoxes [i][j + 1] = datar ;}}}

 // get output length, which must be even MOD 8

DWORD CBlowFish::GetOutputLength (DWORD lInputLong){

DWORD  lVal ;

lVal = lInputLong % 8 ; // find out if uneven number of bytes atthe end

 if (lVal != 0)

 return lInputLong + 8 - lVal ;

 else

 return lInputLong ;}

 // Encode pIntput into pOutput.  Input length in lSize.  Returned value

 // is length of output which will be even MOD 8 bytes.  Inputbuffer and

 // output buffer can be the same, but be sure buffer length is even MOD8.

DWORD CBlowFish::Encode (BYTE * pInput, BYTE * pOutput, DWORD lSize){

DWORD  lCount, lOutSize, lGoodBytes ;

BYTE *pi, *po ;

 int  i, j ;

 int  SameDest = (pInput == pOutput ? 1 : 0) ;

lOutSize = GetOutputLength (lSize) ;

 for (lCount = 0 ; lCount < lOutSize ; lCount += 8{

 if (SameDest) // if encoded data is being written into inputbuffer{

   if (lCount < lSize - 7) // if not dealing with unevenbytes at end{

     Blowfish_encipher ((DWORD *) pInput,

      (DWORD *) (pInput + 4)) ;}

   else  // pad end of data with null bytes tocomplete encryption{

   po = pInput + lSize ; // point at bytepast theend of actual data

   j = (int) (lOutSize - lSize) ; // number ofbytes to set to null

   for (i = 0 ; i < j ; i++)

    *po++ = 0 ;

     Blowfish_encipher ((DWORD *) pInput,

      (DWORD *) (pInput + 4)) ;}

   pInput += 8 ;}

 else    // output buffer not equal to inputbuffer, so must cop{               // input to output buffer prior to encrypting

   if (lCount < lSize - 7) // if not dealing with unevenbytes at end{

    pi = pInput ;

    po = pOutput ;

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

// copy bytes to output

     *po++ = *pi++ ;

     Blowfish_encipher ((DWORD *) pOutput, // nowencrypt them

      (DWORD *) (pOutput + 4)) ;}

   else  // pad end of data with null bytes tocomplete encryptio{

    lGoodBytes = lSize - lCount ; // number ofremaining data bytes

    po = pOutput ;

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

     *po++ = *pInput++ ;

    for (j = i ; j < 8 ; j++)

     *po++ = 0 ;

     Blowfish_encipher ((DWORD *) pOutput,

      (DWORD *) (pOutput + 4)) ;}

   pInput += 8 ;

   pOutput += 8 ;}}

 return lOutSize  }

 // Decode pIntput into pOutput.  Input length in lSize.  Inputbuffer and

 // output buffer can be the same, but be sure buffer length is even MOD8.

void CBlowFish::Decode (BYTE * pInput, BYTE * pOutput, DWORD lSize){

DWORD  lCount ;

BYTE *pi, *po ;

 int  i ;

 int  SameDest = (pInput == pOutput ? 1 : 0) ;

 for (lCount = 0 ; lCount < lSize ; lCount += 8){

 if (SameDest) // if encoded data is being written into inputbuffer{

    Blowfish_decipher ((DWORD *) pInput,

     (DWORD *) (pInput + 4)) ;

   pInput += 8 ;}

 else    // output buffer not equal to inputbuffer{               // so copy input to output before decoding

   pi = pInput ;

   po = pOutput ;

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

    *po++ = *pi++ ;

    Blowfish_decipher ((DWORD *) pOutput,

     (DWORD *) (pOutput + 4)) ;

   pInput += 8 ;

   pOutput += 8 ;}}}

Після стиснення

Алгоритм

Отриманий результат:

Рисунок 1- Результат роботи програми

Висновки: за час виконання лабораторної роботи створив программу для шифрування та дешифрування інформації за допомогою шифрів підстановки


 

А также другие работы, которые могут Вас заинтересовать

22629. Закони збереження та фундаментальні властивості простору і часу 62.5 KB
  Однорідний простір всі точки еквівалентні: L не змінюється при перенесені на нескінченно малий 1 довільне → Рівняння Лагранжа просумуємо по і тоді тобто оскільки закон збереження імпульсу є наслідком варіаційного принципу і однорідності простору. Однорідність часу = закон збереження енергії для ізольованих систем а також для незамкнених систем якщо зовнішні умови не змінюються з часом. Ізотропність простору еквівалентність всіх напрямків: L не зміниться якщо систему повернути на нескінченно малий кут навколо довільної...
22630. Рух тіл в інерціальних та неінерціальних системах відліку. Сили інерції. Коріолісове прискорення 75.5 KB
  Система відліку в якій прискорення матеріальної точки цілком обумовлено лише взаємодією її з іншими тілами а вільна матеріальна точка яка не підлягає дії ніяких інших тіл рухається відносно такої системи прямолінійно і рівномірно називається інерціальною системою відліку ІСВ. Твердження про те що такі системи відліку існують складає зміст 1ого закону Ньютона. Принцип відносності Галілея говорить про те що закони механіки не змінюють свого вигляду при переході від однієї системи відліку до іншої яка рухається рівномірно і прямолінійно....
22631. Закон руху матеріальних точок та твердого тіла 74 KB
  Запишемо другий закон Ньютона для матеріальної точки з даної системи: 1 де зовнішня сила що діє на іту м. Записавши 1 для кожної точки системи та просумувавши всі отриманні рівняння по і маємо: 2. Уведемо задає точкуцентр мас системи Центр мас рухається так ніби в ньому зосереджена вся маса системи. Повна кількість руху системи: = це математичне формулювання закону збереження імпульсу.
22632. Хвилі у пружному середовищі. Хвильове рівняння. Звукові хвилі 66 KB
  Хвилі у пружному середовищі. Звукові хвилі. Хвильовий процес характеризується фазовою швидкістю або швидкістю розповсюдження хвилі с груповою швидкістю або швидкістю розповсюдження хвильового пакету довжиною хвилі частотою або періодом коливань; між цими величинами існує простий звязок: . Довжина хвилі це відстань між частинками які коливаються з однаковою фазою.
22633. Рух ідеальної рідини. Рівняння Бернуллі 75 KB
  Рух ідеальної рідини. Ідеальна рідина внутрішнє тертя відсутнє сила тертя між окремими шарами рідини що тече рідина нестислива. Рівняння 1 для такої рідини має вигляд: Лінії потоку це лінії дотичні до яких в кожній точці співпадають за напрямом з вектором . При стаціонарному русі рідини її частинки при своєму русі не перетинають трубку потоку.
22634. Рух в’язкої рідини. Число Рейнольдса 39.5 KB
  Рух вязкої рідини. Розглянемо стаціонарну течію вязкої рідини в прямій горизонтальній трубі з постійним перерізом. Модуль сили внутрішнього тертя що прикладена до площини S яка лежить на границі між шарами:; або оскільки вісь z напрямлена вздовж радіусу η коефіцієнт вязкості залежить від природи і стану рідини. Виділимо з обєму рідини що тече циліндр радіусу r довжини l та запишемо умови його руху.
22635. Принцип найменшої дії та рівняння Лагранжа 80.5 KB
  Принцип найменшої дії та рівняння Лагранжа. функцією Лагранжа системи. Ці рівняння називаються рівняннями Лагранжа. Властивості функції Лагранжа: Якщо домножити функцію Лагранжа на деяку константу вигляд рівнянь руху не зміниться; Якщо система складається з двох не взаємодіючих частин A і B з функціями Лагранжа та то система описується функцією Лагранжа .
22636. Гамільтонова форма рівнянь руху класичної механіки 75.5 KB
  Тут величина являє собою енергію системи що виражена через координати і імпульси і називається функцією Гамільтона системи. Ці шукані рівняння в змінних і називаються рівняннями Гамільтона. Розглянемо повну похідну фції Гамільтона по часу . Підставимо сюди та з рівнянь Гамільтона.
22637. Основні положення і головні результати спеціальної теорії відносності 77 KB
  Ейнштейн побудував спеціальну теорію відносності на постулатах: фізичні закони формулюються однаково в усіх інерціальних системах відліку ІСВ; швидкість світла у вакуумі не залежить від руху джерела і є однаковою в усіх ІСВ. Якщо простір ізотропний і однорідний то виконується рівність де константа залежить від швидкості ІСВ. Для нерухомої другої ІСВ . Для оберненого перетворення перехід до першої ІСВ: .