Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > шифрование методом тритемиуса


Автор: Kroshkka 3.12.2013, 20:58
помогите, не могу разобраться
Код

//Программа шифрования/дешифрования символов латиницы
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <conio.h>
#include <fstream>
#include <clocale>
#include <cmath>

using namespace std;
 
int main()
    {
        int km=1,sm=1; //Переменная выбора - шифрование/дешифрование
        int a, b, c, i;
        string str;
        string key;
        setlocale(LC_ALL,"Russian");
      while(sm) {
        string result = ""; //Строка - результат
        cout<<"0-Выход\n";
        cout<<"***********************\n";
        cout<<" Шифрование методом Третемиуса:\n";
        cout<<"1-Шифрование\n";
        cout<<"2-Дешифрование\n";
        cout<<"***********************\n";
       // putc('\n',stdout);
        cout<<"Введите операцию: ";
        cin>>km;
        switch (km) //Если km
        {
        case 0: {exit(1);}
      
        case 1:        //Шифрование
            {
            cout<<"Введите ключи для шифрования: "<<"a= ";
            //alph();
            cin>>a;
            cout<<"b= ";
            cin>>b;
            cout<<"c= ";
            cin>>c;
            int L=(a*(int)(str[i])*(int)(str[i]) + b*(int)(str[i]) + c); //Величина сдвига
            key=L;
            //putc('\n',stdout);
            if (L > 31)
                L = L % 31; //Вычисление сдвига
            /////////////////////////////////////////////////////////////////////////////////////////////
            cout<<"Имя файла:";
            string filename;
            cin>>filename;
            cout<<"Чтение файла...\n";//Чтение файла
            string str; //Строка считанная из файла
            ifstream in(filename);
            /////////////////////////////////////////////////////////////////////////////////////////////
            getline(in,str);
            cout<<"Текст файла: \n"<<str<<endl;
            key=str;
            //str=shift;
            in.close();
           // putc('\n',stdout);
            cout<<"Шифрование...\n";
            for (int i = 0; i < str.length(); i++)
                {
                 //Если  латиница
                    if (((int)(str[i]) < -64)||((int)(str[i]) > -1))
                        result += str[i];
                    //Если буква является строчной
                    if (((int)(str[i]) >= -32) && ((int)(str[i]) <= -1))
                        {
                            //Если буква, после сдвига выходит за пределы алфавита
                            if ((int)(str[i]) + L > -1)
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) + L - 31);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) + L);
                        }
                     //Если буква является прописной
                     if (((int)(str[i]) >= -64) && ((int)(str[i]) <= -33))
                        {
                            //Если буква, после сдвига выходит за пределы алфавита
                            if ((int)(str[i]) + L > -33)
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) + L - 31);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) + L);
                        }
                }
            cout<<"Результат:\n";
            cout<<result; //Вывод результата
            /////////////////////////////////////////////////////////////////////////////////////////////
            ofstream out("OUT.txt");
            out << result << endl;
            cout<<"\nСохранено в OUT.txt";
            out.close();
            /////////////////////////////////////////////////////////////////////////////////////////////
            break;
            }
        case 2:       //Дешифрование
            {
               cout<<"Введите ключи для шифрования: "<<"a= ";
            //alph();
            cin>>a;
            cout<<"b= ";
            cin>>b;
            cout<<"c= ";
            cin>>c;
            int L=a*(int)(str[i])+b*(int)(str[i])+c;
            //putc('\n',stdout);
            if (L > 31)
                L = L % 31;
            cout<<"Имя файла:";
            /////////////////////////////////////////////////////////////////////////////////////////////
            string filename;
            cin>>filename;
            cout<<"Чтение файла...\n";//Чтение файла
            string str; //Строка считанная из файла
            ifstream in(filename);
            /////////////////////////////////////////////////////////////////////////////////////////////
            getline(in,str);
            cout<<"Текст файла: \n"<<str<<endl;
            in.close();
            //putc('\n',stdout);
            cout<<"Дешифрование...\n";
            for (int i = 0; i < str.length(); i++)
                {
                //Если  латиница
                    if (((int)(str[i]) < -64)||((int)(str[i]) > -1))
                        result += str[i];
                    //Если буква является строчной
                    if (((int)(str[i]) >= -32) && ((int)(str[i]) <= -1))
                        {
                            //Если буква, после сдвига выходит за пределы алфавита
                            if ((int)(str[i]) - L < -32)
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) - L + 31);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) - L);
                        }
                     //Если буква является прописной
                     if (((int)(str[i]) >= -64) && ((int)(str[i]) <= -33))
                        {
                            //Если буква, после сдвига выходит за пределы алфавита
                            if ((int)(str[i]) - L < -64)
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) - L + 31);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) - L);
                        }
                }
            cout<<"Результат:\n";
            cout<<result; //Вывод результата
            /////////////////////////////////////////////////////////////////////////////////////////////
            ofstream out("OUT.txt");
            out << result << endl;
            cout<<"\nСохранено в OUT.txt";
            out.close();
            /////////////////////////////////////////////////////////////////////////////////////////////
            break;
            }
       
           default: //Если ошибочное значение
            {
            cout<<"Ошибка->";
            break;
            }
        }
        getch();
        system("cls");
      }
        return 0;
    }




Автор: bsa 4.12.2013, 11:05
код сама писала?
Цитата(Kroshkka @  3.12.2013,  21:58 Найти цитируемый пост)
помогите, не могу разобраться
в чем?

Автор: smalcom 4.12.2013, 19:17
не сама http://cybern.ru/cezar-cpp.html

Автор: Kroshkka 4.12.2013, 21:19
Цитата(smalcom @ 4.12.2013,  19:17)
не сама http://cybern.ru/cezar-cpp.html

писала не сама. почти разобралась 

Автор: Kroshkka 4.12.2013, 22:21
Цитата(bsa @ 4.12.2013,  11:05)
код сама писала?
Цитата(Kroshkka @  3.12.2013,  21:58 Найти цитируемый пост)
помогите, не могу разобраться
в чем?

 дешифровка проходит со сдвигом вперед, а не назад. что не так делаю?
Код

 case 1:        //Шифрование
            {
            cout<<"Имя файла:";
            string filename;
            cin>>filename;
            cout<<"Чтение файла...\n";//Чтение файла
            string str; //Строка считанная из файла
            ifstream in(filename);
            /////////////////////////////////////////////////////////////////////////////////////////////
            getline(in,str);
            cout<<"Текст файла: \n"<<str<<endl;
            key=str;
            in.close();
            cout<<"Шифрование...\n";
            for (int i = 0; i < str.length(); i++) //перебор букв шифруемого слова
               {  
                  k=a*i+b;
                    //Если не латиница
                    if (((int)(str[i]) < 65)||((int)(str[i]) > 122))
                        result += str[i];
                    //Если буква является строчной
                    if (((int)(str[i]) >= 97) && ((int)(str[i]) <= 122))
                       { shift=(((int)(str[i])-96)+k)%26;
                    
                            //Если буква, после сдвига выходит за пределы алфавита
                            if ((int)(str[i]) + shift > 122)
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) + shift - 26);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) + shift);
                        }
                     //Если буква является прописной
                     if (((int)(str[i]) >= 65) && ((int)(str[i]) <= 90))
                        {shift=(((int)(str[i])-64)+k)%26;
                            //Если буква, после сдвига выходит за пределы алфавита
                            if ((int)(str[i]) + shift-i > 90)
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) + shift - 26);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) + shift);
                        }
                     cout<<"k="<<k<<" shift="<<shift<<endl;
                }
            cout<<"Результат:\n";
            cout<<result; //Вывод результата
            /////////////////////////////////////////////////////////////////////////////////////////////
            ofstream out("OUT.txt");
            out << result << endl;
            cout<<"\nСохранено в OUT.txt";
            out.close();
            /////////////////////////////////////////////////////////////////////////////////////////////
            break;
            }
         case 2:       //Дешифрование
            {
           cout<<"Имя файла:";
            /////////////////////////////////////////////////////////////////////////////////////////////
            string filename;
            cin>>filename;
            cout<<"Чтение файла...\n";//Чтение файла
            string str; //Строка считанная из файла
            ifstream in(filename);
            /////////////////////////////////////////////////////////////////////////////////////////////
            getline(in,str);
            cout<<"Текст файла: \n"<<str<<endl;
            in.close();
            cout<<"Дешифрование...\n";
            for (int i = 0; i < str.length(); i++)
                {
                 k=a*i+b;
                 
                //Если не латиница
                    if (((int)(str[i]) < 65)||((int)(str[i]) > 122))
                        result += str[i];
                    //Если буква является строчной
                    if (((int)(str[i]) >= 97) && ((int)(str[i]) <= 122))
                        {  shift=(((int)(str[i])-96)+k)%26;
                            //Если буква, после сдвига выходит за пределы алфавита
                            if ((int)(str[i]) - shift < 97)
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) - shift + 26);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) - shift);
                        }
                     //Если буква является прописной
                     if (((int)(str[i]) >= 65) && ((int)(str[i]) <= 90))
                        {   shift=(((int)(str[i])-64)+k)%26;
                            //Если буква, после сдвига выходит за пределы алфавита
                            if ((int)(str[i]) - shift < 65)
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) - shift + 26);
                            //Если буква может быть сдвинута в пределах алфавита
                            else
                                //Добавление в строку результатов символ
                                result += (char)((int)(str[i]) - shift);
                        }
                      cout<<"k="<<k<<" shift="<<shift<<endl;
                }
            cout<<"Результат:\n";
            cout<<result; //Вывод результата
            /////////////////////////////////////////////////////////////////////////////////////////////
            ofstream out("OUT.txt");
            out << result << endl;
            cout<<"\nСохранено в OUT.txt";
            out.close();
            /////////////////////////////////////////////////////////////////////////////////////////////
            break;
            }

Автор: smalcom 5.12.2013, 01:06
вероятно суть в этом
Цитата

+ shift

Автор: Kroshkka 5.12.2013, 06:57
Цитата(smalcom @ 5.12.2013,  01:06)
вероятно суть в этом
Цитата

+ shift

но в дешифровании везде
Цитата

- shift

Автор: Objegog 7.9.2022, 06:58
Модератор: Сообщение скрыто.

Автор: hipAppops 10.9.2022, 04:50
Модератор: Сообщение скрыто.

Автор: anceria 13.9.2022, 06:51
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)