Skip to content

Latest commit

 

History

History
27 lines (16 loc) · 3.08 KB

README.md

File metadata and controls

27 lines (16 loc) · 3.08 KB

CryptoXOR

Это сервис, который шифрует текст, делая побитовое исключающее "или" текста и последовательности псевдослучайных чисел.

Все вычисления проводятся у вас в браузере и никуда не передаются.

Это есть на GitHub Pages: https://batmaev.github.io/CryptoXOR

В теории, такое шифрование могло бы быть абсолютно стойким, так как в основе лежит шифр Вернама https://ru.wikipedia.org/wiki/Шифр_Вернама

Но на практике есть ограничения:

  • "Одноразовый блокнот" полностью определяется короткой затравкой. Поэтому он не до конца произвольный, а в шифре Вернама он предполагается произвольным.

  • Прежде чем делать побитовый xor, нужно заменить буквы двоичными числами. А после преобразовать обратно в буквы.

    Если каждая буква — это целое число из отрезка [0, m], то xor не должен выводить число из этого отрезка, иначе мы не сможем выполнить обратное преобразование, и зашифрованное сообщение нельзя будет представить в виде букв. Если пользователю придётся вводить шифротекст с клавиатуры, то ему будет неудобно.

    К сожалению, число букв в алфавите не равно 2^k ни для какого целого k. Поэтому приходится укорачивать случайное число до тех пор, пока не начнёт выполняться свойство про отрезок [0, m].

    Это сильно ограничивает алгоритм. В самом деле, для любых a и b выполняется, что число a xor b лежит между a - b и a + b.

    Из-за этого нет такого, что буква может перейти в любую другую. Чтобы шифрование оказалось отображением множества букв на себя (т.е. выполнялось свойство про отрезок [0, m]), мне пришлось ограничить генерируемые числа b: сделать их меньше 32. А всего разрешено 160 разных символов.

    Из-за этого после шифрования положение буквы в алфавите меняется не сильно. Например, маленькая русская буква, скорее всего, перейдёт в маленькую русскую букву.