Шифрование и расшифрование, Исходный код - Алгоритм кодировки RSA
Предположим, Боб хочет послать Алисе сообщение.
Сообщениями являются целые числа в интервале от до, т. е.
Шифрование:
- - Взять Открытый Ключ Алисы - Взять Открытый Текст - Зашифровать сообщение с использованием открытого ключа Алисы:
Расшифрование:
- - Принять зашифрованное сообщение - Взять свой Закрытый Ключ - Применить закрытый ключ для расшифрования сообщения:
Приложение алгоритм ключ шифрование
Исходный код
Clientwindow. h
#ifndef CLIENTWINDOW_H
#define CLIENTWINDOW_H
#include <QMainWindow>
#include <QtNetwork/QAbstractSocket>
#include <QtNetwork/QTcpSocket>
#include <QtCore/QTime>
//#include "startdialog1.h"
//#include "startdialog2.h"
//#include <QWidget>
#define DEFAULT_HOST "127.0.0.1"
#define DEFAULT_PORT 2323
Namespace Ui {
Class ClientWindow;
}
Class ClientWindow: public QMainWindow
{
Q_OBJECT
Public:
QString strHost;
Quint16 nPort;
ClientWindow(const QString&; strHost, quint16 nPort, QWidget* pwgt = 0) ;
~ClientWindow();
Void setStrHost(QString str) {strHost = str;}
Void setNPort(quint16 value) {nPort = value;}
QString getStrHost() const {return strHost;}
Quint16 getNPort() const {return nPort;}
Void setDefaultValues();
Qint64 encrypt(char ch);
Char decrypt(qint64 ch);
Private:
Ui::ClientWindow *ui;
Quint16 nNextBlockSize;
QTcpSocket *pTcpSocket;
Qint64* encrypted;
Char* decrypted;
Qint64 n;
Int e;
Int d;
Qint64 generateNumber(qint64 n);
Qint64 gcd(qint64 a, qint64 b);
Private slots:
Void slotReadyRead();
Void slotError(QAbstractSocket::SocketError);
Void slotSendToServer();
Void slotConnected();
Void slotDisconnected();
Void on_disconButton_clicked();
Void generateKeys();
};
#endif // CLIENTWINDOW_H
Clientwindow. cpp
#include "clientwindow. h"
#include "ui_clientwindow. h"
#include "startdialog1.h"
#include <QMessageBox>
#include <limits. h>
#include <math. h>
#include <ctime>
ClientWindow::ClientWindow(const QString&; strHost, quint16 nPort, QWidget* pwgt /*=0*/):
QMainWindow(pwgt),
Ui(new Ui::ClientWindow),
NNextBlockSize(0)
{
Ui->setupUi(this);
SetStrHost(strHost);
SetNPort(nPort);
PTcpSocket = new QTcpSocket(this);
PTcpSocket->ConnectToHost(strHost, nPort);
Connect(pTcpSocket, SIGNAL(connected()), SLOT(slotConnected()));
Connect(pTcpSocket, SIGNAL(disconnected()), SLOT(slotDisconnected()));
Connect(pTcpSocket, SIGNAL(readyRead()), SLOT(slotReadyRead()));
Connect(pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
This, SLOT(slotError(QAbstractSocket::SocketError)));
Connect(ui->sendButton, SIGNAL(clicked()), SLOT(slotSendToServer()));
Connect(ui->generateKeysButton, SIGNAL(clicked()), SLOT(generateKeys()));
//connect(ui->textEdit_2, SIGNAL(pressed()),SLOT(slotSendToServer()));
// font size fix for Ubuntu
QFont _font = font();
_font. setPointSize(8);
SetFont(_font);
Ui->progressBar->hide();
}
Void ClientWindow::slotReadyRead()
{
QDataStream in(pTcpSocket);
In. setVersion(QDataStream::Qt_4_5);
For (;;) {
If (!nNextBlockSize) {
If (pTcpSocket->BytesAvailable() < sizeof(quint16)) {
Break;
}
In >> nNextBlockSize;
}
If (pTcpSocket->BytesAvailable() < nNextBlockSize) {
Break;
}
QTime time;
QString str;
In >> time >> str;
If (str. contains("/auth/succeed"))
{
Ui->textEdit->append(time. toString() + " [Server]: " + '"' + "Client" + '"' + " has connected.");
QDebug() << "!" << ui->textEdit->document()->toPlainText();
SetWindowOpacity(1);
Ui->sendButton->setFocus();
}
Else if (str. contains("/auth/failed"))
{
}
Else if (str. contains("/disc/"))
{
PTcpSocket->DisconnectFromHost();
}
Else if (str. contains("/encrypted/"))
{
//str. remove("/encrypted/");
Str. clear();
Int length;
In >> length;
Encrypted = new qint64[length];
Int i = 0;
Ui->progressBar->show();
Ui->progressBar->setRange(0, length);
While (!in. atEnd()) {
In >> encrypted[i];
Str. append(QChar(decrypt(encrypted[i])));
Ui->progressBar->setValue(i);
I++;
}
Ui->progressBar->hide();
Delete[] encrypted;
Ui->textEdit->append(time. toString() + " [Server]: [DECRYPTION] " + str);
}
NNextBlockSize = 0;
}
}
Void ClientWindow::slotError(QAbstractSocket::SocketError err)
{
QString strError =
"Error: " + (err == QAbstractSocket::HostNotFoundError?
"The host was not found.":
Err == QAbstractSocket::RemoteHostClosedError?
"The remote host is closed.":
Err == QAbstractSocket::ConnectionRefusedError?
"The connection was refused.":
QString(pTcpSocket->errorString()));
Int n = QMessageBox::critical(0,
"Attention", strError + " Try again?", QMessageBox::Yes |
QMessageBox::Cancel);
If (n == QMessageBox::Yes) {
StartDialog1 *sd1 = new StartDialog1;
Sd1->show();
Close();
}
Else if(n == QMessageBox::Cancel){
QDebug() << n;
Close();
}
Ui->textEdit_2->append(strError);
}
Void ClientWindow::slotSendToServer()
{
QString str = ui->textEdit_2->document()->toPlainText();
If (str. isEmpty()) return;
If (ui->encryptCheckBox->isChecked()) {
If (!n || ui->publicKeyLineEdit->text().isEmpty() || ui->secretKeyLineEdit->text().isEmpty()) {
QString strError;
StrError = QString("You must generate keys first if you want to encrypt the message. Press the "") +
QString("Generate Keys" button or toogle off the "Encrypt" check box.");
Int n = QMessageBox::critical(0, "Attention", strError, QMessageBox::Yes);
If (n == QMessageBox::Yes) {
Return;
}
Else if(n == QMessageBox::Cancel){
Return;
}
Ui->textEdit->append(QTime::currentTime().toString() + "[ERROR]: " + strError);
}
}
QByteArray arrBlock;
QDataStream out(&;arrBlock, QIODevice::WriteOnly);
Out. setVersion(QDataStream::Qt_4_5);
Out << quint16(0) << QTime::currentTime();
QTextStream stream(&;str);
Char ch;
//out << str. length();
If (ui->encryptCheckBox->isChecked()) {
Out << QString("/encrypted/");
Out << str. length();
Encrypted = new qint64[str. length()];
Int i = 0;
Ui->progressBar->show();
Ui->progressBar->setRange(0, str. length());
While (!stream. atEnd()) {
Stream >> ch;
Encrypted[i] = encrypt(ch);
//ch = encoded[0];
Out << encrypted[i];
Ui->progressBar->setValue(i);
I++;
}
Ui->progressBar->hide();
}
Else {
Out << str;
}
Out. device()->Seek(0);
Out << quint16(arrBlock. size() - sizeof(quint16));
PTcpSocket->write(arrBlock);
Str = QTime::currentTime().toString() + " [Client]: " + ui->textEdit_2->document()->toPlainText();
Ui->textEdit->append(str);
Ui->textEdit_2->clear();
Delete[] encrypted;
}
Void ClientWindow::slotConnected()
{
If (pTcpSocket->state() == 0) {
PTcpSocket->ConnectToHost(getStrHost(), getNPort());
}
QDebug() << "connected";
/*QByteArray arrBlock;
QDataStream out(&;arrBlock, QIODevice::WriteOnly);
Out. setVersion(QDataStream::Qt_4_5);
Out << quint16(0) << QTime::currentTime() << "/auth/";
Out. device()->seek(0);
Out << quint16(arrBlock. size() - sizeof(quint16));
QDebug() << quint16(arrBlock. size() - sizeof(quint16)) << sizeof(quint16) << sizeof("/auth/");
PTcpSocket->write(arrBlock);*/
}
Void ClientWindow::slotDisconnected()
{
}
Qint64 ClientWindow::encrypt(char ch)
{
Qint64 c = 1;
Qint64 code = qint64(ch);
Unsigned int i = 0;
While (i < e) {
C = c * code;
C = c % n;
I++;
}
Return c;
}
Char ClientWindow::decrypt(qint64 ch)
{
Qint64 m = 1;
Unsigned int i = 0;
While (i < d) {
M = m * ch;
M = m % n;
I++;
}
Return char(m);
}
//Алгоритм "решето Сундарама". Выбирает все простые числа
//до заданного (случайно сгенерированного).
Qint64 ClientWindow::generateNumber(qint64 n)
{
Int *a = new int [n];
Qint64 i, j, k;
Memset(a, 0, sizeof(int) * n);
For(i = 1; 3*i+1 < n; i++)
{
For(j = 1; (k = i+j+2*i*j) < n &;&; j <= i; j++)
A[k] = 1;
}
//Выбирает из списка простых чисел ближайшее к заданному.
For(i = n-1; i >= 1; i--)
If(a[i] == 0) {
Return (2 * i + 1);
Break;
}
Delete [] a;
}
//Алгоритм Евклида. Алгоритм для нахождения наибольшего
//общего делителя двух целых чисел. Используется для проверки
//чисел на взаимопростоту.
Qint64 ClientWindow::gcd(qint64 a, qint64 b)
{
Qint64 c;
While (b) {
C = a % b;
A = b;
B = c;
}
Return abs(a);
}
Void ClientWindow::generateKeys()
{
// Генерация двух чисел и выбор двух простых чисел.
Srand( (unsigned)time( NULL ) );
Int p = 1 + rand() % 100;
Int q = 1 + rand() % 100;
Int p_simple = generateNumber(p);
Int q_simple = generateNumber(q);
QDebug() << p << p_simple << q << q_simple;
N = p_simple*q_simple;
//Генерация числа e и проверка его на взаимопростоту
//с числом ((p_simple-1)*(q_simple-1)).
Int e_simple = 0;
While (e_simple!=1)
{
E = 1 + rand() % 100;
E_simple = gcd (e, ((p_simple-1)*(q_simple-1)));
}
//Определение числа d, для которого является истинным
//соотношение (e*d)%((p_simple-1)*(q_simple-1))=1.
Unsigned int d_simple = 0;
D = 0;
While (d_simple!=1)
{
D += 1;
D_simple = (e*d)%((p_simple-1)*(q_simple-1));
}
QString str = "{" + QString::number(e) + ", " + QString::number(n) + "}";
Ui->publicKeyLineEdit->setText(str);
Str = "{" + QString::number(d) + ", " + QString::number(n) + "}";
Ui->secretKeyLineEdit->setText(str);
}
Void ClientWindow::setDefaultValues()
{
SetStrHost(DEFAULT_HOST);
SetNPort(DEFAULT_PORT);
}
ClientWindow::~ClientWindow()
{
Delete ui;
}
Void ClientWindow::on_disconButton_clicked()
{
QByteArray arrBlock;
QDataStream out(&;arrBlock, QIODevice::WriteOnly);
Out. setVersion(QDataStream::Qt_4_5);
Out << quint16(0) << QTime::currentTime() << "/disc/";
Out. device()->Seek(0);
Out << quint16(arrBlock. size() - sizeof(quint16));
PTcpSocket->write(arrBlock);
QString str;
Str = QTime::currentTime().toString() + " [Server]: " + '"' + "Client" + '"' + " has disconnected.";
Ui->textEdit->append(str);
StartDialog1 *sd1 = new StartDialog1;
Sd1->show();
Hide();
//pTcpSocket->disconnectFromHost();
DeleteLater();
}
Результаты работы
Похожие статьи
-
Алгоритм создания открытого и секретного ключей - Алгоритм кодировки RSA
RSA-ключи генерируются следующим образом: 1. Выбираются два различных случайных простых числа и заданного размера (например, 1024 бита каждое). 2....
-
Шифрование данных симметричным алгоритмом
Лабораторная работа Шифрование данных симметричным алгоритмом Цель работы: получить навыки по использованию симметричных криптографических алгоритмов для...
-
Постановка задачи, Описание программы, Алгоритм работы - Алгоритм кодировки RSA
Реализовать клиент серверное приложение для пересылки закодированной информации. В качестве алгоритма реализовать алгоритм RSA. Описание программы...
-
Розгалужені алгоритми бувають двох типів: Повні (If...Else) і неповні (If). Неповне розгалуження. If (x > 100) Сout << x << endl; Прикладом...
-
Програма - це опис розв'язання деякої задачі. Практично в кожній задачі можна виділити окремі допоміжні підзадачі. Деякі підзадачі доводиться...
-
Програмний код для алгоритму ЕЦП ЕЦП DSS/DSА - Розробка електронного цифрового підпису
#include "stdafx. h" Extern "C" { #include "miracl. h" } #include <ctime> #include <cstring> #include <iostream> Class DSA { Public: Big p, q,...
-
ОПИСАНИЕ ПОДПРОГРАММ - Структуры и алгоритмы обработки данных
Процедуры начальной обработки базы данных: 1. void Read() - считывает базу данных и формирует индексный массив. 2. void PrintMas(void) - осуществляет...
-
Програмна реалізація алгоритмів лінійної структури Алгоритм (латинізов. Algorithmi за араб. ім'ям узб. математека аль-Хороезмі) -- набір інструкцій, які...
-
Цикли вкладені - Формування навичок програмування з використанням алгоритмічної мови С++
Часто буває так, що при повтореннях змінюється не одна величина, а дві (чи навіть більше). І при кожному значенні однієї величини інша величина...
-
До цього моменту було розглянуто одновимірні масиви, якими не завжди можна обмежитися. Припустимо, необхідно обробити деякі дані з таблиці. У таблиці є...
-
Одновимірний масив - це масив, з одним параметром, що характеризує кількість елементів одновимірного масиву. Фактично одновимірний масив - це масив, у...
-
Блок-схема алгоритма - Основные типы графических редакторов
РЕАЛИЗАЦИЯ Для реализации приложения был использован языка программирования C++. Код получившейся программы представлен ниже: Код в файле Unit1.h:...
-
Програмний код для алгоритму ЕЦП по Ель Гамалю #include "stdafx. h" #include "ElGamal. h" #include <ctime> #include <iostream> Inline void...
-
Блок - схема алгоритму, Опис алгоритму - Розробка гри в С# "Корови та бики"
Рисунок 2.1 - Блок - схема алгоритму роботи програми Рисунок 2.1 (продовження) Опис алгоритму 3.1. Робота програми розпочинається з виділення пам'яті під...
-
Задание: 1. Прочитать текст "Алгоритм и его свойства", в таблице №1 "Алгоритм и его свойства" проверьте правильное заполнение таблицы. Запишите в тетрадь...
-
Исследования временных затрат алгоритмов - Алгоритмы нескольких махов
Исследования временных затрат алгоритмов были проведены для трех вариантов программ: LBFS4, LBFS3, MNS3; для двух вариантов сборки исполняемого файла:...
-
Программа задания случайных графов Эрдеша - Реньи - Алгоритмы нескольких махов
Программа реализует алгоритм задания случайных графов Эрдеша - Реньи. В качестве входных параметров задаются число вершин и число ребер. Вершины ребер...
-
Для проведения тестов была написана программа задания единичного интервального графа. Входные параметры: число вершин, длина отрезка на котором задается...
-
Слово "Алгоритм" происходит от algorithmi - латинского написания имени аль-Хорезми, под которым в средневековой Европе знали величайшего математика из...
-
Программные модули проекта, Представление графа в памяти ЭВМ - Алгоритмы нескольких махов
Все программы были реализованы на языке С++ на персональной ЭВМ с операционной системой Windows. Каждая программа представляет собой консольное...
-
Итерационные алгоритмы разрезания графа на куски
Лекция Итерационные алгоритмы разрезания графа на куски Суть Итерационных Алгоритмов Разрезания Графов заключается в выборе первого случайного разрезания...
-
В основе алгоритма лежит численное исследование пространства управляемых параметров редуктора. Процесс поиска оптимального решения выполняется за четыре...
-
Работа программы представлена на рисунке 2.3 Рис. 2.3 Кодирование и тестирование программы Программа кодировалась на языке Си++, используя библотеку Qt5x...
-
Оператор SWITCH - Формування навичок програмування з використанням алгоритмічної мови С++
Оператор switch дозволяє здійснити вибір серед декількох фрагментів коду, залежно від значення цілочисельного виразу. Тіло оператора switch складається з...
-
Розгалужені алгоритми бувають двох типів: Повні (If...Else) і неповні (If). Неповне розгалуження. Приклад: If (x>100) Cout << x <<endl;...
-
Для оценки возможности выполнения проекта имеющимся в распоряжении разработчика штатным составом исполнителей, нужно рассчитать их среднее количество,...
-
Для того, чтобы использовать симметричные алгоритмы шифрования, необходимо безопасно обменяться ключами. Протокол Диффи - Хеллмана позволяет двум и более...
-
Цель Работы - изучить основные способы работы с пользовательским типом данных "класс", его объектами, методами и способы доступа к ним. - Теоретические...
-
Основная программа Построение интерполяционного многочлена Нахождение максимума функции методом дихотомии Вычисление значения заданной функции Создание и...
-
ОСОБЕННОСТИ РЕАЛИЗАЦИИ АЛГОРИТМОВ - Структуры и алгоритмы обработки данных
В ходе выполнения курсовой работы, помимо основных алгоритмов, потребовалось реализовать также несколько вспомогательных, необходимых для корректной...
-
Формулировка задания: Составьте программу подсчета числа тех гласных букв в слове X, что не используются в написании слова Z. Описание входных/выходных и...
-
В данной главе приводится описание различных криптографических алгоритмов для безопасной передачи данных в приложении. RSA Для того, чтобы избежать...
-
Цифровий підпис на основі алгоритму Ель Гамаля (EGSA) Хешування відбувається за схемою, зображеної на рис. 2.1 Рисунок 2.1 - Схема функції хешування...
-
Стек технологий При выборе стека технологий основное внимание уделялось следующим факторам, в порядке убывания значимости: § Кроссплатформенность; §...
-
Описание алгоритмов Рассмотрим один из основных алгоритмов, задействованных в программе, - алгоритм передвижения мяча. Блок-схема алгоритма изображена на...
-
Теоретические аспекты поставленной задачи В этой части проекта будут объяснены этапы применения МКЭ для плоской фермы. В первой главе было рассмотрено...
-
Обзор классического подхода Приведем теорему для формирования линейного закона управления с обратной связью в пространстве состояний [3]: Дан объект,...
-
Для ускорения процесса конструирования регулятора в пространстве состояний в Matlab была разработана функция, которая, при должной настройке, позволяет...
-
Технические требования Техническое задание данной работы требует разработать программу для визуального редактирования HTML-кода. Программа должна быть...
-
Исходные данные, Пользовательские типы данных - Система поиска автобусных маршрутов
Пользовательские типы данных В программе использовано несколько пользовательских типов данных. Так как программа написана с использованием...
Шифрование и расшифрование, Исходный код - Алгоритм кодировки RSA