Evgenii Legotckoi
Evgenii LegotckoiШілде 23, 2017, 9:27 Т.Ж.

Qt/C++ - 069-сабақ. XOR шифрлауы

XOR шифрлауы бастапқы мәтінге биттік эксклюзивті НЕМЕСЕ арқылы кілтті қолдану болып табылады. Биттік эксклюзивті механизм келесідей:

X ЖӘНЕ 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

Шифрлау/шифрды шешу функциясы

Шифрлауды/шифрды шешуді жүзеге асыру үшін сізге қажет:

  • Бастапқы деректері бар таңбалар массивінің болуы
  • Бастапқы деректермен массивтің ұзындығы
  • Кілт таңбалар массиві ретінде
  • Кілт ұзындығы
  • Сондай-ақ шығыс деректері бар массив.
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));
}

Барлығы

Жобаны келесі сілтемеден жүктеп алуға болады.

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Юрий
  • Там. 17, 2017, 8:28 Т.Ж.

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

Evgenii Legotckoi
  • Там. 17, 2017, 8:33 Т.Ж.

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

RC
  • Мамыр 5, 2020, 10:46 Т.Қ.

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

Evgenii Legotckoi
  • Мамыр 6, 2020, 2:49 Т.Ж.

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

b
  • Жел. 11, 2021, 1:19 Т.Ж.

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

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

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

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

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

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

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

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

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз