Код шифрования ROT13 из .charCodeAt()?

Я новичок в javascript, и это последний курс по базовому алгоритму сценариев. Я пытаюсь понять эту строку кода, когда получаю следующую часть сертификата разработки переднего плана из лагеря свободного кода, я хочу понять все. Я искал решения и нашел это. Я понимаю некоторые строки в комментариях, но мне трудно понять формулу, этот код работает на 100%, но мне просто нужно дополнительное понимание. Это код:

function rot13(str) {

  //retCharArray is an Array of character codes for the solution
  var rotCharArray = [];

  //regular expression for all upper case letter from A to Z
  var regEx = /[A-Z]/;

  //split str into a character array
  str = str.split("");

  for (var x in str) { //iterate over each character in the array
    //regEx.test(str[x]) will return (true or false) if it maches the regEx or not
    if (regEx.test(str[x])) {
      // A more general approach
      // possible because of modular arithmetic 
      // and cyclic nature of rot13 transform

      // I DON'T CLEARLY UNDERSTAND THIS CODE BELOW
      rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);
    } else {
      rotCharArray.push(str[x].charCodeAt());
    }
  }
  //make a string with character codes from an array of character codes
  str = String.fromCharCode.apply(String, rotCharArray);
  return str;
}

// Change the inputs below to test
rot13("SDASasd");


person Glendon Philipp Baculio    schedule 29.04.2016    source источник


Ответы (3)


Два приведенных выше ответа наполовину отвечают на ваш вопрос здесь, но они на самом деле не видят вашей проблемы, которая заключается в том, что для ответа на вызов Free Code Camp вам нужно уйти и понять математику, стоящую за шифром Цезаря, и арифметика ROT13. У меня тоже были проблемы с этим.

Давайте посмотрим на это вместе и пройдемся по ним шаг за шагом. (Я понимаю, что не все изучали это в средней школе - я не!):

  // I DON'T CLEARLY UNDERSTAND THIS CODE BELOW
  rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);
} else {
  rotCharArray.push(str[x].charCodeAt());
}

Ответы @bastos.sergio и @caulitomaz помогают, но они лишь частично объясняют и не указывают на дальнейшие исследования:

@bastos.sergio's

«Получите модуль 26 (это гарантирует, что кодирование не будет шифроваться ни во что выше буквы «Z», например, буква «Z» будет преобразована в (90-65+13)% 26 + 65) = 77 'M ' Письмо. По сути, это заставит алгоритм шифрования вернуться к началу.

@caulitomaz's

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

Здесь они оба имеют в виду «модульную арифметику»:

Модульная арифметика показывает, что некоторые числа "конгруэнтны", то есть они имеют один и тот же остаток, когда к ним применяется операция по модулю.

Например, 2 % 12, 14 % 12, 26 % 12 = остаток 2. Таким образом, когда у вас есть числа, которые должны появляться в диапазоне, или устройство, которое показывает только числа в диапазоне, вы можете определить, где это число «зацикливается».

Обратите внимание, что в моем примере используется % 12 — это общее количество часов, которое могут показывать 12-часовые часы. Поэтому, если сейчас 2 часа ночи, и я хочу узнать время через 12 часов, я добавляю 12. Но мои часы не могут показывать 14:00 (не в 12-часовом режиме). Модуль 12 дает мне реальное время.

Пример. Сейчас 4 часа утра. Мой самолет задержали на 29 часов (ужасная авиакомпания). Как определить новое время взлета? 4 + 29 % 12 = 9 утра. (Если задержка была меньше 24, мне нужно поменять местами am/pm, но вы должны получить изображение.)

ROT13

Здесь у нас есть особый случай ротационного шифра с ROT 13, где двойное применение шифра даст вам исходный символ для кодирования, потому что в алфавите всего 26 символов, а 13 — это ровно половина от 26.

х = ROT13 (ROT13 (х))

Так что на самом деле нам не нужно беспокоиться о добавлении 13 или вычитании 13 при применении или реверсировании шифрования, мы просто применяем его снова, чтобы получить оригинал.

Итак, как работает алгоритм:

  1. Как уже указывалось, наши коды символов для прописных букв A-Z находятся в диапазоне от 65 (A) до 90 (Z). Но мы хотим работать с модульной арифметикой, чтобы найти, в какой диапазон 0-26 попадает новая буква. Поэтому вычтите 65 из кода символа целевой буквы: str[x].charCodeAt() - 65

  2. Примените шифр: добавьте 13

    (str[x].charCodeAt() - 65 + 13)

  3. Примените модуль, чтобы найти букву, которая «зациклилась». Что для нас составляет %26 (количество символов в алфавите):

    (str[x].charCodeAt() - 65 + 13) % 26

  4. Добавьте обратно 65, чтобы у нас был код символа в диапазоне 65...90.

    (str[x].charCodeAt() - 65 + 13) % 26 + 65)

Примеры работы:

ROT13(X)

'X'.charCodeAt(0) = 88

- 65 = 23 

+ 13 = 36

%26 = 10 

+65 = 75 

charCodeFrom(75) = K

ROT13(К)

'K'.charCodateAt(0) = 75

- 65 = 10

+ 13 = 23

%26 = 23

+65 = 88

charCodeFrom(88) = X

Источник(и):

http://betterexplained.com/articles/fun-with-modular-arithmetic/ https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/what-is-modular-arithmetic

person ortonomy    schedule 01.05.2016

Поскольку вы используете только символы верхнего регистра, вам необходимо понимать, с каким диапазоном кодов символов вы работаете. Заглавная буква «А» соответствует 65.

'A'.charCodeAt(0) возвращает 65

И ваше максимальное значение — «Z», что соответствует 90.

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

Чтобы получить правильный charCode, к результату снова добавляется 65.

rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);

person caulitomaz    schedule 29.04.2016

Первый. код преобразует только прописные буквы (см. таблицу ascii ниже)

(str[x].charCodeAt() - 65 + 13) % 26 + 65

Это переводится как

  1. Получите номер штрихкода (он будет между 65 и 90) вычтите 65
  2. Добавить 13
  3. Получите по модулю 26 (это гарантирует, что кодировка не будет шифровать ничего выше буквы «Z», например, буква «Z» будет преобразована в букву (90-65+13) % 26 + 65) = 77 «M». По сути, это зациклит алгоритм шифрования на начало.
  4. Добавить обратно 65

Таблица ASCII

person bastos.sergio    schedule 29.04.2016