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

захист / 10 / Жека

.docx
Скачиваний:
4
Добавлен:
30.05.2020
Размер:
34.44 Кб
Скачать

#include <iostream>

#include <string>

#include <conio.h>

#include <stdlib.h>

#include <sstream>

#include <fstream>

using namespace std;

int main()

{

int k; //Переменная выбора - шифрование/дешифрование

string result = ""; //Строка - результат

string key = ""; //Строка - ключ

string key_on_s = "";

bool flag;

int x = 0, y = 0; int registr = 0; //Регистр символа

char dublicat; //Дубликат прописной буквы

int shift = 0;

char **tabula_recta = new char *[27]; //Таблица Виженера

for (int i=0;i<27;i++)

tabula_recta[i] = new char [27];

string alfabet = " abcdefghijklmnopqrstuvwxyz"; //Алфавит латиницы

for (int i = 0; i < 27; i++)

for (int j = 0; j < 27; j++)

{

shift = j + i;

if (shift >= 27) shift = shift % 27;

tabula_recta[i][j] = alfabet[shift];

}k=1;

switch (k) //Если k

{

case 1: //Если выбрано шифрование

{

setlocale(LC_ALL,"Russian");

cout<<"Введите ключ\n";

cin>>key;

cout<<"Чтение файла...\n";

setlocale(LC_ALL,"Russian");//Чтение файла

string s; //Строка считанная из файла

ifstream in("1.txt");

getline(in,s);

cout<<"Текст в файле: \n"<<s<<endl;

in.close();

cout<<"Чтение завершено!\n";

cout<<"Шифрование...\n";

//Формирование строки, длиной шифруемой, состоящей из повторений ключа

for (int i = 0; i < s.length(); i++)

{

key_on_s += key[i % key.length()];

}

//Шифрование при помощи таблицы

for (int i = 0; i < s.length(); i++)

{

//Если нешифруемый символ

if (((int)(s[i]) < 65) || ((int)(s[i]) > 122))

result += s[i];

else

{

//Поиск в первом столбце строки, начинающейся с символа ключа

int l = 0;

flag = false;

while ((l < 27) && (flag == false))

{

if (key_on_s[i] == tabula_recta[l][0])

{

x = l;

flag = true;

}

l++;

} буквы

if (((int)(s[i]) <= 90) && ((int)(s[i]) >= 65))

{ dublicat = (char)((int)(s[i]) + 32);

registr = 1;

} else

{ registr = 0;

dublicat = s[i];

} l = 0;

flag = false;

while ((l < 27) && (flag == false))

{ if (dublicat == tabula_recta[0][l])

{

//Запоминаем номер столбца

y = l;

flag = true;

}

l++;

}

//Увеличиваем регистр буквы до прописной

if (registr == 1)

{

//Изменяем символ на первоначальный регистр

dublicat = char((int)(tabula_recta[x][y]) - 32);

result += dublicat;

}

else

result += tabula_recta[x][y];

}

}

for(int i=0;i<s.length();i++)

if(result[i]==' ')

result[i]='I';

cout<<result; //Вывод результата

break;

} }

getch();

return 0;

}

Соседние файлы в папке 10