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

Тема в разделе "C/C++/C#", создана пользователем 203, 26 май 2012.

  1. 203

    203 New Member

    Регистрация:
    21 фев 2012
    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте. Мне нужна программа на тему Шифрование методом виженера. Я пытался найти в интернете варианты шифрования нашел только вот этот. Но я не могу разорятся какая тут ошибка. Если может у кого есть вариант получше то выложите пожалуйста буду очень благодарен. Заранее спасибо.
    Код (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;
    }
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    жесть, шифрование методом Вижинера должно занимать строк 10-20( ну 30 xD )
    Проще все удалить, и написать с чистого листа чем найти тут ошибку.
    А с чего вы решили что тут есть ошибка?
     
  3. 203

    203 New Member

    Регистрация:
    21 фев 2012
    Сообщения:
    4
    Симпатии:
    0
    Код это не мой. Потому что не компилируется.

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    при этом, компилятор обычно выдает ошибку. Понять в чем ошибка обычно можно по ее описанию. Как Вам помогут, если описание вы не привели?
     
  5. 203

    203 New Member

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

    203 New Member

    Регистрация:
    21 фев 2012
    Сообщения:
    4
    Симпатии:
    0
    С той ошибкой разобрался теперь новая вот фото Без_имени_2.jpg как можно её исправить?
     
  7. 203

    203 New Member

    Регистрация:
    21 фев 2012
    Сообщения:
    4
    Симпатии:
    0
    Всё я разобрался всем спасибо.
     
Загрузка...

Поделиться этой страницей