Форум программистов, компьютерный форум CyberForum.ru

Шифрование текстового файла - C++

Восстановить пароль Регистрация
 
Mdmaa
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 87
16.03.2016, 19:00     Шифрование текстового файла #1
Нужен код для шифрования русскоязычного текста методом простой подстановки(каждой букве алфавита ставится в соответствие другая буква, знаки препинания исключаются, буква Ё=Е, пробел заменяется на "знак абзаца в ворде"). Программа читает текст из файла и записывает зашифрованный текст в другой. Символы в зашифрованном тексте должны располагаться группами по 5 символов, группы разделены пробелами, по пять групп в строке. Составить программу-дешифратор, восстанавливающая исходный текст. Проверить работу программ на примере текста из 40-50 слов.
Строка шифровальной таблицы(исходные буквы считаются расположенными по алфавиту):
х у т э ц й г р ф ы н а ъ с и щ п б в д м з ж е ш ь ч я к ю о л

Буду рад любым идеям и вариантам, которые вы предложите!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2016, 19:00     Шифрование текстового файла
Посмотрите здесь:

C++ шифрование текстового файла
Шифрование файла C++
C++ Шифрование графического файла
Шифрование файла с методом исключающего ИЛИ C++
C++ Шифрование\создание файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yrceus
 Аватар для yrceus
80 / 80 / 54
Регистрация: 25.08.2013
Сообщений: 321
16.03.2016, 19:06     Шифрование текстового файла #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <vector>
#include <string>
#include <Windows.h>
#include <fstream>
#include <cassert>
#include <locale>
using namespace std;
//------------------------------------------------------------------
void fllng(const char beg, const char end, vector<string> &alph) {
    for (char sym = beg; sym <= end; ++sym) {
        cout << sym;
        if (alph.back().size() == 6)
            alph.emplace_back();
        alph.back().append(1, sym);
    }
}
//-----------------------------------------------------------------
bool serch_sym(fstream &fail, vector<string> &alph, int &sym, int fl) {
    for (auto iter = alph.begin(); iter < alph.end(); ++iter) {
        int ind = iter->find(sym, 0);
        if (ind != string::npos) {
            fail.seekp(-1, fstream::cur);
            if (fl)
                if (++iter == alph.end() || iter->size() < ind)
                    sym = alph.begin()->at(ind);
                else
                    sym = iter->at(ind);
            else
                if (iter == alph.begin() && (--alph.end())->size() < ind)
                    sym = (alph.end() - 2)->at(ind);
                else if (iter == alph.begin())
                    sym = (--alph.end())->at(ind);
                else
                    sym = (--iter)->at(ind);
            if (fail << static_cast<char>(sym) << flush)
                return true;
            return false;
        }
    }
    return false;
}
//-----------------------------------------------------------------
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_CTYPE, "rus");
    vector<string> llatin(1);
    vector<string> lkiril(1);
    vector<string> ulatin(1);
    vector<string> ukiril(1);
    fllng('A', 'Z', ulatin);
    fllng('А', 'Я', ukiril);
    fllng('a', 'z', llatin);
    fllng('а', 'я', lkiril);
    fstream fail("Polib.txt", fstream::ate | fstream::in | fstream::out);
    if (!fail.is_open()) {
        fail.open("Polib.txt", fstream::out);
        fail.close();
        fail.open("Polib.txt", fstream::ate | fstream::in | fstream::out);
    }
    string sent;
    cout << "Введите строки для кодировки, для конца ввода Ctrl + Z\n";
    while (getline(cin, sent)) 
        fail << sent + '\n' << flush;
    cin.clear();
    fail.seekg(0, fstream::beg);
    int sym, fl = -1;
    while (fl < 0 || fl > 1) {
        cout << "Кодировать 1 разкодировать 0\n";
        cin >> fl;
        if (!cin.good()) {
            while (cin.get() != '\n');
            cin.clear();
        }
    }
    while ((sym = fail.get()) != EOF) {
        if (sym != 218 && sym >= 'A' && sym <= 'Z')
            assert(serch_sym(fail, ulatin, sym, fl));
        else if (sym >= 192 && sym <= 223)
            assert(serch_sym(fail, ukiril, sym, fl));
        else if (sym >= 'a' && sym <= 'z')
            assert(serch_sym(fail, llatin, sym, fl));
        else if (sym != 250 && sym >= 224 && sym <= 255)
            assert(serch_sym(fail, lkiril, sym, fl));
    }
    fail.close();
    return 0;
}
Mdmaa
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 87
27.03.2016, 20:21  [ТС]     Шифрование текстового файла #3
А не мог бы объяснить строки кода, пожалуйста
yrceus
 Аватар для yrceus
80 / 80 / 54
Регистрация: 25.08.2013
Сообщений: 321
27.03.2016, 20:25     Шифрование текстового файла #4
А именно? И там на большой U латинской спотыкается, ее надо учесть)
Mdmaa
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 87
27.03.2016, 20:34  [ТС]     Шифрование текстового файла #5
Растерялся в коде, а сдавать надо его)
Будут спрашивать, что означает одна, другая переменная и тд
yrceus
 Аватар для yrceus
80 / 80 / 54
Регистрация: 25.08.2013
Сообщений: 321
27.03.2016, 21:18     Шифрование текстового файла #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <vector>
#include <string>
#include <Windows.h>
#include <fstream>
#include <cassert>
#include <locale>
using namespace std;
// шифр Полибия почитай принцип
//------------------------------------------------------------------
void fllng(const char beg, const char end, vector<string> &alph) { //
    for (char sym = beg; sym <= end; ++sym) { // записываем алфавит 
        if (alph.back().size() == 6)    // по шесть символов в строку
            alph.emplace_back();// переходим к пустой строке
        alph.back().append(1, sym); // записываем в строку - string.append() почитай
    }
}
//-----------------------------------------------------------------
bool serch_sym(fstream &fail, vector<string> &alph, int &sym, int fl) { // фун, меняет символ на нужный и зап. обратно в файл
    for (auto iter = alph.begin(); iter < alph.end(); ++iter) { // перебираем строки с символами(алфавит)
        int ind = iter->find(sym, 0);// ищем символ в строке и записываем позицию
        if (ind != string::npos) { // если нашли
            fail.seekp(-1, fstream::cur); // меняем позицию в файле на одну назад от только что прочитанного
            if (fl) // что-то если кодируем(или наоборот)
                if (++iter == alph.end() || iter->size() < ind)
                    sym = alph.begin()->at(ind);
                else
                    sym = iter->at(ind);
            else     // что-то если разкодируем(или наоборот)
                if (iter == alph.begin() && (--alph.end())->size() < ind)
                    sym = (alph.end() - 2)->at(ind);
                else if (iter == alph.begin())
                    sym = (--alph.end())->at(ind);
                else
                    sym = (--iter)->at(ind);
                if (fail << static_cast<char>(sym) << flush) //записываем измененный символ в файл
                    return true;
                return false; // если почему-то не записалось
        }
    }
    return false; // если как-то промахнулсь вообще...
}
//-----------------------------------------------------------------
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_CTYPE, "rus");
    vector<string> llatin(1); // векторы для алфавита
    vector<string> lkiril(1);
    vector<string> ulatin(1);
    vector<string> ukiril(1);
    fllng('A', 'Z', ulatin);// записываем алфавит 
    fllng('А', 'Я', ukiril);
    fllng('a', 'z', llatin);
    fllng('а', 'я', lkiril);
    fstream fail("Polib.txt", fstream::ate | fstream::in | fstream::out); // открываем файл с позицией в конце
    if (!fail.is_open()) {      // если не нашли файл, создаем                  // на чтение и на запись
        fail.open("Polib.txt", fstream::out);
        fail.close();
        fail.open("Polib.txt", fstream::ate | fstream::in | fstream::out);
    }
    string sent; 
    cout << "Введите строки для кодировки, для конца ввода Ctrl + Z\n";
    while (getline(cin, sent)) // построчко записываем в файл
        fail << sent + '\n' << flush;
    cin.clear(); // сбрасываем после EOF флаги состояния ввода
    fail.seekg(0, fstream::beg); // переходим в начало файла, перемещаем позицию
    int sym, fl = -1; // fl флаг, если единица кодируем, если ноль разкодируем
    while (fl < 0 || fl > 1) { //если не корректно ввели флаг
        cout << "Кодировать 1 разкодировать 0\n";
        cin >> fl;
        if (!cin.good()) {
            while (cin.get() != '\n');
            cin.clear();
        }
    }
    while ((sym = fail.get()) != EOF) { // в цикле перебираем файл посимвольно
        if (sym != 218 && sym >= 'A' && sym <= 'Z') // если не U(костыль) и верхний регистр латиницы
            assert(serch_sym(fail, ulatin, sym, fl)); //assert передает исключение, если в аргументе ложь
        else if (sym >= 192 && sym <= 223) // если кирилица
            assert(serch_sym(fail, ukiril, sym, fl));
        else if (sym >= 'a' && sym <= 'z') 
            assert(serch_sym(fail, llatin, sym, fl));
        else if (sym != 250 && sym >= 224 && sym <= 255) // если кириллица верхний регистр
            assert(serch_sym(fail, lkiril, sym, fl));
    }
    fail.close();
    return 0;
}
Yandex
Объявления
27.03.2016, 21:18     Шифрование текстового файла
Ответ Создать тему
Опции темы

Текущее время: 14:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru