qt-substitution-cipher

Форк
0
/
mainwindow.cpp 
289 строк · 8.4 Кб
1
#include "mainwindow.h"
2
#include "ui_mainwindow.h"
3
#include <QSizePolicy>
4
#include <QTextCodec>
5
#include <QDateTime>
6

7
MainWindow::MainWindow(QWidget *parent) :
8
    QMainWindow(parent),
9
    ui(new Ui::MainWindow)
10
{
11
    ui->setupUi(this);
12
    setFixedSize(this->size());
13

14
    ui->constant1LineEdit->setValidator(new QIntValidator(this));
15
    ui->constant2LineEdit->setValidator(new QIntValidator(this));
16

17
    setEnglishAlphabetTable();
18
}
19

20
MainWindow::~MainWindow()
21
{
22
    delete ui;
23
}
24

25
void MainWindow::on_loadSubstitutionTable_clicked()
26
{
27
    fileName = QFileDialog::getOpenFileName( this, tr("Открыть документ"),
28
                                      QDir::currentPath(), tr("Текстовые документы (*.txt)"),
29
                                      0, QFileDialog::DontUseNativeDialog );
30

31
    file.setFileName(fileName);
32
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
33
    {
34
        QTextStream readStream(&file);
35

36
        codesOfSymbols.clear();
37
        model->clear();
38
        model->setRowCount(2);
39
        unsigned int i = 0;
40
        while(!file.atEnd())
41
        {
42
            string str = file.readLine().toStdString();
43
            codesOfSymbols.append(int(str.at(0)));
44
            qCharacter = QString::fromLocal8Bit(str.c_str()).at(0);
45
            qEncryptedCharacter = QString::fromLocal8Bit(str.c_str()).at(1);
46

47
            QStandardItem *pair = new QStandardItem();
48
            model->setItem(0, i, pair);
49
            index = model->index(0, i, QModelIndex());
50
            model->setData(index, qCharacter);
51
            index = model->index(1, i, QModelIndex());
52
            model->setData(index, qEncryptedCharacter);
53

54
            i++;
55
        }
56

57
        file.close();
58
    }
59

60
    substitutuinTableIsCreated = true;
61
}
62

63
void MainWindow::on_generateSubstitutuionTable_clicked()
64
{
65
    qSubstitutionTable.clear();
66

67
    qsrand(QDateTime::currentMSecsSinceEpoch() / 1000);
68
    if(!ui->constant1LineEdit->text().isEmpty())
69
        generationConstant1 = ui->constant1LineEdit->text().toInt();
70
    else
71
        generationConstant1 = qrand();
72
    if(!ui->constant2LineEdit->text().isEmpty())
73
        generationConstant2 = ui->constant2LineEdit->text().toInt();
74
    else
75
        generationConstant2 = qrand();
76

77
    for (int i = 0;i < codesOfSymbols.size();i++)
78
    {
79
        codeOfEncryptedCharacter = codesOfSymbols.at((generationConstant1 * i + generationConstant2) % codesOfSymbols.size());
80
        encryptedCharacter = codeOfEncryptedCharacter;
81
        qEncryptedCharacter = QString::fromLocal8Bit(encryptedCharacter.c_str());
82

83
        index = model->index(1, i, QModelIndex());
84
        model->setData(index, qEncryptedCharacter);
85
    }
86

87
    substitutuinTableIsCreated = true;
88
}
89

90
void MainWindow::on_saveSubstitutionTable_clicked()
91
{
92
    fileName = QFileDialog::getSaveFileName( this, tr("Сохранить документ"),
93
                                  QDir::currentPath(), tr("Текстовые документы (*.txt)"),
94
                                  0, QFileDialog::DontUseNativeDialog );
95

96
    file.setFileName(fileName + ".txt");
97
    if(file.open(QIODevice::WriteOnly | QIODevice::Text))
98
    {
99
        QTextStream writeStream(&file);
100

101
        for (int i = 0;i < 2;i++)
102
        {
103
            for (int j = 0;j < 2;j++)
104
            {
105
                 writeStream << ui->substitutionTable->model()->index(i, j).data().toString();
106
            }
107
            writeStream << "\n";
108
        }
109

110
        file.close();
111
    }
112
}
113

114
void MainWindow::on_loadText_clicked()
115
{
116
    fileName = QFileDialog::getOpenFileName( this, tr("Открыть документ"),
117
                                  QDir::currentPath(), tr("Текстовые документы (*.txt)"),
118
                                  0, QFileDialog::DontUseNativeDialog );
119

120
    file.setFileName(fileName);
121
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
122
    {
123
        QTextStream readStream(&file);
124
        qText = readStream.readAll();
125
        ui->text->document()->setPlainText(qText);
126
        file.close();
127
    }
128
}
129

130
void MainWindow::on_codeText_clicked()
131
{
132
    qText = ui->text->document()->toPlainText();
133

134
    if(!substitutuinTableIsCreated)
135
    {
136
        errorMessageBox.setText("Не создана таблица!");
137
        errorMessageBox.exec();
138
    }
139
    else if(qText.isEmpty())
140
    {
141
        errorMessageBox.setText("Отсутствует текст!");
142
        errorMessageBox.exec();
143
    }
144
    else
145
    {
146
        ui->text->document()->clear();
147
        qEncryptedText.clear();
148

149
        unsigned int i = 0;
150
        text = qText.toLocal8Bit().constData();
151
        qText.clear();
152
        substitutionTable = qSubstitutionTable.toLocal8Bit().constData();
153
        while (i < text.size())
154
        {
155
            character = text[i];
156
            for(int j = 0;j < model->columnCount();j++)
157
            {
158
                if(character == ui->substitutionTable->model()->index(0, j).data().toString().toLocal8Bit().constData())
159
                {
160
                    encryptedCharacter = ui->substitutionTable->model()->index(1, j).data().toString().toLocal8Bit().constData();
161
                    break;
162
                }
163
            }
164

165
            qEncryptedText = qEncryptedText + QString::fromLocal8Bit(encryptedCharacter.c_str());
166
            i++;
167
        }
168

169
        ui->text->document()->setPlainText(qEncryptedText);
170
    }
171
}
172

173
void MainWindow::on_decodeText_clicked()
174
{
175
    qEncryptedText = ui->text->document()->toPlainText();
176

177
    if(!substitutuinTableIsCreated)
178
    {
179
        errorMessageBox.setText("Не создана таблица!");
180
        errorMessageBox.exec();
181
    }
182
    else if(qEncryptedText.isEmpty())
183
    {
184
        errorMessageBox.setText("Отсутствует текст!");
185
        errorMessageBox.exec();
186
    }
187
    else
188
    {
189
        ui->text->document()->clear();
190
        qText.clear();
191

192
        encryptedText = qEncryptedText.toLocal8Bit().constData();
193
        qEncryptedText.clear();
194
        substitutionTable = qSubstitutionTable.toLocal8Bit().constData();
195
        unsigned int i = 0;
196
        while (i < encryptedText.size())
197
        {
198
            encryptedCharacter = encryptedText[i];
199
            for(int j = 0;j < model->columnCount();j++)
200
            {
201
                if(encryptedCharacter == ui->substitutionTable->model()->index(1, j).data().toString().toLocal8Bit().constData())
202
                {
203
                    character = ui->substitutionTable->model()->index(0, j).data().toString().toLocal8Bit().constData();
204
                    break;
205
                }
206
            }
207

208
            qText = qText + QString::fromLocal8Bit(character.c_str());
209
            i++;
210
        }
211

212
        ui->text->document()->setPlainText(qText);
213
    }
214
}
215

216
void MainWindow::on_saveText_clicked()
217
{
218
    fileName = QFileDialog::getSaveFileName( this, tr("Сохранить документ"),
219
                                  QDir::currentPath(), tr("Текстовые документы (*.txt)"),
220
                                  0, QFileDialog::DontUseNativeDialog );
221

222
    file.setFileName(fileName+".txt");
223
    if(file.open(QIODevice::WriteOnly | QIODevice::Text))
224
    {
225
        QTextStream writeStream(&file);
226
        writeStream << ui->text->toPlainText();
227
        file.close();
228
    }
229
}
230

231
void MainWindow::on_englishAlphabetRadioButton_clicked()
232
{
233
    setEnglishAlphabetTable();
234
}
235

236
void MainWindow::on_russianAlphabetRadioButton_clicked()
237
{
238
    codesOfSymbols.clear();
239

240
    charactersCount = 67;
241

242
    model = new QStandardItemModel(2, charactersCount);
243
    ui->substitutionTable->setModel(model);
244

245
    for(int i = -64;i < 0;i++)
246
    {
247
        codesOfSymbols.append(i);
248
        if(i == -59)
249
            codesOfSymbols.append(-88);
250
        if(i == -27)
251
            codesOfSymbols.append(-72);
252
    }
253

254
    for (int i = 0;i < codesOfSymbols.size();i++)
255
    {
256
        character = codesOfSymbols.at(i);
257
        qCharacter = QString::fromLocal8Bit(character.c_str());
258

259
        index = model->index(0, i, QModelIndex());
260
        model->setData(index, qCharacter);
261
    }
262
}
263

264
void MainWindow::setEnglishAlphabetTable()
265
{
266
    codesOfSymbols.clear();
267

268
    charactersCount = 53;
269

270
    model = new QStandardItemModel(2, charactersCount);
271
    ui->substitutionTable->setModel(model);
272

273
    for(int i = 65;i < 123;i++)
274
    {
275
        codesOfSymbols.append(i);
276
        if(i == 90)
277
            i = i + 6;
278
    }
279
    codesOfSymbols.append(32);
280

281
    for (int i = 0;i < codesOfSymbols.size();i++)
282
    {
283
        character = codesOfSymbols.at(i);
284
        qCharacter = QString::fromLocal8Bit(character.c_str());
285

286
        index = model->index(0, i, QModelIndex());
287
        model->setData(index, qCharacter);
288
    }
289
}
290

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.