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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

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

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

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #15 : 29 Декабря 2014, 22:15:45 »
Мой код, который я выложил чуть выше то же самое
Неправда! Мое кунг-фу сильнее!

А про юникод почитай. Он разный бывает - utf-8, utf-16, utf-32 с BOM и без...
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #16 : 29 Декабря 2014, 23:22:39 »
что-то типа такого
#include <iostream>
using namespace std;

#define BUF_SIZE 100000
wchar_t txt[BUF_SIZE];
wchar_t alfabet[] = L"абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
     
void sh()
{
wcout << L"Введите текст: ";
wcin.getline(txt, BUF_SIZE, '\n');

for (int i = 0; txt[i] && i < BUF_SIZE; i++)
{
for (int m = 0; m < 33; m++)
{
if (txt[i] == alfabet[m])
{
txt[i] = alfabet[32 - m];
break;
}
                     }
}
wcout << L"Зашифрованный текст: " << txt << endl;
}

int main()
{
setlocale(LC_CTYPE,"");
sh();
return 0;
}

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #17 : 29 Декабря 2014, 23:32:47 »
"Почти" рабочий код
Код: (cpp) [Выделить]
#include <iostream>
using namespace std;
   
    char f[] = "texet.txt";
    wchar_t txt[100000];
    wchar_t alfabet[] = L"абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    wchar_t ALFABET[] = L"АБВГДЕЁЖЗИЙКЛМНОПРСТУФЧЦЧШЩЪЫЬЭЮЯ";
       
     int ABS(int f)
     {
     return f>=0 ? f : -f ;   
     }
   
     void sh(int a)
     {
     if (a==0) wcout<<L"Вводите текст для шифрования: ";
     if (a==1) wcout<<L"Вводите текст для дешифрования: ";
     wcin.get();
     wcin.getline(txt, 100000, '\n');
       
     if (a==0) wcout<<L"Зашифрованый тест: ";
if (a==1) wcout<<L"Дешифрованый текст: ";

     for (int i=0; i<100000; i++)
     {
for (int m=0; m<33; m++)
{
if (txt[i]==alfabet[m])
{

    wcout<<alfabet[ABS(33-m)];
     }
     if (txt[i]==ALFABET[m])
     {
    wcout<<ALFABET[ABS(33-m)];
}
     if (txt[i]==' ') wcout<<L" ";
     }
}
}
     int main()
     {
setlocale(LC_CTYPE,"");
int k;
     wcout<<L"Выберете операцию (шифр-0 / дешифр-1): ";
     wcin>>k;
     sh(k);
     if(k==0) wcout<<endl<<L"Текст зашифрован. ";
     else wcout<<endl<<flush<<L"Текст дешифрован. ";
     return 0;
}
"Почти" потому что букву "а" он упорно пропускает.
« Последнее редактирование: 30 Декабря 2014, 00:38:57 от Гриб_под_зонтом »
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: Шифровальщик / Дешифровальщик на С++
« Ответ #18 : 30 Декабря 2014, 01:19:41 »
#include <cstring>
#include <codecvt>
#include <fstream>
#include <iostream>
#include <locale>
#include <string>

using namespace std;

int main(int argc, char **argv) {
    wstring_convert<codecvt_utf8_utf16<wchar_t>> conv;
    wstring  data, dict = conv.from_bytes("абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz");
    char    *buff;
    fstream *file;
    long     size;

    if(argc < 2) {
        cout << "Usage " << argv[0] << " filename" << 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);

            data = conv.from_bytes(buff);

            for(int i = 0; i < data.length(); ++i) {
                for(int j = 0; j < dict.length(); ++j) {
                    if(data[i] == dict[j]) {
                        data[i] = dict[dict.length() - j];
                        break;
                    }
                }
            }

            strcpy(buff, data.c_str());
           
            file->seekg(0, ios::beg);
            file->write(buff, size);
            file->close();
           
            delete[](buff);
        }

        delete(file);
    }

    catch(std::exception &ex) {
        cerr << "Exception occured: " << ex.what() << endl;
        return 1;
    }

    return 0;
}
У меня не собирается - версия libstdc++ не та немного.

Гриб_под_зонтом, вот такой ужас в мой код не смей добавлять (код обидится и работать принципиально не будет):
wcout<<L"Выберете операцию (шифр-0 / дешифр-1): ";
wcin>>k;
sh(k);
if(k==0) wcout<<endl<<L"Текст зашифрован. ";
else wcout<<endl<<flush<<L"Текст дешифрован. ";
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

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

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #19 : 30 Декабря 2014, 05:13:33 »
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.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #20 : 30 Декабря 2014, 20:20:08 »
Protopopulus,
(Нажмите, чтобы показать/скрыть)
(Нажмите, чтобы показать/скрыть)
Ну кто так делает? Не по зубам си инкремент - бери что-то полегче. Так умные люди никогда не делают.
1) наделаешь кучу ошибок
2) долго и неудобно
(Нажмите, чтобы показать/скрыть)

ЗЫ Крестики-нолики доделал?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12139
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #21 : 30 Декабря 2014, 22:46:56 »
Гриб_под_зонтом, я правильно понял что алгоритм взят исключительно для прокачки скилзов? Потому как криптостойкость его как шифра - ниже плинтуса. Если вы мне дадите штук 20 писем этим кодом закодированные, то я его взлмаю даже не зная алгоритма перестановки (таблица перестановки будет получена простейшим анализом).

Кстати по алгоритму (если всеже для скилзов) я бы сделал двумерный массив или массив из пар элементов - что и на что менять (в первом случае это просто разные индексы второй размерности). И тогда поиск "кодируемого" символа давал бы сразу "код"/подмену. По накладным расходам - копейки, а производительность алгоритма возрастает.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн alsoijw

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

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #23 : 30 Декабря 2014, 23:08:27 »
Sly_tom_cat, не прокатит с юникодом двумерный массив в плюсах.
Интересно как ты будешь взламывать кодированные письма?
Наверняка, частотным анализом :)
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн alsoijw

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

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12139
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #25 : 30 Декабря 2014, 23:44:37 »
Я начинал слушать онлайн-курс по криптографии и даже сделал пару ДЗ (cursera.org - рекомендую, там много интересных курсов), на остальное не хватило запала... :( но прослушал так сказать экстерном основной материал курса.

Так вот там было дз (одно из тх что я выполнил) и алгоритм был заведомо стойкий - XOR побайтно с ключом, который был длиннее самого длинного письма. Даны были штук 12-15 закодированных писем и еще одно, которое надо было взломать.

Написал несколько функций на питоне и примерно за пол часа анализа и проб дз сделал (т.е. тестовое письмо раскодировал подобрав ключ).

Решение простое, если знаешь, что закодированные тексты письма (есть минимальная структура документа) и то, что письма были на английском (например приветствия Hi и Hello в в первых байтах криптотекста практически сразу дают вам первый байт ключа, а вместе с ним сразу открываются следующие пару байт... и так далее....)

Проблема криптотекстов в этом задании в том, что ключ криптования не менялся и с-но в 12-15 письмах достаточно информации для того, что бы взломать такой шифр.

Если же менять только буквы, то пробелы и знаки препинания останутся - что даст уже не только общую структуру документа, но и разбиение на слова и предложения. Если знать язык на котором написано - то задача решается еще быстрее нежели с шифром с побайтным XOR-ом. А, например, встреча сразу нескольких одинаковых одно, двух, и трех буквенных слов просто сразу скажет, что используется банальная таблица подстановки букв, а за одно - откроет эти буквы т.к. в купе с со знаками препинания даст подсказку, что это за предлоги или артикли (если это инглишь или другой с артиклями).

В принципе после моего пояснения... думаю любой сможет взломать обсуждаемый алгоритм. И я в свою очередь не отказываюсь от эксперимента, если базовый алгоритм не будет значительно изменен и мне будет известен язык кодированных писем. Хотя в принципе после моих пояснений вам уже должно быть понятно - что решение этого "пазла" - достаточно примитивно.

А анализ этот частотный только от части - тут идет разбор на знании структуры и особенности оригинального текста.

Так собственно строятся многие атаки на шифры (банально шифровать заголовки пакетов опасно - потому, что в них очень статичная и формализованная информация, и когда ты знаешь как примерно выглядит заголовок нешифрованного пакета то можно получить подсказки или даже взломать шифр имея просто много пакетов шифрованных одним ключом. Именно поэтому используются механизмы сессионных ключей и требуется периодическая смена крипто-ключей/сертификатов. 

(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 31 Декабря 2014, 00:23:39 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #26 : 31 Декабря 2014, 00:00:03 »
почему только в плюсах?
Не только в плюсах, я лишь высказался в контексте данного топика. Так-то в PHP, например, спокойно можно обойтись ассоциативным массивом.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12139
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #27 : 31 Декабря 2014, 00:12:01 »
Ну двумерный или просто два с одинаковыми индексами или массив кортежей из 2-х элементов - это суть есть практически одно и тоже. Просто разное представление, но алгоритм то один и он тривиальный.
Я могу на питоне накидать по-быстрому если кому интересно.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Шифровальщик / Дешифровальщик на С++
« Ответ #28 : 31 Декабря 2014, 00:44:01 »
Ну двумерный или просто два с одинаковыми индексами или массив кортежей из 2-х элементов - это суть есть практически одно и тоже.
Так то в питоне... Двумерный массив в С/С++ и в пайтоне - абсолютно разные вещи. В си/++ двумерный массив есть непрерывная область памяти, где выборка данных происходит адресным сдвигом, а данные интерпретируются по типу указателя на них. В пайтоне массивы представляют уже объекты, в которых данные еще и с динамической типизацией, что сильно отличает их алгоритмически от "сишных".

В С/С++ на двумерном массиве не получится сделать конверсию юникод-символов путем простой выборки/подстановки, ибо юникод-символ в кодировке utf-8 может быть представлен одним и более байтами, что сильно усложняет работу с непрерывным участком памяти, который программно воспринимается как последовательность одиночных байтов.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн alsoijw

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

 

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