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?

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

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

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

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

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

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

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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