БлогNot. Шифр Цезаря для латиницы и кириллицы отдельно

Шифр Цезаря для латиницы и кириллицы отдельно

Шифр Цезаря - один из простейших и учебных методов шифрования сообщения.

Здесь нам нужно было, чтобы сдвиг касался только латинских и русских символов кодировки UTF-8, причём латиница оставалась латиницей, кириллица - кириллицей и процесс был обратим. Маленькая буква при этом не обязана превращаться в маленькую или большая в большую, поэтому в алфавитах они просто перечислены парами (AaBbCc...). Должно работать и больше, чем на одном уровне вложений, например, для исходной строки:

  • сдвиг = 5, исходная строка, нажали "Выполнить", получили "jHOOR, ZRUOG! - ФНГКГО зЙЛН, ЦХГЬЛЕ ДГНОГЙГР"
  • сдвиг = 10, нажали "Выполнить", получили "eCJJM, UMPJB! - ПИЮЁЮЙ гЕЖИ, СРЮЧЖА ЯЮИЙЮЕЮЛ"
  • сдвиг = 10, нажали "Выполнить", получили "jHOOR, ZRUOG! - ФНГКГО зЙЛН, ЦХГЬЛЕ ДГНОГЙГР"
  • сдвиг = 5, нажали "Выполнить", получили исходную строку.

Для простоты предполагаем, что сдвиг не больше мощности алфавита, хотя это нетрудно обойти операцией "остаток от деления".

Полный исходник скрипта можно увидеть, если щёлкнуть правой кнопкой мыши на свободном месте страницы и выбрать пункт меню "Исходный код страницы", "Просмотреть исходный код" и т.п. (название пункта зависит от браузера).

 Открыть скрипт "Простейший шифр Цезаря" в текущем окне/вкладке (3 Кб)

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

Если имеем исходное число N, мощность алфавита K и сдвиг S, то

<script>
 function modCodes (K,N,S) {
  //K: длина целевого интервала больше нуля, индексы 0,1,...,K-1
  //N: исходное число, больше либо равно нулю
  //S: сдвиг, натуральное число
  //вернет строк с содержимым:
  // M = N, переписанное в интервал [0;K-1], преобразованное число I1, восстановленое число I2 = M
  let M = N % K; 
  let I1 = (N + S) % K;
  let I2 = (I1 - S) % K;
  if (I2 < 0) I2 += K;
  return M+' '+I1+' '+I2; //изменить в реальном скрипте
 }

 console.log(modCodes(26,4567,40)); //17 5 17
 console.log(modCodes(3,7,4)); //1 2 1
 console.log(modCodes(33,32,554)); //32 25 32
</script>

теги: textprocessing учебное алгоритм javascript

05.01.2021, 16:55; рейтинг: 73