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

захист / 10 / 10l

.cpp
Скачиваний:
3
Добавлен:
30.05.2020
Размер:
5.03 Кб
Скачать
//Программа шифрования/дешифрования символов латиницы алгоритмом Виженера
#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