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

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


 

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

8586. Критическая философия И. Канта 32.5 KB
  Критическая философия И. Канта Основоположником немецкой классической философии является Иммануил Кант. Все творчество И. Канта можно разделить на два больших периода: докритический и критический. В докритический период И. Кант стоял н...
8587. Объективный идеализм Г.В.Ф. Гегеля 31.5 KB
  Объективный идеализм Г.В.Ф. Гегеля. Гегель в своей философии преимущество и первенство отдавал духу (философскому мышлению) над материей, то его справедливо называют идеалистом а поскольку он отрицал взгляды субъективных идеалистов и считал, что в ...
8588. Антропологический материализм Л.Фейербаха 33 KB
  Антропологический материализм Л.Фейербаха. Фейербах - последовательный и воинствующий материалист. Для него в мире существует лишь одно бытие - материя. Для него Материя и Бытие понятия тождественные, и он часто употребляет одно понятие вместо д...
8589. Кризис классической философии. Становление и развитие неклассической философии, ее основные черты 32 KB
  Кризис классической философии. Становление и развитие неклассической философии, ее основные черты. Кризис классической философии. Кризис классической философии и рациональности во второй половине XIX в. обнажает проблемы иррационального, интуитивног...
8590. Гуманитарно-антропологическое направление постклассической философии: философия жизни, экзистенциализм, неотомизм 34 KB
  Гуманитарно-антропологическое направление постклассической философии: философия жизни, экзистенциализм, неотомизм. Философия жизни. Философия жизни - направление в западно-европейской философской мысли, сложившееся в последней трети 19 в. в Гер...
8591. Сциентистское направление: позитивизм. Формы позитивизма 29.5 KB
  Сциентистское направление: позитивизм. Формы позитивизма. Сциентистское направление: позитивизм. Сциентизм в философии возникает как реакция на натурфилософичность и абстрактность схем классической философии, которые, по мнению представителей данног...
8592. Постпозитивизм и философия науки 31 KB
  Постпозитивизм и философия науки. Понятие постпозитивизм охватывает собой пришедшую на смену неопозитивизму широкую совокупность концепций. Постпозитивизм в настоящее время не отличается большой внутренней однородностью: по многим вопросам существуе...
8593. Основные идеи феноменологии 31 KB
  Основные идеи феноменологии. Феноменология - течение западной философии 20 в. Хотя сам термин Феноменология использовался еще Кантом и Гегелем, широкое распространение он получил благодаря Гуссерлю, который создал масштабный проект феноменологи...
8594. Основные идеи русской религиозной философии 31 KB
  Основные идеи русской религиозной философии. Самобытная русская философия в своих новаторских исканиях теснейшим образом была связана с религиозным мировоззрением, за которым стояли века духовного опыта России. И не просто с религиозным, а именно с ...