XOR-шифрування — це метод, у якому кожен байт даних поєднують з байтом ключа операцією «виключне АБО» (XOR). Операцію застосовують і для шифрування, і для розшифрування: повторний XOR тим самим ключем повертає оригінал. Саме XOR лежить в основі одноразового блокнота, потокових шифрів і режимів роботи AES, тому його варто розуміти кожному програмісту, особливо тим, хто пише прошивки.
Калькулятор нижче шифрує текст у HEX і Base64, розшифровує їх назад і показує побітову операцію для перших байтів.
Калькулятор XOR-шифрування
Що таке XOR
XOR повертає 1, якщо біти різні, і 0, якщо однакові:
| A | B | A XOR B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Головна властивість для шифрування: (A XOR K) XOR K = A. Інакше кажучи, XOR сам собі обернений. Крім того, A XOR 0 = A, а A XOR A = 0.
Як працює XOR-шифрування
Текст перетворюють на байти (у калькуляторі — UTF-8, тому кирилична літера займає 2 байти). Ключ теж перетворюють на байти. Якщо ключ коротший за дані, його повторюють циклічно. Далі кожен байт даних XOR-ять з відповідним байтом ключа.
// C / Arduino
void xor_crypt(uint8_t *data, size_t len, const uint8_t *key, size_t klen) {
for (size_t i = 0; i < len; i++) {
data[i] ^= key[i % klen];
}
}
// виклик удруге тим самим ключем розшифровує дані
Результат — довільні байти, серед яких є недруковані символи. Тому шифротекст зазвичай показують у HEX або Base64. Base64 — це лише запис байтів друкованими символами, а не шифрування.
Чому простий XOR небезпечний
Повторюваний ключ
Якщо ключ «key» має 3 байти, кожен третій байт шифротексту зашифровано тим самим байтом ключа. Це той самий шифр Віженера, тільки над байтами, і ламається він так само: визначають довжину ключа, а далі частотним аналізом кожну позицію.
Відомий відкритий текст
Якщо зловмисник знає хоча б частину оригіналу (наприклад, заголовок файлу «%PDF» чи JSON «{“»), він отримує ключ миттєво: K = C XOR P. Через це XOR з коротким ключем не захищає навіть від початківця.
Повторне використання ключа
Якщо двома однаковими ключами зашифровано два різні повідомлення, то C1 XOR C2 = P1 XOR P2. Ключ зникає, і з поєднання двох текстів їх можна відновити. На цьому погоріли багато систем, від радянських шифрограм проєкту «Венона» до старого Wi-Fi WEP.
Коли XOR справді надійний
- Одноразовий блокнот. Ключ справді випадковий, довжиною з повідомлення, використовується один раз. Тоді шифр стійкий абсолютно.
- Потокові шифри. ChaCha20 чи AES у режимі CTR/GCM генерують з короткого ключа і унікального IV довгу псевдовипадкову гаму, а потім XOR-ять її з даними. Детальніше — у статті про шифрування AES.
Де XOR використовують на практиці
- Обфускація рядків і конфігурацій у прошивках, щоб їх не було видно в дампі (це не захист, а лише ускладнення).
- Контрольні суми й CRC, генератори псевдовипадкових чисел (xorshift).
- Обмін значень без тимчасової змінної та інші бітові трюки з математичних прийомів у програмуванні.
Підсумок
XOR-шифрування просте і швидке, а розшифрування збігається з шифруванням. Однак з коротким повторюваним ключем воно ламається так само легко, як шифр Віженера. Для реальних даних беріть AES-GCM або ChaCha20-Poly1305. Порівняння всіх методів — у статті методи шифрування.
Детальніше про метод див. статтю «XOR cipher» у Вікіпедії.
