Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. раб 5

.docx
Скачиваний:
11
Добавлен:
20.06.2021
Размер:
127.13 Кб
Скачать

Министерство Образования и Науки Кыргызской Республики

Кыргызский Государственный Технический Университет

им. И. Раззакова

Отчет

По дисциплине: Криптография

Бишкек 2020 год

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

Реализуем 3 блока:

  • перестановка с расширением

  • сложением с ключом (ключом будем считать константу из 48 бит)

  • подстановка в S-блоке, то есть сжатие.

  1. Первоначально на вход задаете константу из 32 бит.

  2. Эти действия повторяем 16 раундов, результат каждого раунда, используется в качестве входя для следующего раунда.

  3. После последнего цикла выводим результат.

Все промежутожные результаты также сохраняем и выводим на экран.

Входные данные

Текст: 00011111

Ключ: 1011011000

Результат работы

Рис1. Вводим наши входные данные

Рис 2. Процесс шифрования и дешифрования

Рис 2. Получаем результат 00011111

Реализация на С++

#include <iostream>

#include <windows.h>

#include <locale.h>

#include <string.h>

#include <conio.h>

#include <bitset>

using namespace std;

int main()

{

//------------------------------Ввод значений----------------------------

int i = 0;

int poradok[8] = { 1,2,3,4,5,6,7,8 };

byte text[8], K[10];

setlocale(LC_ALL, "Russian");

cout << "Введите текст(8 бит)" << endl;

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

cin >> text[i];

}

cout << "Введите ключ(10 бит)" << endl;

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

cin >> K[i];

}

cout << endl;

cout << endl;

cout << "Kлюч:" << endl;

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

{

cout << K[i] << " ";

}

cout << endl;

cout << "------------------------------" << endl;

//------------------------------Статичные ключи--------------------------

int IP[8] = { 4,8,5,7,2,6,3,1 };

int P10[10] = { 3,5,2,7,4,10,1,9,8,6 };

int P8[8] = { 6,3,7,4,8,5,10,9 };

int P4[4] = { 2,4,3,1 };

int EP[8] = { 4,1,2,3,2,3,4,1 };

int S0[4][4] = { { 1,0,3,2 },{ 3,2,1,0 },{ 0,2,1,3 },{ 3,1,3,2 } };

int S1[4][4] = { { 0,1,2,3 },{ 2,0,1,3 },{ 3,0,1,0 },{ 2,1,0,3 } };

//------------------------------Вычисление ключей------------------------

int P1[8];

byte K1[8], K2[8], KK[10] = { 0,0,0,0,0,0,0,0,0,0 };

//------P1

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

{

P1[IP[i] - 1] = poradok[i];

}

//------K1

//1

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

{

KK[i] = K[P10[i] - 1];

}

cout << "Результат перестановки P10:" << endl;

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

{

cout << KK[i] << " ";

}

cout << endl;

//2

byte KK1[5], KK2[5];

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

{

KK1[i] = KK[i];

KK2[i] = KK[i + 5];

}

cout << "Циклический сдвиг влево на 1 позицию(по 5 бит):" << endl;

int size = 5, temp = KK1[0];

for (i = 0, size--; i < size; i++) KK1[i] = KK1[i + 1];

KK1[size] = temp;

size = 5, temp = KK2[0];

for (i = 0, size--; i < size; i++) KK2[i] = KK2[i + 1];

KK2[size] = temp;

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

{

KK[i] = KK1[i];

KK[i + 5] = KK2[i];

}

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

{

cout << KK[i] << " ";

}

cout << endl;

//3

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

{

K1[i] = KK[P8[i] - 1];

}

cout << "Ключ K1(перестановка Р8):" << endl;

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

{

cout << K1[i] << " ";

}

cout << endl;

cout << "------------------------------" << endl;

//------K2

//1

cout << "Циклический сдвиг влево на 2 позиции(по 5 бит):" << endl;

size = 5, temp = KK1[0];

for (i = 0, size--; i < size; i++) KK1[i] = KK1[i + 1];

KK1[size] = temp;

size = 5, temp = KK2[0];

for (i = 0, size--; i < size; i++) KK2[i] = KK2[i + 1];

KK2[size] = temp;

size = 5, temp = KK1[0];

for (i = 0, size--; i < size; i++) KK1[i] = KK1[i + 1];

KK1[size] = temp;

size = 5, temp = KK2[0];

for (i = 0, size--; i < size; i++) KK2[i] = KK2[i + 1];

KK2[size] = temp;

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

{

KK[i] = KK1[i];

KK[i + 5] = KK2[i];

}

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

{

cout << KK[i] << " ";

}

cout << endl;

//2

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

{

K2[i] = KK[P8[i] - 1];

}

cout << "Ключ K2(перестановка Р8):" << endl;

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

{

cout << K2[i] << " ";

}

cout << endl;

cout << "------------------------------" << endl;

cout << endl;

//------------------------------Шифрование-------------------------------

cout << "Текст:" << endl;

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

{

cout << text[i] << " ";

}

cout << endl;

//1

byte cypher[8];

cout << "Результат IP перестановки:" << endl;

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

{

cypher[i] = text[IP[i] - 1];

cout << cypher[i] << " ";

}

cout << endl;

//2

byte EP2[4], EP1[4];

int k = 0;

cout << "Результат E/P перестановки:" << endl;

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

{

EP1[i] = cypher[i];

EP2[i] = cypher[i + 4];

}

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

{

cypher[i] = EP2[EP[i] - 1];

cout << cypher[i] << " ";

}

cout << endl;

//3

bool l;

bool cyp[8];

cout << "Результат XOR(cypher+K1):" << endl;

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

{

if (cypher[i] == K1[i]) l = 0;

else l = 1;

cyp[i] = l;

cout << cyp[i] << " ";

}

cout << endl;

//4

bool Brow[2], Bcol[2];

int row, col;

Brow[0] = cyp[0];

Brow[1] = cyp[3];

Bcol[0] = cyp[1];

Bcol[1] = cyp[2];

if ((Brow[0] == 0)&(Brow[1] == 0)) row = 0;

else if ((Brow[0] == 0)&(Brow[1] == 1)) row = 1;

else if ((Brow[0] == 1)&(Brow[1] == 0)) row = 2;

else if ((Brow[0] == 1)&(Brow[1] == 1)) row = 3;

if ((Bcol[0] == 0)&(Bcol[1] == 0)) col = 0;

else if ((Bcol[0] == 0)&(Bcol[1] == 1)) col = 1;

else if ((Bcol[0] == 1)&(Bcol[1] == 0)) col = 2;

else if ((Bcol[0] == 1)&(Bcol[1] == 1)) col = 3;

bool BF1[2], BF2[2], F[4];

int F1, F2;

F1 = S0[row][col];

if (F1 == 0) { BF1[0] = 0; BF1[1] = 0; }

else if (F1 == 1) { BF1[0] = 0; BF1[1] = 1; }

else if (F1 == 2) { BF1[0] = 1; BF1[1] = 0; }

else if (F1 == 3) { BF1[0] = 1; BF1[1] = 1; }

//-

Brow[0] = cyp[4];

Brow[1] = cyp[7];

Bcol[0] = cyp[5];

Bcol[1] = cyp[6];

if ((Brow[0] == 0)&(Brow[1] == 0)) row = 0;

else if ((Brow[0] == 0)&(Brow[1] == 1)) row = 1;

else if ((Brow[0] == 1)&(Brow[1] == 0)) row = 2;

else if ((Brow[0] == 1)&(Brow[1] == 1)) row = 3;

if ((Bcol[0] == 0)&(Bcol[1] == 0)) col = 0;

else if ((Bcol[0] == 0)&(Bcol[1] == 1)) col = 1;

else if ((Bcol[0] == 1)&(Bcol[1] == 0)) col = 2;

else if ((Bcol[0] == 1)&(Bcol[1] == 1)) col = 3;

F2 = S1[row][col];

if (F2 == 0) { BF2[0] = 0; BF2[1] = 0; }

else if (F2 == 1) { BF2[0] = 0; BF2[1] = 1; }

else if (F2 == 2) { BF2[0] = 1; BF2[1] = 0; }

else if (F2 == 3) { BF2[0] = 1; BF2[1] = 1; }

F[0] = BF1[0];

F[1] = BF1[1];

F[2] = BF2[0];

F[3] = BF2[1];

cout << "Результат шифрования по таблицах S0/S1(F)" << endl;

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

{

cout << F[i] << " ";

}

cout << endl;

//5

cout << "Результат перестановки Р4:" << endl;

bool FF[4];

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

{

FF[i] = F[P4[i] - 1];

cout << FF[i] << " ";

}

cout << endl;

//6

cout << "Результат XOR(F+IP(1-4)):" << endl;

byte FFF[4];

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

{

FFF[i] = FF[i] ^ EP1[i];

cout << FFF[i] << " ";

}

cout << endl;

//7

cout << "Результат сумирования с правой частью(F+IP(4-8))" << endl;

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

{

cypher[i] = FFF[i];

cypher[i + 4] = EP2[i];

}

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

{

cout << cypher[i] << " ";

}

cout << endl;

//8

byte Swap1[4], Swap2[4];

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

{

Swap1[i] = cypher[i];

Swap2[i] = cypher[i + 4];

}

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

{

cypher[i] = Swap2[i];

cypher[i + 4] = Swap1[i];

}

cout << "Результат свапа(по 4 бита)" << endl;

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

{

cout << cypher[i] << " ";

}

cout << endl;

//9

cout << "Результат E/P перестановки:" << endl;

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

{

EP1[i] = cypher[i];

EP2[i] = cypher[i + 4];

}

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

{

cypher[i] = EP2[EP[i] - 1];

cout << cypher[i] << " ";

}

cout << endl;

//10

cout << "Результат XOR(cypher+K2):" << endl;

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

{

if (cypher[i] == K2[i]) l = 0;

else l = 1;

cyp[i] = l;

cout << cyp[i] << " ";

}

cout << endl;

//11

Brow[0] = cyp[0];

Brow[1] = cyp[3];

Bcol[0] = cyp[1];

Bcol[1] = cyp[2];

if ((Brow[0] == 0)&(Brow[1] == 0)) row = 0;

else if ((Brow[0] == 0)&(Brow[1] == 1)) row = 1;

else if ((Brow[0] == 1)&(Brow[1] == 0)) row = 2;

else if ((Brow[0] == 1)&(Brow[1] == 1)) row = 3;

if ((Bcol[0] == 0)&(Bcol[1] == 0)) col = 0;

else if ((Bcol[0] == 0)&(Bcol[1] == 1)) col = 1;

else if ((Bcol[0] == 1)&(Bcol[1] == 0)) col = 2;

else if ((Bcol[0] == 1)&(Bcol[1] == 1)) col = 3;

F1 = S0[row][col];

if (F1 == 0) { BF1[0] = 0; BF1[1] = 0; }

else if (F1 == 1) { BF1[0] = 0; BF1[1] = 1; }

else if (F1 == 2) { BF1[0] = 1; BF1[1] = 0; }

else if (F1 == 3) { BF1[0] = 1; BF1[1] = 1; }

//-

Brow[0] = cyp[4];

Brow[1] = cyp[7];

Bcol[0] = cyp[5];

Bcol[1] = cyp[6];

if ((Brow[0] == 0)&(Brow[1] == 0)) row = 0;

else if ((Brow[0] == 0)&(Brow[1] == 1)) row = 1;

else if ((Brow[0] == 1)&(Brow[1] == 0)) row = 2;

else if ((Brow[0] == 1)&(Brow[1] == 1)) row = 3;

if ((Bcol[0] == 0)&(Bcol[1] == 0)) col = 0;

else if ((Bcol[0] == 0)&(Bcol[1] == 1)) col = 1;

else if ((Bcol[0] == 1)&(Bcol[1] == 0)) col = 2;

else if ((Bcol[0] == 1)&(Bcol[1] == 1)) col = 3;

F2 = S1[row][col];

if (F2 == 0) { BF2[0] = 0; BF2[1] = 0; }

else if (F2 == 1) { BF2[0] = 0; BF2[1] = 1; }

else if (F2 == 2) { BF2[0] = 1; BF2[1] = 0; }

else if (F2 == 3) { BF2[0] = 1; BF2[1] = 1; }

F[0] = BF1[0];

F[1] = BF1[1];

F[2] = BF2[0];

F[3] = BF2[1];

cout << "Результат шифрования по таблицах S0/S1(F)" << endl;

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

{

cout << F[i] << " ";

}

cout << endl;

//12

cout << "Результат перестановки Р4:" << endl;

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

{

FF[i] = F[P4[i] - 1];

cout << FF[i] << " ";

}

cout << endl;

//13

cout << "Результат XOR(F+Swap(1-4)):" << endl;

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

{

FFF[i] = FF[i] ^ EP1[i];

cout << FFF[i] << " ";

}

cout << endl;

//14

cout << "Результат сумирования с правой частью(F+Swap(4-8))" << endl;

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

{

cypher[i] = FFF[i];

cypher[i + 4] = EP2[i];

}

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

{

cout << cypher[i] << " ";

}

cout << endl;

//15

cout << "Результат шифрования(перестановка IP-1):" << endl;

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

{

text[i] = cypher[P1[i] - 1];

cout << text[i] << " ";

}

cout << endl;

cout << "----------------------------" << endl << endl;

//------------------------------Расшифровка------------------------------

cout << "Шифр:" << endl;

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

{

cout << text[i] << " ";

}

cout << endl;

//1

cout << "Результат IP перестановки:" << endl;

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

{

cypher[i] = text[IP[i] - 1];

cout << cypher[i] << " ";

}

cout << endl;

//2

cout << "Результат E/P перестановки:" << endl;

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

{

EP1[i] = cypher[i];

EP2[i] = cypher[i + 4];

}

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

{

cypher[i] = EP2[EP[i] - 1];

cout << cypher[i] << " ";

}

cout << endl;

//3

cout << "Результат XOR(cypher+K2):" << endl;

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

{

if (cypher[i] == K2[i]) l = 0;

else l = 1;

cyp[i] = l;

cout << cyp[i] << " ";

}

cout << endl;

//4

Brow[0] = cyp[0];

Brow[1] = cyp[3];

Bcol[0] = cyp[1];

Bcol[1] = cyp[2];

if ((Brow[0] == 0)&(Brow[1] == 0)) row = 0;

else if ((Brow[0] == 0)&(Brow[1] == 1)) row = 1;

else if ((Brow[0] == 1)&(Brow[1] == 0)) row = 2;

else if ((Brow[0] == 1)&(Brow[1] == 1)) row = 3;

if ((Bcol[0] == 0)&(Bcol[1] == 0)) col = 0;

else if ((Bcol[0] == 0)&(Bcol[1] == 1)) col = 1;

else if ((Bcol[0] == 1)&(Bcol[1] == 0)) col = 2;

else if ((Bcol[0] == 1)&(Bcol[1] == 1)) col = 3;

F1 = S0[row][col];

if (F1 == 0) { BF1[0] = 0; BF1[1] = 0; }

else if (F1 == 1) { BF1[0] = 0; BF1[1] = 1; }

else if (F1 == 2) { BF1[0] = 1; BF1[1] = 0; }

else if (F1 == 3) { BF1[0] = 1; BF1[1] = 1; }

Brow[0] = cyp[4];

Brow[1] = cyp[7];

Bcol[0] = cyp[5];

Bcol[1] = cyp[6];

if ((Brow[0] == 0)&(Brow[1] == 0)) row = 0;

else if ((Brow[0] == 0)&(Brow[1] == 1)) row = 1;

else if ((Brow[0] == 1)&(Brow[1] == 0)) row = 2;

else if ((Brow[0] == 1)&(Brow[1] == 1)) row = 3;

if ((Bcol[0] == 0)&(Bcol[1] == 0)) col = 0;

else if ((Bcol[0] == 0)&(Bcol[1] == 1)) col = 1;

else if ((Bcol[0] == 1)&(Bcol[1] == 0)) col = 2;

else if ((Bcol[0] == 1)&(Bcol[1] == 1)) col = 3;

F2 = S1[row][col];

if (F2 == 0) { BF2[0] = 0; BF2[1] = 0; }

else if (F2 == 1) { BF2[0] = 0; BF2[1] = 1; }

else if (F2 == 2) { BF2[0] = 1; BF2[1] = 0; }

else if (F2 == 3) { BF2[0] = 1; BF2[1] = 1; }

F[0] = BF1[0];

F[1] = BF1[1];

F[2] = BF2[0];

F[3] = BF2[1];

cout << "Результат дешифрования по таблицах S0/S1(F)" << endl;

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

{

cout << F[i] << " ";

}

cout << endl;

//5

cout << "Результат перестановки Р4:" << endl;

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

{

FF[i] = F[P4[i] - 1];

cout << FF[i] << " ";

}

cout << endl;

//6

cout << "Результат XOR(F+IP(1-4)):" << endl;

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

{

FFF[i] = FF[i] ^ EP1[i];

cout << FFF[i] << " ";

}

cout << endl;

//7

cout << "Результат сумирования с правой частью(F+IP(4-8))" << endl;

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

{

cypher[i] = FFF[i];

cypher[i + 4] = EP2[i];

}

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

{

cout << cypher[i] << " ";

}

cout << endl;

//8

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

{

Swap1[i] = cypher[i];

Swap2[i] = cypher[i + 4];

}

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

{

cypher[i] = Swap2[i];

cypher[i + 4] = Swap1[i];

}

cout << "Результат свапа(по 4 бита)" << endl;

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

{

cout << cypher[i] << " ";

}

cout << endl;

//9

cout << "Результат E/P перестановки:" << endl;

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

{

EP1[i] = cypher[i];

EP2[i] = cypher[i + 4];

}

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

{

cypher[i] = EP2[EP[i] - 1];

cout << cypher[i] << " ";

}

cout << endl;

//10

cout << "Результат XOR(cypher+K1):" << endl;

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

{

if (cypher[i] == K1[i]) l = 0;

else l = 1;

cyp[i] = l;

cout << cyp[i] << " ";

}

cout << endl;

//11

Brow[0] = cyp[0];

Brow[1] = cyp[3];

Bcol[0] = cyp[1];

Bcol[1] = cyp[2];

if ((Brow[0] == 0)&(Brow[1] == 0)) row = 0;

else if ((Brow[0] == 0)&(Brow[1] == 1)) row = 1;

else if ((Brow[0] == 1)&(Brow[1] == 0)) row = 2;

else if ((Brow[0] == 1)&(Brow[1] == 1)) row = 3;

if ((Bcol[0] == 0)&(Bcol[1] == 0)) col = 0;

else if ((Bcol[0] == 0)&(Bcol[1] == 1)) col = 1;

else if ((Bcol[0] == 1)&(Bcol[1] == 0)) col = 2;

else if ((Bcol[0] == 1)&(Bcol[1] == 1)) col = 3;

F1 = S0[row][col];

if (F1 == 0) { BF1[0] = 0; BF1[1] = 0; }

else if (F1 == 1) { BF1[0] = 0; BF1[1] = 1; }

else if (F1 == 2) { BF1[0] = 1; BF1[1] = 0; }

else if (F1 == 3) { BF1[0] = 1; BF1[1] = 1; }

//-

Brow[0] = cyp[4];

Brow[1] = cyp[7];

Bcol[0] = cyp[5];

Bcol[1] = cyp[6];

if ((Brow[0] == 0)&(Brow[1] == 0)) row = 0;

else if ((Brow[0] == 0)&(Brow[1] == 1)) row = 1;

else if ((Brow[0] == 1)&(Brow[1] == 0)) row = 2;

else if ((Brow[0] == 1)&(Brow[1] == 1)) row = 3;

if ((Bcol[0] == 0)&(Bcol[1] == 0)) col = 0;

else if ((Bcol[0] == 0)&(Bcol[1] == 1)) col = 1;

else if ((Bcol[0] == 1)&(Bcol[1] == 0)) col = 2;

else if ((Bcol[0] == 1)&(Bcol[1] == 1)) col = 3;

F2 = S1[row][col];

if (F2 == 0) { BF2[0] = 0; BF2[1] = 0; }

else if (F2 == 1) { BF2[0] = 0; BF2[1] = 1; }

else if (F2 == 2) { BF2[0] = 1; BF2[1] = 0; }

else if (F2 == 3) { BF2[0] = 1; BF2[1] = 1; }

F[0] = BF1[0];

F[1] = BF1[1];

F[2] = BF2[0];

F[3] = BF2[1];

cout << "Результат дешифрования по таблицах S0/S1(F)" << endl;

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

{

cout << F[i] << " ";

}

cout << endl;

//12

cout << "Результат перестановки Р4:" << endl;

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

{

FF[i] = F[P4[i] - 1];

cout << FF[i] << " ";

}

cout << endl;

//13

cout << "Результат XOR(F+Swap(1-4)):" << endl;

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

{

FFF[i] = FF[i] ^ EP1[i];

cout << FFF[i] << " ";

}

cout << endl;

//14

cout << "Результат сумирования с правой частью(F+Swap(4-8))" << endl;

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

{

cypher[i] = FFF[i];

cypher[i + 4] = EP2[i];

}

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

{

cout << cypher[i] << " ";

}

cout << endl;

//15

cout << "Результат дешифрования(перестановка IP-1):" << endl;

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

{

text[i] = cypher[P1[i] - 1];

cout << text[i] << " ";

}

cout << endl;

cout << "----------------------------" << endl << endl;

//----------------------------Закрытие программы-----------------------

_getch();

}