Введение
В данной статье мы рассмотрим, как организовать шифрование сообщений, а также их подпись с использованием алгоритма 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 пара ключей - одна сессия.
Доброго времени суток, не подскажите, что делать в данной ситуации, после того, как я сделал все вышеуказанные инструкции для подключения библиотеки к проекту?

Выглядит как ошибка библиотеки. Расскажите подробно на какой платформе вы собираете проект (MinGW или MSVC) их версии и версии Qt.
Та же самая ошибка. MinGW, Qt 5.14.2
Для тех у кого возникает ошибка cannot find -lQt-Secret1, cannot find -lQtBigInt6
Решение и описание проблеммы здесь
Библиотека подключилась нормально, только на выводе из первого примера выходит пустое сообщение, вместо "test message" просто "". Никаких ошибок не выдает.