20942

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

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

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

dword ^= bf_Fb ^ 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 ;} the low level private decryption function void CBlowFish::Blowfish_decipher DWORD xl DWORD xr{ union aword Xl ; union aword Xr ; Xl.dword;} constructs the enctryption sieve void CBlowFish::Initialize BYTE key[]...

Украинкский

2013-08-01

321.24 KB

6 чел.

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

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

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

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

Лабораторна робота №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- Результат роботи програми

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


 

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

2039. Вплив наркотиків і токсинів на самопочуття людини 38.5 KB
  Мета: сформувати уявлення про наркоманію як найбільш небезпечне соціальне явище, причини наркоманії та її профілактику.
2040. Нумо, хлопці! Виховний захід 40.5 KB
  Мета заходу: привітати хлопців із днем захисника Вітчизни, навчити бачити позитивні якості у кожній людині, розвивати художній смак, удосконалювати навички декламування.
2041. Урок-захід. У дружбі жити – не тужити 23.58 KB
  Мета: формувати уявлення дітей про дружбу і товаришування, вчити оцінювати свої вчинки і вчинки оточуючих людей, розвивати вміння аналізувати, робити висновки, виховувати дружелюбність, бажання бути другом.
2042. Бенкет-кава: особливості меню, сервірування, обслуговування 18.16 KB
  Бенкет-чай організовують у затишних невеликих залах, у яких встановлюють круглі й овальні столи, а якщо їх немає, то столи квадратної або прямокутної форми, стільці, крісла, напівкрісла, а іноді й дивани.
2043. Бенкет-фуршет: особливості сервірування та обслуговування 26 KB
  Для сервування столу використовують столовий посуд і набори, загальна кількість яких залежить від чисельності гостей і нормативу на одного гостя.
2044. Обслуговування учасників конференцій, фестивалів, форумів 18.01 KB
  Учасники вказаних заходів обслуговуються харчуванням за місцем роботи і проживання. У перервах між засіданнями може працювати буфет-фуршет, організований за місцем проведення засідання.
2045. Призначення санітарно-технічної та інженерно-технічної служб 38.03 KB
  Основним призначенням санітарно-технічної та інженерно-технічної служб підприємства готельного господарства є створення та підтримка умов для безперервного функціонування будівель та обладнання готельного підприємства, своєчасне проведення всіх видів ремонту та профілактичних заходів з метою запобігання збоїв у роботі всіх служб підприємства.
2046. Вимоги до коридорів, холів, їх оформлення 25.76 KB
  Основною вимогою до коридорів є відсутність будь-яких меблів і денне та штучне освітлення, що сприяє швидкому орієнтуванню у них споживачів готельних послуг.
2047. Кондиціонування. Ліфти 24.33 KB
  Вентиляція приміщень (провітрювання) є природною і функціонує за рахунок проникнення в приміщення повітря через відкриті вікна, кватирки, щілини в конструкціях будинків і щілі будівельних матеріалів.