Шифр Цезаря - самый простой и широко известный метод шифрования. Он также известен как шифр Цезаря, шифр сдвига, код Цезаря, сдвиг Цезаря или ROT N. (ROT13 - самый известный, смещающий буквы на 13).

Это очень просто, потому что он работает только с буквами между A и Z, игнорируя все специальные символы, такие как точки, пробелы, вопросительные знаки и специальные буквы, например Ç или Á.

Начиная нашу реализацию, нам нужно создать класс, который будет знать, что мы хотим зашифровать, и сколько поворотов мы сделаем.

Сделав это, нам нужно сместить, сколько символов мы хотим, поэтому нам нужно добавить метод shift:

Как видите, на этом этапе у нас возникла небольшая проблема. Если новый_байт (старый байт плюс количество байтов, которое вы хотите повернуть) больше, чем Z или z, мы должны начать сдвигать его с A или a снова. Когда это происходит, мы уменьшаем единицу, потому что мы должны учитывать начальный символ.

В этом примере initial_byte - это байт для A или a и limit_byte - это байт для Z или z. Таким образом, мы всегда вращаемся только между буквами.

Итак, мы должны выяснить, как найти байты для каждого символа внутри строки. Погрузившись в Ruby, это легко сделать, вызвав метод bytes. Зная это, мы имеем следующее:

  • A представлен байтом 65.
  • Z представлен байтом 90.
  • a представлен байтом 97.
  • z представлен байтом 122.

Следующий шаг - найти наши initial_byte и limit_byte или игнорировать этот символ. Для этого мы проверим, находятся ли байты, присутствующие внутри данного текста, между байтами диапазона для букв, которые мы хотим, если нет, мы просто вернем байт.

Самый быстрый способ снова преобразовать эти байты в строку - вызвать pack. Короче говоря, pack преобразует данный массив в строку. Мы также указываем c * в качестве параметра метода. В этом случае c означает 8-битовое целое число со знаком, а * означает, что необходимо преобразовать весь массив.

Теперь мы можем зашифровать сообщение, используя технику Цезаря, если мы хотим его расшифровать, мы должны сдвинуть его в противоположном направлении, как здесь:

Метод дешифратора должен выглядеть точно так же, как и шифр. Просто продублируйте cipher и измените подпись метода на decipher.

Итак, попробуем наш код!

Вы также можете расшифровать текст, например:

Интересная вещь происходит, когда вы используете вращение, равное 13. Между A и Z у нас ровно 26 букв. , поэтому не имеет значения, вызываете ли вы cipher или decipher, он вернет тот же результат.

Чтобы получить другие результаты, вам нужно изменить вращение на другое значение!

К сожалению, это решение не работает для строк с многобайтовыми символами. Спасибо ребятам из Slack, которые это заметили! Если вам нужно решение, которое работает с многобайтовыми символами, вам следует реализовать решение, основанное на делении модов.

Это первый пост о шифре, моя идея - реализовать некоторые методы и попытаться легко объяснить это здесь. Если вы хотите взглянуть на весь код, пожалуйста, проверьте на Github.

Вы также можете найти меня в Twitter, Github, XING или LinkedIn.