<aside> ℹ️ Recall XOR operation if needed

</aside>

Суть алгоритма: у нас есть plain_text и one_time_pad. XORим их и получаем cycpher_text. Обратно если XORнуть cycpher_text с one_time_pad, то получим plain_text.

<aside> 💡 Почему это работает:

$t \oplus k = c$, where t - plain_text, k - key, c - cypther_text

$(t \oplus k) \oplus k = t \oplus (k \oplus k) = t$ - we’ve got the original plain text!

</aside>

Проблемы (+ к тем, что есть у symmetric-key cryptography):

  1. Пока one-time pad действительно one-time (используется один раз) проблем с надёжностью не возникает. Но если мы XORнем ещё один текст тем же ключом, то Ева может узнать, какие биты plain_text’а совпадают: $(t1 \oplus k) \oplus (t2 \oplus k) = (t1 \oplus t2) \oplus (k \oplus k) = t1 \oplus t2$
  2. Длина k должна совпадать с длиной t, что может быть проблемой, если t длинный. Решение - Block cyphers and chaining