Андрей Янкович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
Решение и описание проблеммы здесь

Комментарии

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

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

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

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

Посмотреть Хостинг
ВШ

C++ - Тест 003. Условия и циклы

  • Результат:71баллов,
  • Очки рейтинга1
С

Qt - Тест 001. Сигналы и слоты

  • Результат:100баллов,
  • Очки рейтинга10
С

Qt - Тест 001. Сигналы и слоты

  • Результат:94баллов,
  • Очки рейтинга8
Последние комментарии
VB

Qt/C++ - Урок 004. QSqlTableModel или Как представить таблицу из БД в Qt?

Почему-то такой метод для обновления не работает, который можно было бы применить в данном примере. То есть в представлении данные удаляются и обновляются, а в базе данных изменений не происходи…
ДИ

Qt/C++ - Урок 015. QTableWidget или Как сделать таблицу с чекбоксами

Кажется я понял в чем ошибка - я вручную создал таблицу Device в базе данных DataBase.db через DB Browser for SQLite в корне проекта с соответствующими типами данных и по какой-то причине insert…
ДИ

Qt/C++ - Урок 015. QTableWidget или Как сделать таблицу с чекбоксами

Да, у меня тоже такая мысль возникла, но я просто скопипастил этот код из статьи, ничего в нем не меняя.

Qt/C++ - Урок 015. QTableWidget или Как сделать таблицу с чекбоксами

Пока добавляли у себя код, что-то пробовали проверяли, могло дойти до ситуации, когда у вас получилась создана таблица, с количеством колонок, не совпадающим с количеством колонок в финальной ве…
ДИ

Qt/C++ - Урок 015. QTableWidget или Как сделать таблицу с чекбоксами

Попробовал запустить код, описанный в данной статье, но получаю следующее: Подскажите в чем может быть проблема ? Вывод окна - пустой:
Сейчас обсуждают на форуме
U

Как в qml работать с динамически созданными потомками?

Приветствую, уже полюбившийся форум) Есть у меня Item{id: _window}, в который я по нажатию кнопки создаю объекты: myComponent = Qt.createComponent(paletteItem.componentFile); myC…
U

Помогите сделать наследованый класс MenuElements от класса Menu

Я может что-то не совсем понял... Но наследовать элементы меню от самого меню - верное решение логически? Наследование нужно, чтобы в итоге получился класс, который будет иметь всё то же с…
KM

не знаю что писать в cpp

почти Actionn::Actionn(const QString& name, QWidget *parent) : //lista inicjalizacyjna MenuElement(name,parent), QWidget(parent), ui(new Ui::Actionn) вдруг кто то мучался к…

не могу передать стринг с QLineEdit

QLineEdit *myLineEdit = new QLineEdit("line edit name", this); QString str = myLineEdit->text();

QSqlTableModel не удаётся редактировать и удалять данные

Если через раз, то дело скорее всего в том, что обычно ID является автоинкрементируемым столбцом, который всегда растёт, даже если какие-то строки удалялись из базы данных. Если у вас было 4 зап…
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB