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)); }
Барлығы
Жобаны келесі сілтемеден жүктеп алуға болады.
Шифрует/дешифрует текст от 8 символов, так и должно быть?
Не обратил внимания на это, Проверял с большим текстом.. По идее не должно.
Хоть пост и старый, но хочется понять. В случае xor шифрования символов мы может получить специальнвй символ(к примеру \0 или \n)? И, если, к примеру, нам нужно записать в текстовый файл эти данные, то мы при следующем считывании можем получить проблемы с считыванием?
в контексте этой статьи с символом \n, то есть символом новой строки проблем быть не должно, поскольку он точно присутствует в таблице символов ASCII, касательно \0 смотрите в таблице символов ASCII, если есть соответствующий символ.
А так, по идее можно доработать и для юникода и для любой другой кодировки, тогда проблем быть не должно.
Здравствуйте, не очень понимаю, почему в строках
добавляется единица к inputLength и keyLength?