понедельник, 16 мая 2016 г.

Как работает алгоритм шифрования VMPC

VMPC (Variably Modified Permutation Composition, переменно-изменённое сочетание перестановок) — простой в реализации шифр, появившийся в 2004-м году. В самой базовой версии его можно запрограммировать за 10 строчек кода, приведённых в Википедии. Я встречал мнение, что он ненадёжен — его можно взломать не слишком большими трудозатратами.

Базовые термины

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

Внутреннее состояние

Внутреннее состояние шифра характеризуется тремя составляющими:
  • Ключ
  • Вектор иницилизации
  • Массив перестановок

Ключ

Под ключом понимается массив из байтов K длины k, причём .
Ключ — это секретный пароль, вводимый пользователем. Если злоумышленника получил доступ к ключу, он сможет расшифровать все сообщения, зашифрованные этим ключом.
Ключ надо определять один раз перед шифровкой или расшифровкой сообщения произвольной длины.

Вектор инициализации

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

Массив перестановок

К внутреннему состоянию шифра также относятся массив из 256 байтов P («массив перестановок») и целочисленный индекс s, . В процессе подготовки, шифрования и расшифрования значения P и s постоянно меняются — в отличие от ключа и вектора инициализации, которые фиксируются на всё время работы алгоритма.

Этапы алгоритма

Алгоритм разделён на два этапа:
  • Изначальная подготовка внутреннего состояния алгоритма
  • Шифрование либо расшифрование сообщения

Изначальная подготовка

  1. Пользователь вводит секретный ключ.
  2. Вектор инициализации. В случае шифрования — генерируется случайным образом. В случае расшифрования — берётся тот, который был использован при шифровании сообщения. 
  3. Стартовые значения: массив P заполнен нарастающими с 0 числами, от 0 до 255. Индекс s изначально равен 0.
  4. Для изначальной подготовки массива P и индекса s надо вызвать алгоритм VMPC-KSA (Key Scheduling Algorithm, алгоритм планирования ключа). Создатель VMPC предлагает вызывать KSA дважды в стандартном подходе, либо трижды — для повышенной надёжности. Алгоритм KSA работает либо на ключе, либо на векторе инициализации — лишь бы был массив байтов некоторой длины. KSA ничего не производит: единственная цель алгоритма — это изменить состояние P и s.
  5. Если мы решили вызывать KSA дважды, то в первый раз его надо вызвать с ключом, а второй раз с вектором инициализации.
  6. Если мы решили вызывать KSA трижды, то как и ранее, первый раз вызываем его с ключом, второй раз с вектором инициализации, а в третий раз снова с ключом.

Алгоритм KSA

Алгоритму KSA на вход подаются массив, обозначим его A, и длина массива a. На практике это будет либо ключ (K, k), либо вектор инициализации (V, v).
Алгоритм использует уже имеющиеся значения P и s и изменяет их в процессе работы.
for j = 0 to 767
    i = j mod 256
    s = P[(s + P[i] + K[j mod c]) mod 256]
    Поменять местами значения P[i] и P[s]

Шифрование / расшифрование

Алгоритмы шифрования и расшифрования полностью совпадают. Суть в том, что алгоритм шифрования производит поток псевдослучайно перемешанных байтов. Эти байты мы называем маской. Маска складывается побитовым исключающим или с исходным сообщением, получаем зашифрованное сообщение.
При расшифровке мы пользуемся абсолютно теми же ключом и вектором инициализации, что и при шифровании сообщения, поэтому алгоритм производит в точности такую же маску. Складывая зашифрованное сообщение с маской побитово, получим исходное сообщение.
Пусть длина сообщения равна l. Алгоритм производит маску — массив байтов L длины l.
j = 0
for j = 0 to l - 1
    i = j mod 256
    s = P[(s + P[i]) mod 256]
    L[j] = P[(P[P[s]] + 1) mod 256]
    Поменять местами значения P[i] и P[s]

Комментариев нет:

Отправить комментарий