Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <conio.h>
- #include <stdlib.h>
- #include <sstream>
- #include <fstream>
- using namespace std;
- int main()
- {
- int k; //выбор шифрования или дешифрования
- string result = "";
- string result1;
- string keyV = ""; //ключ Виженера
- string keyG = ""; //ключ Гамма
- string key_v = ""; //строка,в которую будет растягиваться ключ на длину исходного текста для Виженера
- string key_g = "";//строка,в которую будет растягиваться ключ на длину исходного текста для Гаммы
- bool flag;
- int x = 0, y = 0; //Координаты нового символа из таблицы Виженера
- int reg = 0; //Регистр символа
- char cop; //Копия прописной буквы
- //Формирование таблицы Виженера
- int shift = 0;
- char **tabv = new char *[59]; //Таблица Виженера
- for (int i=0;i<26;i++)
- tabv[i] = new char [26];
- string alf = "abcdefghijklmnopqrstuvwxyz"; //Алфавит
- for (int i = 0; i < 26; i++)
- for (int j = 0; j < 26; j++)
- {
- shift = j + i;
- if (shift >= 26) shift = shift % 26;
- tabv[i][j] = alf[shift];
- }
- cout<<"Enter 1 for encryption and decryption of 2"<<endl;
- cin>>k;
- switch (k) //Если k
- {
- case 1: //Если выбрано шифрование
- {
- cout<<"Enter key encryption for Vizhener"<<endl;
- cin>>keyV;
- cout<<endl<<"Enter key encryption for Gamma"<<endl;
- cin>>keyG;
- setlocale(LC_ALL,"Russian");//Чтение файла
- string s; //Строка считанная из файла
- ifstream in("Open_text.txt");
- getline(in,s);
- string s1=s;
- cout<<endl<<"Open text: "<<s<<endl;
- in.close();
- //Формирование строки, длиной шифруемой, состоящей из повторений ключа
- for (int i = 0; i < s.length(); i++)
- {
- key_v += keyV[i % keyV.length()];
- }
- //заполняем массив с символами ключа для Гаммы
- for (int i = 0; i < keyG.length(); i++)
- {
- key_g += keyG[i % keyG.length()];
- }
- //Шифруем Гаммой
- for (int i = 0; i < s.length(); i++)
- {
- s1[i+1] = (s1[i+1]+key_g[i%keyG.length()])%255;
- }
- cout<<"Result Gamma:";
- cout<<s1<<endl;
- ofstream out1("Result_Gamma.txt");
- out1<<s1;
- //Шифрование при помощи таблицы Виженера
- 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 < 26) && (flag == false))
- {
- //Если символ найден
- if (key_v[i] == tabv[l][0])
- {
- //Запоминаем в х номер строки
- x = l;
- flag = true;
- }
- l++;
- }
- //Уменьшаем временно регистр прописной буквы
- if (((int)(s[i]) <= 90) && ((int)(s[i]) >= 65))
- {
- cop = (char)((int)(s[i]) + 32);
- reg = 1;
- }
- else
- {
- reg = 0;
- cop = s[i];
- }
- l = 0;
- flag = false;
- //Пока не найден столбец в первой строке с символом строки
- while ((l < 26) && (flag == false))
- {
- if (cop == tabv[0][l])
- {
- //Запоминаем номер столбца
- y = l;
- flag = true;
- }
- l++;
- }
- //Увеличиваем регистр буквы до прописной
- if (reg == 1)
- {
- //Изменяем символ на первоначальный регистр
- cop = char((int)(tabv[x][y]) - 32);
- result += cop;
- }
- else
- result += tabv[x][y];
- }
- }
- cout<<"Result Vizhener:";
- cout<<result; //Вывод результата
- ofstream out("Result_Vizhener.txt");
- out<<result;
- break;
- }
- case 2: //Если выбрано дешифрование
- {
- cout<<"Enter key decryption for Vizhener"<<endl;
- cin>>keyV;
- cout<<"Enter key decryption for Gamma"<<endl;
- cin>>keyG;
- setlocale(LC_ALL,"Russian");
- string s;
- ifstream in("Open_text.txt");
- getline(in,s);
- string s1=s;
- cout<<"Open text: "<<s<<endl;
- in.close();
- //Формирование строки, длиной дешифруемой, состоящей из повторений ключа
- for (int i = 0; i < s.length(); i++)
- {
- key_v += keyV[i % keyV.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 < 26) && (flag == false))
- {
- //Если символ найден
- if (key_v[i] == tabv[l][0])
- {
- //Запоминаем в х номер строки
- x = l;
- flag = true;
- }
- l++;
- }
- //Уменьшаем временно регистр прописной буквы
- if (((int)(s[i]) <= 90) && ((int)(s[i]) >= 65))
- {
- cop = (char)((int)(s[i]) + 32);
- reg = 1;
- }
- else
- {
- reg = 0;
- cop = s[i];
- }
- l = 0;
- flag = false;
- //Пока не найден столбец в x строке с символом строки
- while ((l < 26) && (flag == false))
- {
- if (cop == tabv[x][l])
- {
- //Запоминаем номер столбца
- y = l;
- flag = true;
- }
- l++;
- }
- //Увеличиваем регистр буквы до прописной
- if (reg == 1)
- {
- //Изменяем символ на первоначальный регистр
- cop = char((int)(tabv[0][y]) - 32);
- result += cop;
- }
- else
- result += tabv[0][y];
- }
- //Формирование строки, длиной дешифруемой, состоящей из повторений ключа
- for (int i = 0; i < s.length(); i++)
- {
- key_g += keyG[i % keyG.length()];
- }
- for (int i = 0; i < keyG.length(); i++)
- key_g[i] = keyG[i+1];
- for (int i = 0; i < s.length(); i++)
- s1[i+1] = (s1[i+1]-key_g[i%keyG.length()])%255;
- }
- cout<<"Result Vizener:"<<endl;
- cout<<result; //Вывод результата
- ofstream out2("Result_Vizhener.txt");
- out2<<result;
- out2.close();
- cout<<"Result Gamma:"<<endl;;
- cout<<s1;
- ofstream out3("Result_Gamma.txt");
- out3<<s1;
- out3.close();
- break;
- }
- default: //Если ошибочное значение
- {
- cout<<"ERROR!!!";
- break;
- }
- }
- getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement