Реклама

Qt/C++ - Урок 069. Шифрование методом XOR

XOR, cmake, Qt

XOR-шифрование - это применение ключа через побитовое исключающее ИЛИ к исходному тексту. Механизм побитового исключающего следующий:

X Y X⊕Y
0 0 0
0 1 1
1 0 1
1 1 0

Таким образом при выполнении исключающего ИЛИ всегда будет нулевое значение, если переменные имели одинаковые значения.

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

В контексте Qt применение XOR ничем не отличается от того, как если бы программа была написана без использования Qt. Вопрос здесь в другом, как правильно извлечь данные для шифрации из объектов QString, например, если текст вводился в QTextEdit.

Для этого напишем программу, которая содержит:

  • QTextEdit, в который будет введён текст, который будет зашифрован.
  • QLineEdit, в который будет вводится ключ шифрования.
  • QPushButton, в слоте обработчике нажатия которого, будет выполняться шифрация/дешифрация данных. Снова отмечу, что метод будет использоваться один и тот же.

Программа будет выглядеть следующим образом:

Структура проекта

Проект написан с использованием CMake, поэтому структура будет следующей:

  • CMakeLists.txt
  • main.cpp
  • EncoderWidget.h
  • EncoderWidget.cpp

Функция шифрации/дешифрации

Для реализации шифрации/дешифрации необходимо:

  • Наличие массива char с исходными данными
  • Длина массива с исходными данными
  • Ключ в виде массива char
  • Длин ключа
  • А также массив с выходными данными.
const char* input;
int inputLength;
const char* key;
int keyLength;

char output[inputLength];

for (int i = 0; i < inputLength + 1; ++i)
{
    output[i] = input[i] ^ key[i % keyLength + 1];
}

Слот обработчик для выполнения шифрации

Как уже говорилось, чтобы зашифровать текст, необходимо правильно извлечь данные из полей ввода. Для этого необходимо текст в виде строки QString перевести в QByteArray , из которого извлечь данные в виде const char*. А также забрать длину этих данных.

Здесь есть один момент. Данный из QString в QByteArray переводятся через использование метода toLatin1(), который приведёт данные к ASCII таблице, что приведёт к порче данных, если текст был написан на кириллице. То есть данный подход к шифрации будет актуален, если используются только символа из таблицы ASCII, например, для логина и пароля.

void EncoderWidget::encodeDecode()
{

    const char* input = m_textEdit->toPlainText().toLatin1().data();
    int inputLength = m_textEdit->toPlainText().toLatin1().length();
    const char* key = m_keyLineEdit->text().toLatin1().data();
    int keyLength = m_keyLineEdit->text().toLatin1().length();

    char output[inputLength];

    for (int i = 0; i < inputLength + 1; ++i)
    {
        output[i] = input[i] ^ key[i % keyLength + 1];
    }

    m_textEdit->setText(QString::fromLatin1(output, inputLength));
}

Итог

Проект можно скачать по следующей ссылке

Реклама

Комментарии

Шифрует/дешифрует текст от 8 символов, так и должно быть?

Не обратил внимания на это, Проверял с большим текстом.. По идее не должно.

Комментарии

Только авторизованные пользователи могут оставлять комментарии.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
  • MinusNol
  • 18 октября 2017 г. 16:09

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

  • Результат - 85 баллов
  • MinusNol
  • 18 октября 2017 г. 15:41

C++ - Тест 002. Константы

  • Результат - 58 баллов
  • loctyr
  • 18 октября 2017 г. 10:25

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

  • Результат - 94 баллов
Последние комментарии
  • EVILEG
  • 18 октября 2017 г. 14:45

QML - Урок 031. Отключаем системное обрамление окна в QML и пишем код для обработки перемещения и ресайза окна

Задать свои property в окне и проверять их в методах изменения размера для topArea, bottomArea, rightArea, leftArea. В обработчиках onMouseYChanged, onMouseXChanged. Из-за отключен...

  • Troffe
  • 18 октября 2017 г. 14:35

QML - Урок 031. Отключаем системное обрамление окна в QML и пишем код для обработки перемещения и ресайза окна

После отключения системного обрамления не работают minimumHeight и minimumWidth. Что делать?

  • cordsac
  • 17 октября 2017 г. 15:29

Qt/C++ - Урок 045. SvgReader на Qt. Восстановление данных из файла SVG в QGraphicsScene

Sir I post is as a topic,please help me to solve this problem

  • EVILEG
  • 17 октября 2017 г. 11:44

Qt/C++ - Урок 045. SvgReader на Qt. Восстановление данных из файла SVG в QGraphicsScene

I think You have another version of SVG file. First, need to see content of SVG file. It is simple XML-format, therefore just need to research content. Do You want just open SVG file or ...

  • cordsac
  • 17 октября 2017 г. 2:09

Qt/C++ - Урок 045. SvgReader на Qt. Восстановление данных из файла SVG в QGraphicsScene

Sir,I tried your code for open ellipse item.but my program not open ellipse item.what should I need to do? here is my code : readsvg.cpp QL...

Сейчас обсуждают на форуме
  • cordsac
  • 17 октября 2017 г. 19:28

How can I open SVG file through QT

Okay,Thank you sir :)

  • EVILEG
  • 16 октября 2017 г. 20:34

Qt, Загрузка изображения в QImage

Сам view нужно поместить в внутри окна, а не просто создать его. Можете создать в графическом редакторе Qt Creator`а окно, набросать там QGraphicsView и потом посмотреть в сгенерированном...

  • mihenze
  • 15 октября 2017 г. 21:30

Рисуем линию QGraphicsItem за мышью

Большое спасибо!

  • EVILEG
  • 15 октября 2017 г. 18:58

Описание класса С++ в QtCreator

Для начала добавьте недостающие методы и участники для Q_PROPERTY. Для этого вызовите контекстное меню через ПКМ у Q_PROPERTY, там будет пункт "добавить недостающие члены". Автоматически...

  • EVILEG
  • 15 октября 2017 г. 15:34

Qt+Google Drive

Добрый день! Как-то не занимался этим, поэтому такого примера у меня нет в загашниках.