Professional Documents
Culture Documents
L1
L1
Київ 2020
Постановка задачі.
Написати код шифрування та дешифрування масиву інформації
за допомогою трьох алгоритмів (Полібіанський квадрат,
Плейфер, Віженер).
if (f)
{
l_ins(latin);
p = prep_l;
}
else
{
u_ins(ukr);
p = prep_u;
}
strcpy(text, p(text));
cout << text << endl;
char* prep_l(char*temp)
{
char s[50]{};
char * path;
char r[12] = " ,./!?;:\"\'";
path = strtok(temp, r);
do{
strcat(s, path);
} while (path = strtok(NULL, r));
path = s;
while (*path)
{
*path = toupper(*path);
if (*path == 'J')
*path = 'I';
path++;
}
return s;
}
char* prep_u(char*temp)
{
int c;
char s[50]{};
char * path;
char r[14] = "üÜ ,./!?;:\"\'";
path = strtok(temp, r);
do{
strcat(s, path);
} while (path = strtok(NULL, r));
path = s;
while (*path)
{
if (*path == 'i')
*path = 'I';
else if (*path == 'º' || *path == 'ª')
*path = 'Å';
else if (*path == '¿' || *path == '¯')
*path = 'I';
else if (*path == 'é' || *path == 'É')
*path = 'È';
else if (*path > -33)
*path -= 32;
path++;
}
return s;
}
int a1[100];
int a2[100];
int k = 0;
int main() {
return 0;
}
Результат роботи
Метод 1
Метод 2
Алгоритм Плейфера
Програмна реалізація
#define _CRT_SECURE_NO_WARNINGS
#define LATIN /*UKR*/
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
struct latin
{
char alphabet[26];
char keyword[20];
char square[5][5];
bool select[25];
int size;
latin(char*);
char* operator+(char*);
char* operator-(char*);
};
struct ukr
{
char alphabet[29];
char keyword[20];
char square[4][7];
bool select[28];
int size;
ukr(char*);
char* operator+(char*);
char* operator-(char*);
};
char* prep_l(char*);
char* prep_u(char*);
void main()
{
setlocale(0, "");
bool f;
#ifdef LATIN
f = true;
#endif
#ifdef UKR
f = false;
#endif
char keyword[20]{}, *el = "Londinium is the city of blood and wine.",
*um = "Êîëè çàéìàºøüñÿ ïîëiòèêîþ, äié, ÿê ãðîìàäÿíèí.";
char text[50]{}, cipher[50]{}, rez[50]{};;
if (f)
cout << strcpy(text, prep_l(strcpy(text, el))) << endl;
else
cout << strcpy(text, prep_u(strcpy(text, um))) << endl;
if (f)
{
cout << "enter your keyword at least 20 characters without spaces: ";
cin >> keyword;
strcpy(keyword, prep_l(keyword));
}
else
{
cout << " ââåäiòü êëþ÷îâå ñëîâî íå áiëüø íiæ 20 ñèìâîëiâ áåç ïðîïóñêiâ: ";
SetConsoleCP(1251);
cin >> keyword;
SetConsoleCP(866);
strcpy(keyword, prep_u(keyword));
}
#ifdef LATIN
latin sl(keyword);
strcpy(cipher, sl + text);
#endif
#ifdef UKR
ukr su(keyword);
strcpy(cipher, su + text);
#endif
cout << cipher << endl;
#ifdef LATIN
strcpy(rez, sl - cipher);
#endif
#ifdef UKR
strcpy(rez, su - cipher);
#endif
cout << rez << endl;
}
char* prep_l(char*temp)
{
char s[50]{};
char * path;
char r[12] = " ,./!?;:\"\'";
path = strtok(temp, r);
do{
strcat(s, path);
} while (path = strtok(NULL, r));
path = s;
while (*path)
{
*path = toupper(*path);
if (*path == 'J')
*path = 'I';
path++;
}
return s;
}
char* prep_u(char*temp)
{
int c;
char s[50]{};
char * path;
char r[14] = "üÜ ,./!?;:\"\'";
path = strtok(temp, r);
do{
strcat(s, path);
} while (path = strtok(NULL, r));
path = s;
while (*path)
{
if (*path == 'i')
*path = 'I';
else if (*path == 'º' || *path == 'ª')
*path = 'Å';
else if (*path == '¿' || *path == '¯')
*path = 'I';
else if (*path == 'é' || *path == 'É')
*path = 'È';
else if (*path > -33)
*path -= 32;
path++;
}
return s;
}
latin::latin(char*s)
{
strcpy(keyword, s);
strcpy(alphabet, "ABCDEFGHIKLMNOPQRSTUVWXYZ");
size = strlen(keyword);
for (int i = 0; i < 25; i++)
select[i] = true;
int k = 0;
for (int i = 0; i < 25; i++)
for (int j = 0; j < size; j++)
while (keyword[j] == alphabet[i])
{
if (select[i])
{
select[i] = false;
break;
}
else
{
k = j;
while (keyword[k])
keyword[k] = keyword[k++ + 1];
size--;
}
}
int l = k = 0;
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
if (k < size)
square[i][j] = keyword[k++];
else
{
while (!select[l])l++;
square[i][j] = alphabet[l];
l++;
}
}
ukr::ukr(char*s)
{
strcpy(keyword, s);
strcpy(alphabet, "ÀÁÂÃÄÅÆÇÈIÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÞß");
size = strlen(keyword);
for (int i = 0; i < 28; i++)
select[i] = true;
int k = 0;
for (int i = 0; i < 28; i++)
for (int j = 0; j < size; j++)
while (keyword[j] == alphabet[i])
{
if (select[i])
{
select[i] = false;
break;
}
else
{
k = j;
while (keyword[k])
keyword[k] = keyword[k++ + 1];
size--;
}
}
int l = k = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 7; j++)
if (k < size)
square[i][j] = keyword[k++];
else
{
while (!select[l])l++;
square[i][j] = alphabet[l];
l++;
}
}
char* latin::operator+(char*s)
{
int i1, i2, j1, j2;
char*rez = new char[strlen(s) + 1];
for (int i = 0; i <= strlen(s); i += 2)
if (s[i] == '\0' || s[i + 1] == '\0')
{
rez[i] = s[i];
rez[i + 1] = '\0';
}
else if (s[i] == s[i + 1])
{
rez[i] = 'J';
rez[i + 1] = s[i];
}
else
{
for (int k = 0; k < 5; k++)
for (int j = 0; j < 5; j++)
{
if (s[i] == square[k][j])
{
i1 = k;
j1 = j;
}
if (s[i + 1] == square[k][j])
{
i2 = k;
j2 = j;
}
}
if (i1 == i2)
{
rez[i] = square[i1][(j1 + 1) % 5];
rez[i + 1] = square[i2][(j2 + 1) % 5];
}
else if (j1 == j2)
{
rez[i] = square[(i1 + 1) % 5][j1];
rez[i + 1] = square[(i2 + 1) % 5][j2];
}
else
{
rez[i] = square[i2][j1];
rez[i + 1] = square[i1][j2];
}
}
return rez;
}
char* latin::operator-(char*s)
{
int i1, i2, j1, j2;
char*rez = new char[strlen(s) + 1];
for (int i = 0; i <= strlen(s); i += 2)
if (i == strlen(s))
{
rez[i] = '\0';
rez[i + 1] = '\0';
}
else if (s[i + 1] == '\0')
{
rez[i] = s[i];
rez[i + 1] = '\0';
}
else if (s[i] == 'J')
{
rez[i] = s[i + 1];
rez[i + 1] = s[i + 1];
}
else
{
for (int k = 0; k < 5; k++)
for (int j = 0; j < 5; j++)
{
if (s[i] == square[k][j])
{
i1 = k;
j1 = j;
}
if (s[i + 1] == square[k][j])
{
i2 = k;
j2 = j;
}
}
if (i1 == i2)
{
rez[i] = square[i1][j1 - 1 < 0 ? 4 : j1 - 1];
rez[i + 1] = square[i2][j2 - 1 < 0 ? 4 : j2 - 1];
}
else if (j1 == j2)
{
rez[i] = square[i1 - 1 < 0 ? 4 : i1 - 1][j1];
rez[i + 1] = square[i2 - 1 < 0 ? 4 : i2 - 1][j2];
}
else
{
rez[i] = square[i2][j1];
rez[i + 1] = square[i1][j2];
}
}
return rez;
}
char* ukr::operator+(char*s)
{
int i1, i2, j1, j2;
char*rez = new char[strlen(s) + 1];
for (int i = 0; i <= strlen(s); i += 2)
if (s[i] == '\0' || s[i + 1] == '\0')
{
rez[i] = s[i];
rez[i + 1] = '\0';
}
else if (s[i] == s[i + 1])
{
rez[i] = 'É';
rez[i + 1] = s[i];
}
else
{
for (int k = 0; k < 4; k++)
for (int j = 0; j < 7; j++)
{
if (s[i] == square[k][j])
{
i1 = k;
j1 = j;
}
if (s[i + 1] == square[k][j])
{
i2 = k;
j2 = j;
}
}
if (i1 == i2)
{
rez[i] = square[i1][j1 < 6 ? j1 + 1 : 0];
rez[i + 1] = square[i2][j2 < 6 ? j2 + 1 : 0];
}
else if (j1 == j2)
{
rez[i] = square[i1 < 3 ? i1 + 1 : 0][j1];
rez[i + 1] = square[i2 < 3 ? i2 + 1 : 0][j2];
}
else
{
rez[i] = square[i2][j1];
rez[i + 1] = square[i1][j2];
}
}
return rez;
}
char* ukr::operator-(char*s)
{
int i1, i2, j1, j2;
char*rez = new char[strlen(s) + 1];
for (int i = 0; i <= strlen(s); i += 2)
if (i == strlen(s))
{
rez[i] = '\0';
rez[i + 1] = '\0';
}
else if (s[i + 1] == '\0')
{
rez[i] = s[i];
rez[i + 1] = '\0';
}
else if (s[i] == 'É')
{
rez[i] = s[i + 1];
rez[i + 1] = s[i + 1];
}
else
{
for (int k = 0; k < 4; k++)
for (int j = 0; j < 7; j++)
{
if (s[i] == square[k][j])
{
i1 = k;
j1 = j;
}
if (s[i + 1] == square[k][j])
{
i2 = k;
j2 = j;
}
}
if (i1 == i2)
{
rez[i] = square[i1][j1 - 1 < 0 ? 6 : j1 - 1];
rez[i + 1] = square[i2][j2 - 1 < 0 ? 6 : j2 - 1];
}
else if (j1 == j2)
{
rez[i] = square[i1 - 1 < 0 ? 3 : i1 - 1][j1];
rez[i + 1] = square[i2 - 1 < 0 ? 3 : i2 - 1][j2];
}
else
{
rez[i] = square[i2][j1];
rez[i + 1] = square[i1][j2];
}
}
return rez;
}
Результат роботи
Алгоритм Віженера
Програмна реалізація
#define LATIN /*UKR*/
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
struct latin
{
char alphabet[26];
char keyword[20];
int index;
latin(char*);
char* operator+(char*);
char* operator-(char*);
};
struct ukr
{
char alphabet[29];
char keyword[20];
int index;
ukr(char*);
char* operator+(char*);
char* operator-(char*);
};
char* prep_l(char*);
char* prep_u(char*);
void main()
{
setlocale(0, "");
bool f;
#ifdef LATIN
f = true;
#endif
#ifdef UKR
f = false;
#endif
char keyword[20]{}, *el = "He is rather strict with us, but always fair.",
*um = "Êîëè çàéìàºøüñÿ ïîëiòèêîþ, äié, ÿê ãðîìàäÿíèí.";
char text[50]{}, cipher[50]{}, rez[50]{};;
if (f)
cout << strcpy(text, prep_l(strcpy(text, el))) << endl;
else
cout << strcpy(text, prep_u(strcpy(text, um))) << endl;
if (f)
{
cout << "enter your keyword at least 20 characters: ";
cin >> keyword;
strcpy(keyword, prep_l(keyword));
}
else
{
cout << " ââåäiòü êëþ÷îâå ñëîâî íå áiëüø íiæ 20 ñèìâîëiâ: ";
SetConsoleCP(1251);
cin >> keyword;
SetConsoleCP(866);
strcpy(keyword, prep_u(keyword));
}
#ifdef LATIN
latin sl(keyword);
strcpy(cipher, sl + text);
#endif
#ifdef UKR
ukr su(keyword);
strcpy(cipher, su + text);
#endif
cout << cipher << endl;
#ifdef LATIN
strcpy(rez, sl - cipher);
#endif
#ifdef UKR
strcpy(rez, su - cipher);
#endif
cout << rez << endl;
}
char* prep_l(char*temp)
{
char s[50]{};
char * path;
char r[12] = " ,./!?;:\"\'";
path = strtok(temp, r);
do {
strcat(s, path);
} while (path = strtok(NULL, r));
path = s;
while (*path)
{
*path = toupper(*path);
if (*path == 'J')
*path = 'I';
path++;
}
return s;
}
char* prep_u(char*temp)
{
int c;
char s[50]{};
char * path;
char r[14] = "üÜ ,./!?;:\"\'";
path = strtok(temp, r);
do {
strcat(s, path);
} while (path = strtok(NULL, r));
path = s;
while (*path)
{
if (*path == 'i')
*path = 'I';
else if (*path == 'º' || *path == 'ª')
*path = 'Å';
else if (*path == '¿' || *path == '¯')
*path = 'I';
else if (*path == 'é' || *path == 'É')
*path = 'È';
else if (*path > -33)
*path -= 32;
path++;
}
return s;
}
latin::latin(char*s)
{
strcpy(keyword, s);
strcpy(alphabet, "ABCDEFGHIKLMNOPQRSTUVWXYZ");
index = 0;
}
ukr::ukr(char*s)
{
strcpy(keyword, s);
strcpy(alphabet, "ÀÁÂÃÄÅÆÇÈIÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÞß");
index = 0;
}
char* latin::operator+(char*s)
{
int j;
char*rez = new char[strlen(s) + 1];
for (int i = 0; i < strlen(s); i++)
{
for (j = 0; j < 25; j++)
if (s[i] == alphabet[j])
break;
rez[i] = alphabet[(j + keyword[index] - 65) % 25];
index++;
if (index == strlen(keyword))
index = 0;
}
rez[strlen(s)] = '\0';
return rez;
}
char* latin::operator-(char*s)
{
int j, n;
index = 0;
char*rez = new char[strlen(s) + 1];
for (int i = 0; i < strlen(s); i++)
{
for (j = 0; j < 25; j++)
if (s[i] == alphabet[j])
break;
rez[i] = alphabet[(n = j - keyword[index] + 65) < 0 ? 25 + n : n];
index++;
if (index == strlen(keyword))
index = 0;
}
rez[strlen(s)] = '\0';
return rez;
}
char* ukr::operator+(char*s)
{
int j, k;
char*rez = new char[strlen(s) + 1];
for (int i = 0; i < strlen(s); i++)
{
for (j = 0; j < 28; j++)
if (s[i] == alphabet[j])
break;
for (k = 0; k < 28; k++)
if (keyword[index] == alphabet[k])
break;
rez[i] = alphabet[(j + k) % 28];
index++;
if (index == strlen(keyword))
index = 0;
}
rez[strlen(s)] = '\0';
return rez;
}
char* ukr::operator-(char*s)
{
int j, k, n;
index = 0;
char*rez = new char[strlen(s) + 1];
for (int i = 0; i < strlen(s); i++)
{
for (j = 0; j < 28; j++)
if (s[i] == alphabet[j])
break;
for (k = 0; k < 28; k++)
if (keyword[index] == alphabet[k])
break;
rez[i] = alphabet[(n = j - k) < 0 ? 28 + n : n];
index++;
if (index == strlen(keyword))
index = 0;
}
rez[strlen(s)] = '\0';
return rez;
}
Результат роботи
Висновок
У даній лабораторній роботі було створено 3 алгоритми шифрування та
дешифрування інформації. Було вивчено теорію, як працюють дані
алгоритми, створено програмну.