• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Шифрование Методом Виженера На C++

  • Автор темы 203
  • Дата начала
2

203

Здравствуйте. Мне нужна программа на тему Шифрование методом виженера. Я пытался найти в интернете варианты шифрования нашел только вот этот. Но я не могу разорятся какая тут ошибка. Если может у кого есть вариант получше то выложите пожалуйста буду очень благодарен. Заранее спасибо.
C++:
#include <iostream>
#include <conio>  //Включили чтобы очищать экран (clrscr())
#include <windows.h>	//CharToOem
#include <string>	  //Класс строки
#include <cstdlib>	 //Стандартная библиотека

using namespace std; //Стандартное пространство имён

//Класс строки для шифрования содержит размерность, указатель на шифрованную
//строку, указатель на строку с открытым текстом	(Когда пишем прототип класса
//сначала объявляем, а потом определяем методы и статические поля)
//******************************************************************************
class cystr
{
public:
int dem;  //размерность строки
int *s_c; //указатель на массив с чиленным представлением зашифрованной строки
int *open; //указатель на массив с численным представлением строки с открытым текстом
static string alph; // алфавит
cystr ();
cystr (int *, int, char);
~cystr();
};
//******************************************************************************

//Определение статического поля класса, и его методов: конмтрукторы, деструктор
//******************************************************************************
string cystr::alph = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ абвгдежзий\
клмнопрстуфхцчшщъыьэюя"; //Определение статической переменной alph класса cystr
cystr::cystr(){}
cystr::cystr(int *p, int n, char c)
{
dem = n;
s_c = new int [n]; //мы выделяем память оператором new и записываем её адрес в указатель s_c
open = new int [n];
for(int i = 0; i < n; i++)
if(c == 'e')
open[i] = p[i];
else
s_c[i] = p[i];
}
cystr::~cystr()
{
dem = 0;
delete [] open;
delete [] s_c;
}
//******************************************************************************

//Описание класса ключа для шифрования и дешифрования
//Содержит размерность ключа, и указатель на ключ
//******************************************************************************
class key
{
int dem; //размерность ключа
int *s_k; //указатель на массив с численным представлением ключа
public:
key();
key(int, int *);
~key();
void encipher (cystr *); //Функция ничего не возвращает, только шифрует объект класса cystr переданного по адресу
void decipher (cystr *);
};
//******************************************************************************

//Определение методов класса key. Методы шифрования и дешифрования
//с помощью ключа, конструкторы, деструкторы
//******************************************************************************
key::key(){}
key::key(int n, int *p)
{
dem = n;
s_k = new int [n];
for(int i = 0; i < n; i++)
s_k[i] = p[i];
}
key::~key()
{
dem = 0;
delete [] s_k;
}
void key::encipher (cystr *tocy)
{
int k = 0;
for(int i = 0; i < tocy->dem; i++)
{
if(dem <= k)
k -= dem;
tocy->s_c[i] = tocy->open[i] + s_k[k];
if(tocy->s_c[i] > 64)
tocy->s_c[i] -= 65;
tocy->open[i] = 0;
k++;
}
}
void key::decipher(cystr *tode)
{
int k = 0;
for(int i = 0; i < tode->dem; i++)
{
if(dem <= k)
k -= dem;
tode->open[i] = tode->s_c[i] - s_k[k];
if(tode->open[i] < 0)
tode->open[i] += 65;
tode->s_c[i] = 0;
k++;
}
}
//******************************************************************************

//Две функции кодирования и декодирования строки в численный вид
//******************************************************************************
int * encode (string s)
{
char err[] = "Ошибка кодирования. Неизвестный символ";
CharToOem(err,err);
int *p;
p = new int [s.size()];
for(int i = 0; i < s.size(); i++)
{
p[i] = cystr::alph.find(s[i], 0); //Ищем в алфавите s[i] и возвращаем её номер в элемент массива p
if(p[i] == -1)
{
cout<<err<<endl;
system("pause");
abort();
}
}
return p;
}

char * decode (int *p, int n)
{
char * s;
s = new char [n+1];
for(int i = 0; i < n; i++)
s[i] = cystr::alph[p[i]];
s[n] = '\0'; //конец строки
return s;
}
//******************************************************************************

//Диалоговая функция для управления шифрованием
//******************************************************************************
void action1 ()
{
char *p;
char q;
char buf [256];
string s;
char instr[] = "Введите строку";
char inkey1[] = "Введите ключ шифрования";
char encyp_suc[] = "Строка зашифрована";
CharToOem(encyp_suc,encyp_suc);
CharToOem(inkey1,inkey1);
CharToOem(instr,instr);

cout<<inkey1<<endl;
cin.getline(buf,256);
OemToChar(buf,buf);
s = buf;
key o(s.size(),encode(s)); //создаём объект класса ключ
cout<<instr<<endl;
cin.getline(buf,256);
OemToChar(buf,buf);
s = buf;
cystr sc1(encode(s),s.size(),'e'); //создаём объект класса cystr
o.encipher(&sc1);
cout<<encyp_suc<<endl;
p = decode(sc1.s_c, sc1.dem);
CharToOem(p,p);
cout<<p<<endl;
system("pause");
clrscr();
}
//******************************************************************************

//Диалоговая функция для управления дешифрованием
//******************************************************************************
void action2 ()
{
char *p;
char q;
char buf [256];
string s;
char decyp_suc[] = "Строка дешифрована";
char instr[] = "Введите строку";
char inkey2[] = "Введите ключ дешифрования";
CharToOem(inkey2,inkey2);
CharToOem(instr,instr);
CharToOem(decyp_suc,decyp_suc);
cout<<inkey2<<endl;
cin.getline(buf,256);
OemToChar(buf,buf);
s = buf;
key o(s.size(),encode(s));
cout<<instr<<endl;
cin.getline(buf,256);
OemToChar(buf,buf);
s = buf;
cystr sc1(encode(s),s.size(),'d');
o.decipher(&sc1);
cout<<decyp_suc<<endl;
p = decode(sc1.open, sc1.dem);
CharToOem(p,p);
cout<<p<<endl;
system("pause");
clrscr();
}
//******************************************************************************

//Главная функция, интерфейс программы
//******************************************************************************
int main()
{
char q;
char welcome[] = "Вас приветствует программа КРИПТО 0.0.1 (Шифр Вижинера)";
char qes[] = "Выбирите действие\n1 - Шифрование\n2 - Дешифрование\n3 - Выход";
char er[] = "Неверно";
CharToOem(welcome,welcome);
CharToOem(qes,qes);
CharToOem(er,er);

cout<<welcome<<endl<<endl;
while(q != '3')
{
cout<<qes<<endl;
cin>>q;
getchar();

switch(q)
{
case '1': action1(); break;
case '2': action2(); break;
case '3': return 1;
default: cout<<er<<endl; system("pause"); clrscr();
}
}
system("pause");
return 0;
}
 
R

rrrFer

жесть, шифрование методом Вижинера должно занимать строк 10-20( ну 30 xD )
Проще все удалить, и написать с чистого листа чем найти тут ошибку.
А с чего вы решили что тут есть ошибка?
 
2

203

Код это не мой. Потому что не компилируется.

Добавлено: И если есть рабочий вариант то можете поделится.
 
R

rrrFer

Потому что не компилируется.
при этом, компилятор обычно выдает ошибку. Понять в чем ошибка обычно можно по ее описанию. Как Вам помогут, если описание вы не привели?
 
2

203

Извиняйте, не подумал. Ошибка в строчках OemToChar(buf,buf); вот ошибка компилятора error C2664: 'OemToCharW' : cannot convert parameter 2 from 'char [256]' to 'LPWSTR'
А в CharToOem(encyp_suc,encyp_suc); я нашёл ошибку нужно CharToOemA
 
2

203

С той ошибкой разобрался теперь новая вот фото Без_имени_2.jpg как можно её исправить?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!