VMPC (Variably Modified Permutation Composition, переменно-изменённое сочетание перестановок) — простой в реализации шифр, появившийся в 2004-м году. В самой базовой версии его можно запрограммировать за 10 строчек кода, приведённых в Википедии. Я встречал мнение, что он ненадёжен — его можно взломать не слишком большими трудозатратами.
Базовые термины
Исходное сообщение — исходный осмысленный текст, который надо утаить от недоброжелателей. Это массив байтов произвольной длины.
Зашифрованное сообщение — получающийся в результате шифрования массив байтов, той же длины, что и исходное сообщение, но выглядящее полной белибердой.
Внутреннее состояние
Внутреннее состояние шифра характеризуется тремя составляющими:
- Ключ
- Вектор иницилизации
- Массив перестановок
Ключ
Под ключом понимается массив из байтов K длины k, причём
.
Ключ — это секретный пароль, вводимый пользователем. Если злоумышленника получил доступ к ключу, он сможет расшифровать все сообщения, зашифрованные этим ключом.
Ключ надо определять один раз перед шифровкой или расшифровкой сообщения произвольной длины.
Ключ — это секретный пароль, вводимый пользователем. Если злоумышленника получил доступ к ключу, он сможет расшифровать все сообщения, зашифрованные этим ключом.
Ключ надо определять один раз перед шифровкой или расшифровкой сообщения произвольной длины.
Вектор инициализации
Вектор инициализации — это массив из байтов V длины v, причём
.
Вектор инициализации был придуман в криптографии ради дополнительной защиты канала связи, если вы пользуетесь всё время одним и тем же ключом. Вектор инициализации является публичной информацией — он прилагается к зашифрованному сообщению, и это не помогает недоброжелателю расшифровать сообщение.
Вектор инициализации генерируется случайным образом перед шифрованием, должен быть сохранён и приложен к зашифрованному сообщению, и используется в расшифровке сообщения совместно с секретным ключом.
Вектор инициализации был придуман в криптографии ради дополнительной защиты канала связи, если вы пользуетесь всё время одним и тем же ключом. Вектор инициализации является публичной информацией — он прилагается к зашифрованному сообщению, и это не помогает недоброжелателю расшифровать сообщение.
Вектор инициализации генерируется случайным образом перед шифрованием, должен быть сохранён и приложен к зашифрованному сообщению, и используется в расшифровке сообщения совместно с секретным ключом.
Массив перестановок
К внутреннему состоянию шифра также относятся массив из 256 байтов P («массив перестановок») и целочисленный индекс s,
. В процессе подготовки, шифрования и расшифрования значения P и s постоянно меняются — в отличие от ключа и вектора инициализации, которые фиксируются на всё время работы алгоритма.
Этапы алгоритма
Алгоритм разделён на два этапа:
- Изначальная подготовка внутреннего состояния алгоритма
- Шифрование либо расшифрование сообщения
Изначальная подготовка
- Пользователь вводит секретный ключ.
- Вектор инициализации. В случае шифрования — генерируется случайным образом. В случае расшифрования — берётся тот, который был использован при шифровании сообщения.
- Стартовые значения: массив P заполнен нарастающими с 0 числами, от 0 до 255. Индекс s изначально равен 0.
- Для изначальной подготовки массива P и индекса s надо вызвать алгоритм VMPC-KSA (Key Scheduling Algorithm, алгоритм планирования ключа). Создатель VMPC предлагает вызывать KSA дважды в стандартном подходе, либо трижды — для повышенной надёжности. Алгоритм KSA работает либо на ключе, либо на векторе инициализации — лишь бы был массив байтов некоторой длины. KSA ничего не производит: единственная цель алгоритма — это изменить состояние P и s.
- Если мы решили вызывать KSA дважды, то в первый раз его надо вызвать с ключом, а второй раз с вектором инициализации.
- Если мы решили вызывать 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]
Комментариев нет:
Отправить комментарий