Андрей Янкович14 июня 2019 г. 6:10

Шифрование данных в Qt алгоритмом RSA c открытым и закрытым ключами без привязки к OpenSSL

Содержание

Введение

В данной статье мы рассмотрим, как организовать шифрование сообщений, а также их подпись с использованием алгоритма RSA (открытый и закрытый ключи) без использования тяжелых библиотек, аналогичных OpenSSL, QCA или LibSodium.

Для начала немного теории

Зачем это нужно?

Существует масса алгоритмов шифрования, большинство из них сводится к тому, что у вас есть сообщение и есть ключ, этим ключом вы шифруете свое сообщение и отправляете своему получателю. Предполагается, что получатель уже имеет ключ, которым сообщение было зашифровано, и расшифровывает его. Однако, такой способ не всегда себя оправдывает, ведь ключ, которым было зашифровано сообщение, нужно предварительно как-то отправить и сделать это так, чтобы его никто не перехватил, а это практически невозможно, так как по пути его можно легко перехватить.

Поэтому в наше время наиболее надежным и популярным стал метод шифрования RSA, шифрование с открытым и закрытым ключами (асинхронное шифрование).

Принцип действия следующий:
В качестве примера мы будем использовать уже устоявшиеся имена участников шифрования: Алиса и Боб.
Предположим, Алиса захотела отправить Бобу секретное сообщение, но не хочет, чтобы его увидел кто-то еще.

  • Боб для этого создает два ключа: открытый и закрытый.

  • Боб отправляет открытый ключ Алисе.

  • Алиса шифрует сообщение открытым ключом Боба.

  • Затем Алиса отправляет зашифрованное сообщение Бобу.

  • Боб закрытым ключом расшифровывает сообщение Алисы.

Ева, которая хочет узнать, о чем переписываются Алиса и Боб, перехватила все их сообщения. Она ничего с ними не может сделать, так как не знает их секретных ключей, а только открытие, так как в алгоритме RSA зашифрованное сообщение ключом А(открытый ключ) можно расшифровать только его парой А1(закрытым ключом).

Таким образом, можно легко и удобно обезопасить важную для вас информацию.

Теперь немного описания

Qt-Secret — это простая библиотека, написанная группой QuasarApp на Qt / qmake , цель которой-обеспечить базовые возможности шифрования, которых так не хватает в нейтивном Qt. А именно: алгоритмы RSA и AES.

Основные возможности:

  • Генерация пар ключей RSA64 и RSA128 (в будущем планируется поддержка чисел побольше до RSA2048)
  • Шифровка и Дешифровка RSA.
  • Подпись и проверка подлинности сообщения.
  • Генерация ключей AES (AES64, AES128, AES256)
  • Шифровка и Дешифровка AES

Работа с Qt-Secret на практике

Сборка и подключение библиотеки в QtCreator к проекту с использованием qmake

  • Открываем ваш репозиторий
    cd yourRepo
  • Добавляем Qt-Secret в ваш репозиторий, например, подмодуль
    git submodule add https://github.com/QuasarApp/Qt-Secret.git
  • Обновляем наши подмодули

    git submodule update --init --recursive

  • Добавляем в свой PRO файл, pri файл библиотеки Qt-Secret

    include($$PWD/Qt-Secret/src/Qt-Secret.pri)

  • И пересобираем проект

Библиотека подключена к вашему проекту, теперь ей можно пользоваться.

Пример использования

Шифрование и дешифрирование сообщений.
#include <qrsaencryption.h> // Подключаем библиотеку Qt-Secret (RSA)

    QByteArray pub, priv; // Создаем переменные под наши ключи.
    QRSAEncryption e;     // Создаем переменную нашего шифровальщика

    // Здесь генерируем нашу пару ключей с разрядностью 128
    e.generatePairKey(pub, priv, QRSAEncryption::Rsa::RSA_128); // or QRSAEncryption::Rsa::RSA_64
    QByteArray msg = "test message";


    auto encodeData = e.encode(msg, pub); // шифруем сообщение публичным ключом
    auto decodeData = e.decode(encodeData, priv); // расшифровываем приватным ключом

    qDebug() << decodeData; // проверяем: на выходе у вас должно получится то же, что и в msg.



Подпись и проверка подписи сообщения.
#include <qrsaencryption.h>

    // Инициализация такая же, как и в предыдущем примере.
    QByteArray pub, priv;
    QRSAEncryption e;
    e.generatePairKey(pub, priv, QRSAEncryption::Rsa::RSA_128); // or QRSAEncryption::Rsa::RSA_64

    QByteArray msg = "test message";

    auto signedMessage = e.signMessage(msg, priv); // подписываем сообщение

    if (e.checkSignMessage(signedMessage, pub)) { // проверяем подпись
        // message signed success
    }

Вывод

Данная библиотека представляет собой простое решение для простых задач шифрования

  • легко подключается
  • легко эксплуатируется.

Но в связи с тем, что данная версия библиотеки поддерживает только числа до 128 бит, ее лучше всего применять только в качестве сессионной защиты, то есть 1 пара ключей - одна сессия.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
- блог компании
D

Доброго времени суток, не подскажите, что делать в данной ситуации, после того, как я сделал все вышеуказанные инструкции для подключения библиотеки к проекту?

Выглядит как ошибка библиотеки. Расскажите подробно на какой платформе вы собираете проект (MinGW или MSVC) их версии и версии Qt.

Та же самая ошибка. MinGW, Qt 5.14.2

Для тех у кого возникает ошибка cannot find -lQt-Secret1, cannot find -lQtBigInt6
Решение и описание проблеммы здесь

ИБ

Библиотека подключилась нормально, только на выводе из первого примера выходит пустое сообщение, вместо "test message" просто "". Никаких ошибок не выдает.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
ЕК

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:90баллов,
  • Очки рейтинга8
ЕК

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
p

C++ - Тест 001. Первая программа и типы данных

  • Результат:40баллов,
  • Очки рейтинга-8
Последние комментарии
g
  • gromoff
  • 10 января 2021 г. 12:53

Поздравляю всё Сообщество EVILEG с Новым Годом!!!

#include <iostream>using namespace std;int main() { cout << "Happy New Year and Thank you!"; return 0;}
МЗ
МЗ

Django - Урок 003. Модель, шаблон и представление в Django

from django.shortcuts import *from django.http import *from django.http import HttpResponseRedirectfrom django.contrib.auth.forms import *from django.urls import reverse_lazyfrom django.views …
МЗ

Django - Урок 003. Модель, шаблон и представление в Django

Я дура. Разобралась. Но, остаюсь вашим читателем)
Сейчас обсуждают на форуме

Проблемы с QTableView

Добрый день! Кто-нибудь сталкивался с тем, чтобы в QTableView (или QTableWidget) менять ширину/высоту и хэдров, и самих ячеек таблицы курсором мыши как это реализовано с помощью resizeSecti…

QSqlTableModel - Как добавить картинки в таблицу, чтобы они отражались в диалоговом окне, но не были частью модели

Если у вас модель, в переопределнном методе QVariant data надо привязываться к Qt::EditRole, это если открывающийся диалог редактирования является частью таблицы
t

Работа с потоками в разных версиях Qt

Добрый день, впервые начал проект в котором активно используются потоки и наткнулся на один не очень приятный момент, например: Существует главный поток (GUI) и созданный поток. Связь…
e
  • eviza
  • 13 января 2021 г. 6:08

QSerialPort. Как правильнее проверить сигнал CTS?

Здравствуйте! Есть задача отслеживать изменение сигнала CTS, можно ли это сделать по таймеру методом QSerialPort::pinoutSignals()?
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB