Evgenii Legotckoi
Evgenii Legotckoi23. Juli 2017 09:27

Qt/C++ - Tutorial 069. XOR-Verschlüsselung

XOR-Verschlüsselung ist die Anwendung eines Schlüssels durch ein bitweises exklusives ODER auf den ursprünglichen Text. Der bitweise exklusive Mechanismus ist wie folgt:

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

Wenn also ein exklusives ODER ausgeführt wird, gibt es immer einen Nullwert, wenn die Variablen dieselben Werte hatten.

Die Besonderheit von XOR besteht darin, dass dieselbe Funktion Daten sowohl verschlüsseln als auch entschlüsseln kann. Dies ist eine einfache Datenverschlüsselungsmethode, die bei einem ausreichend großen Chiffretext oder einem großen Passwortwörterbuch ziemlich schnell gebrochen werden kann. Dennoch kann es bereits für eine kleine Erstdatensicherung genutzt werden.

Im Zusammenhang mit Qt ist die Verwendung von XOR nicht anders, als wenn das Programm ohne Verwendung von Qt geschrieben wurde. Anders stellt sich hier die Frage, wie Daten zur Verschlüsselung korrekt aus QString-Objekten extrahiert werden, beispielsweise wenn der Text in QTextEdit eingegeben wurde.

Dazu schreiben wir ein Programm, das Folgendes enthält:

  • QTextEdit, das den zu verschlüsselnden Text eingibt.
  • QLineEdit, in dem der Verschlüsselungsschlüssel eingegeben wird.
  • QPushButton, in dessen Click-Handler-Slot die Datenverschlüsselung/-entschlüsselung durchgeführt wird. Auch hier stelle ich fest, dass die Methode gleich verwendet wird.

Das Programm wird wie folgt aussehen:


Projektstruktur

Das Projekt wird mit CMake geschrieben, daher sieht die Struktur wie folgt aus:

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

Verschlüsselungs-/Entschlüsselungsfunktion

Um die Verschlüsselung / Entschlüsselung zu implementieren, müssen Sie:

  • Vorhandensein eines Char-Arrays mit Anfangsdaten
  • Die Länge des Arrays mit den Originaldaten
  • Schlüssel als Char-Array
  • Schlüssellänge
  • Sowie ein Array mit Ausgabedaten.
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];
}

Slot-Handler zum Ausführen der Verschlüsselung

Wie bereits erwähnt, ist es zur Verschlüsselung des Textes notwendig, die Daten korrekt aus den Eingabefeldern zu extrahieren. Dazu müssen Sie den Text in Form eines Strings QString an QByteArray übergeben, aus dem Daten in Form von const char* extrahiert werden. Und nehmen Sie auch die Länge dieser Daten.

Hier gibt es einen Punkt. Die Daten von QString zu QByteArray werden mit der toLatin1()-Methode konvertiert, die die Daten in eine ASCII-Tabelle konvertiert, was zu einer Datenverfälschung führt, wenn der Text in Kyrillisch geschrieben wurde. Das heißt, dieser Verschlüsselungsansatz wird relevant, wenn nur Zeichen aus der ASCII-Tabelle verwendet werden, beispielsweise für Login und Passwort.

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));
}

Insgesamt

Das Projekt kann unter folgendem Link heruntergeladen werden.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Юрий
  • 17. August 2017 08:28

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

Evgenii Legotckoi
  • 17. August 2017 08:33

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

RC
  • 5. Mai 2020 22:46

Хоть пост и старый, но хочется понять. В случае xor шифрования символов мы может получить специальнвй символ(к примеру \0 или \n)? И, если, к примеру, нам нужно записать в текстовый файл эти данные, то мы при следующем считывании можем получить проблемы с считыванием?

Evgenii Legotckoi
  • 6. Mai 2020 02:49

в контексте этой статьи с символом \n, то есть символом новой строки проблем быть не должно, поскольку он точно присутствует в таблице символов ASCII, касательно \0 смотрите в таблице символов ASCII, если есть соответствующий символ.
А так, по идее можно доработать и для юникода и для любой другой кодировки, тогда проблем быть не должно.

b
  • 11. Dezember 2021 01:19

Здравствуйте, не очень понимаю, почему в строках

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

добавляется единица к inputLength и keyLength?

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken