Шифрование и расшифрование, Исходный код - Алгоритм кодировки 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

Предыдущая | Следующая