XOR-шифрування: як працює і чому небезпечне

XOR-шифрування: як працює і чому небезпечне

XOR-шифрування — це метод, у якому кожен байт даних поєднують з байтом ключа операцією «виключне АБО» (XOR). Операцію застосовують і для шифрування, і для розшифрування: повторний XOR тим самим ключем повертає оригінал. Саме XOR лежить в основі одноразового блокнота, потокових шифрів і режимів роботи AES, тому його варто розуміти кожному програмісту, особливо тим, хто пише прошивки.

Калькулятор нижче шифрує текст у HEX і Base64, розшифровує їх назад і показує побітову операцію для перших байтів.

Калькулятор XOR-шифрування

Що таке XOR

XOR повертає 1, якщо біти різні, і 0, якщо однакові:

ABA XOR B
000
011
101
110

Головна властивість для шифрування: (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» у Вікіпедії.

Related Posts

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься.