Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Шифровальщик / Дешифровальщик на С++  (Прочитано 7094 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Всем привет!
Опять я к вам за помощью пришёл  ;)
В общем недавно вспомнил как я в раннем детстве (лет 5-6 было) начитался разных книжек и стал шифрами баловаться. Был у меня самый любимый его никто разгадать не мог: буквы берутся симметрично относительно середины алфавита. То есть если в нормальном тесте у нас буква "а", то в шифрованном "я", "б" - "ю" и так далее. Решил написать код, который будет шифровать и дешифровать текст этим способом. Вот что получилось:
Код: (cpp) [Выделить]
#include <iostream>
#include <fstream>
using namespace std;
   
    char f[] = "texet.txt";
    char txt[100000];
   
     void sh(int a)
     {
int x;
     ofstream s_out(f);
     if (a==0) cout<<"Вводите текст для шифрования: ";
     if (a==1) cout<<"Вводите текст для дешифрования: ";
     cin>>x;
     cin.getline(txt, 100000, '\n');
 
     for (int i=0; i<100000; i++)
     {
int b = txt[i];
char s = 255-b+224;
s_out<<s;
}
s_out.close();
}
     int main()
     {
int k;
     cout<<"Выберете операцию (шифр-0 / дешифр-1): ";
     cin>>k;
     sh(k);
     if(k==0) cout<<"Текст зашифрован. ";
     else cout<<"Текст дешифрован. ";
     cout<<"Результат находится в файле texet.txt";
     return 0;
}
При попытке зашифровать слово "Проверка" выводит всякую чушь.
(Нажмите, чтобы показать/скрыть)
Что с этим делать?
« Последнее редактирование: 29 Декабря 2014, 19:41:24 от Гриб_под_зонтом »
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #1 : 29 Декабря 2014, 18:27:25 »
а что по Вашему мнению находится в txt?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #2 : 29 Декабря 2014, 18:30:57 »
texet.txt - файл, который при каждом запуске программы обновляется. В него записываеться результат шифровки / дешифровки

Пользователь решил продолжить мысль 29 Декабря 2014, 18:32:26:
В массиве txt находиться исходный текст для шифрования / дешифрования
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #3 : 29 Декабря 2014, 19:07:44 »
давайте проверим:
...
     cin.getline(txt, 100000);
     cout << "Вы ввели текст:" << txt << endl;
...

Пользователь решил продолжить мысль 29 Декабря 2014, 19:17:03:
ещё как конструктивная критика, вместо:
if(k==0) cout<<"Текст зашифрован. ";
if(k==1) cout<<"Текст дешифрован. ";
лучше использовать if/else if или switch/case.
далее, не очень понятно почему for (int i=0; i<100000; i++), если нужно только просмотреть строку до символа '\0'.
зачем нужен второй буфер txt2, если можно менять символы в самом буфере txt? а у Вас вообще выводится посимвольно, так что достаточно одного char s.
ну и, наконец, char s = 255-b+224; - это для какой кодировки? а что будет при этом с цифрами, пунктуацией и латинскими буквами?
"Результат находиться в файле" - слово "находится" в данном случае пишется без мягкого знака (что делаеТ? "находится").
« Последнее редактирование: 29 Декабря 2014, 19:17:03 от spk-ubuntu »

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #4 : 29 Декабря 2014, 19:27:58 »
Прочитай про юникод. Там символ кодируется не постоянным количеством байтов. И из этого некоторые проблемы.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #5 : 29 Декабря 2014, 19:36:48 »
alsoijw,
В принципе понял почему такую фигню выкидывает, но вот как исправить не понимаю. В с++ я использую аски, то есть надо как то сделать так, что бы в файл тоже кодировка аскии стояла?
Самое интересное то, что такой код нормально работает:
Код: (cpp) [Выделить]
#include <iostream>
#include <fstream>
using namespace std;
char f[]="Prost.txt";
 int main()
 {
char txt[100000];
ofstream jout(f);
cout<<"Поток jout: "<<(jout?"Открылся...":"Упс.. Не открывается :(");
cout<<endl;
cout<<"Вводите текст: ";
cin.getline(txt, 100000, '\n');
jout<<txt;
jout.close();
cout<<"Текст сохранён. Он находится в файле Prost.txt";
return 0;
 }

Пользователь решил продолжить мысль 29 Декабря 2014, 19:42:18:
spk-ubuntu,
Спасибо, изменил.
« Последнее редактирование: 29 Декабря 2014, 19:42:18 от Гриб_под_зонтом »
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #6 : 29 Декабря 2014, 19:54:07 »
Гриб_под_зонтом, ищи по isValidChar Unicode c++. Как-то так.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #7 : 29 Декабря 2014, 19:55:06 »
Гриб_под_зонтом, лучше сделай простейший XOR шифр со сдвигом и гордись!
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #8 : 29 Декабря 2014, 20:19:21 »
Protopopulus,
Только хардкор!

Пользователь решил продолжить мысль 29 Декабря 2014, 20:24:30:
alsoijw,
Ничё понятного не нашёл. Уже думаю а не сделать ли просто:
Код: (cpp) [Выделить]
...
  if(txt[i]=='a') txt[i]=='я';

  ...

  if(txt[i]=='я') txt[i]=='а';

  ...
« Последнее редактирование: 29 Декабря 2014, 20:24:30 от Гриб_под_зонтом »
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #9 : 29 Декабря 2014, 20:59:10 »
тогда уж
char alphabet[] = "абв...эюя";
далее ищем в этом массиве очередной символ, если находим, то вычисляем индекс шифрующего символа (pos - индекс найденного символа в массиве alphabet):
с = alphabet[32 - pos];

Пользователь решил продолжить мысль 29 Декабря 2014, 21:05:21:
Самое интересное то, что такой код нормально работает
а такой не очень:
int k;
         cout<<"Выберете операцию (шифр-0 / дешифр-1): ";
         cin>>k;
         ...
         cout<<"Вводите текст: ";
         cin.getline(txt, 100000, '\n');

« Последнее редактирование: 29 Декабря 2014, 21:05:21 от spk-ubuntu »

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #10 : 29 Декабря 2014, 21:25:30 »

Не знаю что такое , но у меня опять не получилось:
Код: (cpp) [Выделить]
#include <iostream>
#include <fstream>
using namespace std;
   
    char f[] = "texet.txt";
    char txt[100000];
    char alfabet[] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
     
     int ABS(int f)
     {
     return f>=0 ? f : -f ;   
     }
   
     void sh(int a)
     {
int x;
     ofstream s_out(f);
     if (a==0) cout<<"Вводите текст для шифрования: ";
     if (a==1) cout<<"Вводите текст для дешифрования: ";
     cin>>x;
     cin.getline(txt, 100000, '\n');
       
     for (int i=0; i<100000; i++)
     {
for (int m=0; m<33; m++)
{
if (txt[i]==alfabet[m])
{
    s_out<<alfabet[ABS(33-m)];
     }
     }
}
s_out.close();
}
     int main()
     {
int k;
     cout<<"Выберете операцию (шифр-0 / дешифр-1): ";
     cin>>k;
     sh(k);
     if(k==0) cout<<"Текст зашифрован. ";
     else cout<<"Текст дешифрован. ";
     cout<<"Результат находится в файле texet.txt";
     return 0;
}

В файл вообще ничего не записывает :(
« Последнее редактирование: 29 Декабря 2014, 21:34:24 от Гриб_под_зонтом »
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #11 : 29 Декабря 2014, 21:46:52 »
В файл вообще ничего не записывает :(
см. мой предыдущий пост
после "cin>>что-то;" не отрабатывает "cin.getline(txt, 100000, '\n');". по всей видимости, что-то вроде http://www.cyberforum.ru/cpp-beginners/thread763481.html

Пользователь решил продолжить мысль 29 Декабря 2014, 21:56:20:
вот статейка на эту тему: https://cppstudy.wordpress.com/2009/03/27/cin-get-and-co/
« Последнее редактирование: 29 Декабря 2014, 21:56:20 от spk-ubuntu »

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #12 : 29 Декабря 2014, 22:00:03 »
У меня .getline() считывает  инфу до ентера (\n) поэтому я попробовал убрать все \n при помощи cin.get(). Получилось вот что:
Код: (cpp) [Выделить]
#include <iostream>
#include <fstream>
using namespace std;
   
    char f[] = "texet.txt";
    char txt[100000];
    char alfabet[] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
     
     int ABS(int f)
     {
     return f>=0 ? f : -f ;   
     }
   
     void sh(int a)
     {
     ofstream s_out(f);
     if (a==0) cout<<"Вводите текст для шифрования: ";
     if (a==1) cout<<"Вводите текст для дешифрования: ";
     cin.get();
     cin.getline(txt, 100000, '\n');
       
     for (int i=0; i<100000; i++)
     {
for (int m=0; m<33; m++)
{
if (txt[i]==alfabet[m])
{
    s_out<<alfabet[ABS(33-(m/2))];
     }
     }
}
s_out.close();
}
     int main()
     {
cout<<"Вводите текст: ";
int k;
     cout<<"Выберете операцию (шифр-0 / дешифр-1): ";
     cin>>k;
     sh(k);
     if(k==0) cout<<"Текст зашифрован. ";
     else cout<<"Текст дешифрован. ";
     cout<<"Результат находится в файле texet.txt";
     return 0;
}
При этом при попытке ввести слово "проверка" в файл кинуло вот что:
¿Ð¾Ð½Ðлкйиз¼¿Ð¾Ð½ÐлкйизпонÐлкйиз¾¿Ð¾Ð½Ðлкйизм¿Ð¾Ð½ÐлкйизпонÐлкйиз¿Я в тупике....
« Последнее редактирование: 29 Декабря 2014, 22:08:08 от Гриб_под_зонтом »
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #13 : 29 Декабря 2014, 22:10:48 »
#include <fstream>
#include <iostream>

using namespace std;

int main(int argc, char **argv) {
    char     dict[] = "abcdefghijklmnopqrstuvwxyz", *buff;
    fstream *file;
    long     size;

    if(argc < 2) {
        cout << "Использование " << argv[0] << " имя файла" << endl;
        return 1;
    }
   
    try {
        file = new fstream(argv[1], ios::in | ios::out);
       
        if(file->is_open()) {
            file->seekg(0, ios::end);
            size = file->tellg();
            file->seekg(0, ios::beg);
           
            buff = new char[size];

            file->read(buff, size);
           
            for(int i = 0; i < size; ++i) {
                for(int j = 0; j < 26; ++j) {
                    if(buff[i] == dict[j]) {
                        buff[i] = dict[25 - j];
                        break;
                    }
                }
            }
           
            file->seekg(0, ios::beg);
            file->write(buff, size);
            file->close();
           
            delete[](buff);
        }
       
        delete(file);
    }
   
    catch(ios::failure &ex) {
        cerr << "Фигня с файлом: " << ex.what() << endl;
    }

    catch(std::bad_alloc &ex) {
        cerr << "Фигня с памятью: " << ex.what() << endl;
    }

    catch(std::exception &ex) {
        cerr << "Просто фигня: " << ex.what() << endl;
    }
}
Но с юникодом не сработает ;)
« Последнее редактирование: 29 Декабря 2014, 22:12:42 от Protopopulus »
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #14 : 29 Декабря 2014, 22:11:58 »
Protopopulus,
Мой код, который я выложил чуть выше то же самое: в аски работает а в юникоде нет
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

 

Страница сгенерирована за 0.021 секунд. Запросов: 21.