Лаб. раб 5
.docxМинистерство Образования и Науки Кыргызской Республики
Кыргызский Государственный Технический Университет
им. И. Раззакова
Отчет
По дисциплине: Криптография
Бишкек 2020 год
Лабораторная работа №5
Реализуем 3 блока:
перестановка с расширением
сложением с ключом (ключом будем считать константу из 48 бит)
подстановка в S-блоке, то есть сжатие.
Первоначально на вход задаете константу из 32 бит.
Эти действия повторяем 16 раундов, результат каждого раунда, используется в качестве входя для следующего раунда.
После последнего цикла выводим результат.
Все промежутожные результаты также сохраняем и выводим на экран.
Входные данные
Текст: 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();
}