Легче найти мужчин, готовых добровольно умереть, чем найти тех, кто готов терпеливо терпеть боль. - Юлий Цезарь.

Если вы пропустили вторую часть этой серии, вы можете получить ее здесь.

Шифр подстановки

Простой шифр замены — это моноалфавитный шифр, в котором мы выбираем случайное число от 0 до 25 для каждой буквы открытого текста и используем его только один раз для этой конкретной буквы. Мы просто заменяем один алфавит другим в произвольном порядке. Это делает его намного более сильным по сравнению с шифром прекращения. Нам нужно создать пару вспомогательных функций, которые мы будем использовать в процессе шифрования и дешифрования. Создайте файл JavaScript с именем substitution.js и добавьте в него следующие вспомогательные функции. Давайте перейдем к делу.

Разрушение структуры в ES6

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

let fruits = ['orange', 'apple']
const [firstFruit, lastFruit] = fruits
console.log(firstFruit)
// orange
let car = {color: 'blue', brand:'BMW', model: '1 series'}
const {color, brand} = car
console.log(color)
// blue

Вспомогательные функции

const shuffle = array => {
  let a = 0
  let b = 0
  let character
  for (a = array.length - 1; a > 0; a -= 1) {
    b = Math.floor(Math.random() * (a + 1))
    character = array[a]
    array[a] = array[b]
    array[b] = character
  }
  return array
}
const randomKey = letters => shuffle(letters.split('')).join('')

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

Преобразованный текст

const convertedText = (input, key, letters) => {
  let text = ''
  for (const character of input) {
    let index = letters.indexOf(character.toUpperCase())
    if (index !== -1) {
      text = character ? text += key[index].toUpperCase() : text +=           key[index].toLowerCase()
    } else {
      text += character
    }
  }
  return text
}

Давайте рассмотрим код вместе :

  1. Объявить текст, который является пустой строкой.
  2. Переберите все символы открытого текста.
  3. Найдите алфавит этого числа на ключе и добавьте его к зашифрованному тексту.
  4. Если он не является его частью, добавьте его в зашифрованный текст.
  5. Верните зашифрованный текст и ключ.

Следующим шагом теперь является создание функции для процесса шифрования.

Шифрование

Чтобы зашифровать наш открытый текст, мы используем случайно выбранные буквы в качестве ключа шифрования. Перестановок ключей 26! Это означает, что в этом шифре можно использовать миллиарды возможных ключей. Простая замена не может быть взломана атакой грубой силы.

const encrypt = ({userInput, key, letters}) => convertedText(userInput, key, letters)

Давайте рассмотрим код вместе :

  1. Мы создаем функцию с именем encrypt и деструктурируем переданный ей объект.
  2. Внутри функции нам нужно вызвать convertText и вернуть результат, который будет cipherText.

Поскольку мы закончили с шифрованием, мы можем также перейти к функции расшифровки.

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

const decrypt = ({userInput, key, letters}) => convertedText(userInput, key, letters)

Давайте рассмотрим код вместе:

  1. Мы создаем функцию с именем encrypt и деструктурируем переданный ей объект.
  2. Внутри функции нам нужно вызвать convertText и вернуть результат, который будет обычным текстом.

Как вы можете видеть выше, расшифровка довольно проста, но взломать этот шифр не так просто. Нам нужно быть немного инновационными, чтобы сделать это. Вы должны быть немного инновационными в этом. Если вы стремитесь к вызову, вы можете пойти дальше и попытаться взломать его. подсказка: это связано с просмотром шаблона. Открытый текст и его зашифрованный текст всегда будут иметь один и тот же шаблон слов, независимо от того, какой простой ключ замены использовался для шифрования. Это означает, что мы можем использовать этот шаблон для взлома шифра.

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

const letters = `ABCDEFGHIJKLMNOPQRSTUVWXYZ`
const newKey = randomKey(letters)
const cipherPayload = encrypt({userInput: 'hello from the other side!', key: newKey, letters})
const plainPayload = decrypt({userInput: cipherPayload, key: letters, newKey})

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

$ node substitution.js
KNEEX FYXH OKN XOKNY UCAN!
HELLO FROM THE OTHER SIDE!

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