qt-substitution-cipher
/
mainwindow.cpp
289 строк · 8.4 Кб
1#include "mainwindow.h"
2#include "ui_mainwindow.h"
3#include <QSizePolicy>
4#include <QTextCodec>
5#include <QDateTime>
6
7MainWindow::MainWindow(QWidget *parent) :
8QMainWindow(parent),
9ui(new Ui::MainWindow)
10{
11ui->setupUi(this);
12setFixedSize(this->size());
13
14ui->constant1LineEdit->setValidator(new QIntValidator(this));
15ui->constant2LineEdit->setValidator(new QIntValidator(this));
16
17setEnglishAlphabetTable();
18}
19
20MainWindow::~MainWindow()
21{
22delete ui;
23}
24
25void MainWindow::on_loadSubstitutionTable_clicked()
26{
27fileName = QFileDialog::getOpenFileName( this, tr("Открыть документ"),
28QDir::currentPath(), tr("Текстовые документы (*.txt)"),
290, QFileDialog::DontUseNativeDialog );
30
31file.setFileName(fileName);
32if(file.open(QIODevice::ReadOnly | QIODevice::Text))
33{
34QTextStream readStream(&file);
35
36codesOfSymbols.clear();
37model->clear();
38model->setRowCount(2);
39unsigned int i = 0;
40while(!file.atEnd())
41{
42string str = file.readLine().toStdString();
43codesOfSymbols.append(int(str.at(0)));
44qCharacter = QString::fromLocal8Bit(str.c_str()).at(0);
45qEncryptedCharacter = QString::fromLocal8Bit(str.c_str()).at(1);
46
47QStandardItem *pair = new QStandardItem();
48model->setItem(0, i, pair);
49index = model->index(0, i, QModelIndex());
50model->setData(index, qCharacter);
51index = model->index(1, i, QModelIndex());
52model->setData(index, qEncryptedCharacter);
53
54i++;
55}
56
57file.close();
58}
59
60substitutuinTableIsCreated = true;
61}
62
63void MainWindow::on_generateSubstitutuionTable_clicked()
64{
65qSubstitutionTable.clear();
66
67qsrand(QDateTime::currentMSecsSinceEpoch() / 1000);
68if(!ui->constant1LineEdit->text().isEmpty())
69generationConstant1 = ui->constant1LineEdit->text().toInt();
70else
71generationConstant1 = qrand();
72if(!ui->constant2LineEdit->text().isEmpty())
73generationConstant2 = ui->constant2LineEdit->text().toInt();
74else
75generationConstant2 = qrand();
76
77for (int i = 0;i < codesOfSymbols.size();i++)
78{
79codeOfEncryptedCharacter = codesOfSymbols.at((generationConstant1 * i + generationConstant2) % codesOfSymbols.size());
80encryptedCharacter = codeOfEncryptedCharacter;
81qEncryptedCharacter = QString::fromLocal8Bit(encryptedCharacter.c_str());
82
83index = model->index(1, i, QModelIndex());
84model->setData(index, qEncryptedCharacter);
85}
86
87substitutuinTableIsCreated = true;
88}
89
90void MainWindow::on_saveSubstitutionTable_clicked()
91{
92fileName = QFileDialog::getSaveFileName( this, tr("Сохранить документ"),
93QDir::currentPath(), tr("Текстовые документы (*.txt)"),
940, QFileDialog::DontUseNativeDialog );
95
96file.setFileName(fileName + ".txt");
97if(file.open(QIODevice::WriteOnly | QIODevice::Text))
98{
99QTextStream writeStream(&file);
100
101for (int i = 0;i < 2;i++)
102{
103for (int j = 0;j < 2;j++)
104{
105writeStream << ui->substitutionTable->model()->index(i, j).data().toString();
106}
107writeStream << "\n";
108}
109
110file.close();
111}
112}
113
114void MainWindow::on_loadText_clicked()
115{
116fileName = QFileDialog::getOpenFileName( this, tr("Открыть документ"),
117QDir::currentPath(), tr("Текстовые документы (*.txt)"),
1180, QFileDialog::DontUseNativeDialog );
119
120file.setFileName(fileName);
121if(file.open(QIODevice::ReadOnly | QIODevice::Text))
122{
123QTextStream readStream(&file);
124qText = readStream.readAll();
125ui->text->document()->setPlainText(qText);
126file.close();
127}
128}
129
130void MainWindow::on_codeText_clicked()
131{
132qText = ui->text->document()->toPlainText();
133
134if(!substitutuinTableIsCreated)
135{
136errorMessageBox.setText("Не создана таблица!");
137errorMessageBox.exec();
138}
139else if(qText.isEmpty())
140{
141errorMessageBox.setText("Отсутствует текст!");
142errorMessageBox.exec();
143}
144else
145{
146ui->text->document()->clear();
147qEncryptedText.clear();
148
149unsigned int i = 0;
150text = qText.toLocal8Bit().constData();
151qText.clear();
152substitutionTable = qSubstitutionTable.toLocal8Bit().constData();
153while (i < text.size())
154{
155character = text[i];
156for(int j = 0;j < model->columnCount();j++)
157{
158if(character == ui->substitutionTable->model()->index(0, j).data().toString().toLocal8Bit().constData())
159{
160encryptedCharacter = ui->substitutionTable->model()->index(1, j).data().toString().toLocal8Bit().constData();
161break;
162}
163}
164
165qEncryptedText = qEncryptedText + QString::fromLocal8Bit(encryptedCharacter.c_str());
166i++;
167}
168
169ui->text->document()->setPlainText(qEncryptedText);
170}
171}
172
173void MainWindow::on_decodeText_clicked()
174{
175qEncryptedText = ui->text->document()->toPlainText();
176
177if(!substitutuinTableIsCreated)
178{
179errorMessageBox.setText("Не создана таблица!");
180errorMessageBox.exec();
181}
182else if(qEncryptedText.isEmpty())
183{
184errorMessageBox.setText("Отсутствует текст!");
185errorMessageBox.exec();
186}
187else
188{
189ui->text->document()->clear();
190qText.clear();
191
192encryptedText = qEncryptedText.toLocal8Bit().constData();
193qEncryptedText.clear();
194substitutionTable = qSubstitutionTable.toLocal8Bit().constData();
195unsigned int i = 0;
196while (i < encryptedText.size())
197{
198encryptedCharacter = encryptedText[i];
199for(int j = 0;j < model->columnCount();j++)
200{
201if(encryptedCharacter == ui->substitutionTable->model()->index(1, j).data().toString().toLocal8Bit().constData())
202{
203character = ui->substitutionTable->model()->index(0, j).data().toString().toLocal8Bit().constData();
204break;
205}
206}
207
208qText = qText + QString::fromLocal8Bit(character.c_str());
209i++;
210}
211
212ui->text->document()->setPlainText(qText);
213}
214}
215
216void MainWindow::on_saveText_clicked()
217{
218fileName = QFileDialog::getSaveFileName( this, tr("Сохранить документ"),
219QDir::currentPath(), tr("Текстовые документы (*.txt)"),
2200, QFileDialog::DontUseNativeDialog );
221
222file.setFileName(fileName+".txt");
223if(file.open(QIODevice::WriteOnly | QIODevice::Text))
224{
225QTextStream writeStream(&file);
226writeStream << ui->text->toPlainText();
227file.close();
228}
229}
230
231void MainWindow::on_englishAlphabetRadioButton_clicked()
232{
233setEnglishAlphabetTable();
234}
235
236void MainWindow::on_russianAlphabetRadioButton_clicked()
237{
238codesOfSymbols.clear();
239
240charactersCount = 67;
241
242model = new QStandardItemModel(2, charactersCount);
243ui->substitutionTable->setModel(model);
244
245for(int i = -64;i < 0;i++)
246{
247codesOfSymbols.append(i);
248if(i == -59)
249codesOfSymbols.append(-88);
250if(i == -27)
251codesOfSymbols.append(-72);
252}
253
254for (int i = 0;i < codesOfSymbols.size();i++)
255{
256character = codesOfSymbols.at(i);
257qCharacter = QString::fromLocal8Bit(character.c_str());
258
259index = model->index(0, i, QModelIndex());
260model->setData(index, qCharacter);
261}
262}
263
264void MainWindow::setEnglishAlphabetTable()
265{
266codesOfSymbols.clear();
267
268charactersCount = 53;
269
270model = new QStandardItemModel(2, charactersCount);
271ui->substitutionTable->setModel(model);
272
273for(int i = 65;i < 123;i++)
274{
275codesOfSymbols.append(i);
276if(i == 90)
277i = i + 6;
278}
279codesOfSymbols.append(32);
280
281for (int i = 0;i < codesOfSymbols.size();i++)
282{
283character = codesOfSymbols.at(i);
284qCharacter = QString::fromLocal8Bit(character.c_str());
285
286index = model->index(0, i, QModelIndex());
287model->setData(index, qCharacter);
288}
289}
290