Алгоритм шифрования "Хамелеон"


Игральные карты можно использовать не только для развлечения, а и шифрования в полевых условиях.
Этот алгоритм основан на алгоритме шифрования RC4. В нем используется колода игральных карт 54 карты (52 без Джокеров).
Колода делится на два набора по 26 карт: карты черной масти и карты красной масти. Каждый набор является, своего рода, самостоятельным алфавитом, поэтому каждой карте от Туза (самая младшая карта) до Короля (самая старшая карта) соответствует определенная буква алфавита. Это можно проиллюстрировать следующей таблицей (она нам пригодится ниже):

+--+--+--+--+--+--+--+--+--+--+--+--+--+
|              Червы/Пики              |
+--+--+--+--+--+--+--+--+--+--+--+--+--+
| A| 2| 3| 4| 5| 6| 7| 8| 9|10| J| Q| K|
+--+--+--+--+--+--+--+--+--+--+--+--+--+
| A| B| C| D| E| F| G| H| I| J| K| L| M|
+--+--+--+--+--+--+--+--+--+--+--+--+--+
|              Бубны/Трефы             |
+--+--+--+--+--+--+--+--+--+--+--+--+--+
| A| 2| 3| 4| 5| 6| 7| 8| 9|10| J| Q| K|
+--+--+--+--+--+--+--+--+--+--+--+--+--+
| N| O| P| Q| R| S| T| U| V| W| X| Y| Z|
+--+--+--+--+--+--+--+--+--+--+--+--+--+

Вместо колоды игральных карт можно использовать карточки с буквами или пластинки из настольной игры «Эрудит». Так же, это позволит расширить количество используемых букв с 26 английских до 33 русских.
Колода карт, а точнее, порядок расположения карт в ней, является ключом для шифрования и расшифровывания. Это важно понимать, т.к стойкость алгоритма зиждется именно на силе его ключа
Непосредственно перед шифрованием открытого текста необходимо применить вектор инициализации IV — это случайная последовательность букв, которая нужна для инициализации состояния колоды перед её использованием. Так же, вектор нужен, что бы затруднить криптоанализ шифрограммы. Этот вектор не является ключом, поэтому его не нужно хранить в секрете. Но для расшифровывания он необходим, поэтому его нужно передавать вместе с шифрограммой, например записав в начале самой шифрограммы.
В этой статье я постараюсь совместить карточную и алфавитную версии алгоритма. Для этого понадобится 2 последовательности для черных 2| и красных 1| карт:

1| ГДЧШВЩЪЙКОПРФЫЬЭЮЯЛМЕЁЖЗИХЦНАБСТУ
2| ЛМНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩОПРСТАБЪЫЮЯ

Буква 1|Г является верхней красной картой, а буква 2|Я — нижней черной.
Более подробно об алгоритме можно почитать тут (есть видеоинструкция). Там же, криптоанализ шифра и небольшая его модификация с целью усиления криптостойкости. Ещё один зарубежный источник с описанием алгоритма и способов его усовершенствования (тут). А отсюда можно взять скрипт на языке Python (анл. алфавит).
Ниже будет дан алгоритм шифрования и дешифрования с учетом рекомендаций по усилению криптостойкости (от оригинала отличается лишь способом замены "красных" карт).

0. Генерация ключевой колоды.
 

Как говорилось выше, ключом шифра является порядок расположения карт в колоде, т. е. сама колода карт. Я опишу один из алгоритмов генерации ключевой колоды.
Для этого нам понадобится стандартная (не перетасованная) колода карт в которой карты расположены по мастям (Трефы, Бубны, Червы, Пики) от самой младшей карты (Туз) до самой старшей (Король).
Для генерации нам понадобится ключевая фраза. Теперь, над колодой нужно проделать следующие манипуляции:

1) Берем колоду лицевой стороной вверх и отсчитываем количество карт равное номеру первой буквы ключевой фразы в алфавите.

2) Следующую за ней карту перемещаем наверх.

3) Все эти карты кладем перед последней картой.

4) Две первые верхние карты перемещаем в конец колоды.

5) Повторяем процедуру пока не будут использованы все буквы ключевой фразы.


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


1. Подготовка колоды.

Будь то колода игральных карт или карточек с буквами или пластинок из игры «Эрудит», перед началом работы её нужно определенным образом подготовить.
Подразумевается, что у вас уже готова ключевая колода, т.е она случайным образом перетасованная и вы запомнили её состояние (порядок карт) или воспользовались какими-то алгоритмами для генерации этой ключевой колоды.

1. И так, колоду, как она есть, необходимо рассортировать на две стопки: стопка черных карт и стопка красных карт. Возьмите её лицевой стороной вверх и раскладывайте карты по порядку их следования на две стопки.

2. Теперь, нужно из этих двух стопок снова собрать полную колоду. Для этого, попеременно берем карты из каждой стопки и складываем их в другую стопку. Первой выкладывается черная карта (это важно), сверху на неё кладется красная, потом снова черная и т. д. В итоге, последней (верхней) должна быть красная карта.

3. Переходим к следующему шагу, а именно — использование вектора инициализации IV. 

2. Использование вектора инициализации IV.

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

1) Используя таблицу отыскиваем черную карту соответствующую букве вектора инициализации.

1| ГДЧШВЩЪЙКОПРФЫЬЭЮЯЛМЕЁЖЗИХЦНАБСТУ
2| ЛМНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩОПРСТАБЪЫЮЯ

2) Красную карту над ней обозначаем, как «t».

1| ГДЧШВЩЪЙКОПРФЫЬЭЮЯЛМЕЁЖЗИХЦНАБСТУ
2| ЛМНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩОПРСТАБЪЫЮЯ

3) Используя таблицу отыскиваем черную карту для карты «t».

1| ГДЧШВЩЪЙКОПРФЫЬЭЮЯЛМЕЁЖЗИХЦНАБСТУ
2| ЛМНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩОПРСТАБЪЫЮЯ

4) Меняем местами красную карту над ней и верхнюю карту (тоже красная).

1| ГДЧШВЩЪЙКОПРФЫЬЭЮЯЛМЕЁЖЗИХЦНАБСТУ
2| ЛМНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩОПРСТАБЪЫЮЯ

1| ЯДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЖЗИХЦНАБСТУ
2| ЛМНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩОПРСТАБЪЫЮЯ

5) Перемещаем черную карту под картой «t» и саму карту «t» вниз колоды.

1| ЯДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБСТУЖ
2| ЛМНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯО

6) Перемещаем 2 верхние карты (красная и черная) вниз колоды.

1| ДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБСТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

Повторяем процедуру до тех пор, пока не используем все буквы вектора инициализации.

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

3. Шифрование.

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

1) Используя таблицу отыскиваем черную карту соответствующую букве открытого текста.

1| ДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБСТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

2) Красную карту над ней обозначаем, как «t».

1| ДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБСТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

3) Используя таблицу отыскиваем черную карту для карты «t».

1| ДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБСТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

4) Красная карта над ней будет зашифрованной буквой. Меняем местами первую красную карту и верхнюю карту (тоже красная).

1| ДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБСТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

1| СЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБДТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

5) Перемещаем 2 верхние карты (красная и черная) вниз колоды и продолжаем шифрование.

1| ЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИДЦНАБДТУЖЯС
2| НИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛМ

Повторяем процедуру пока не зашифруем оставшиеся буквы.
 

4. Расшифровывание.

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

1) Используя таблицу отыскиваем красную карту соответствующую букве зашифрованного текста.

1| ДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБСТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

2) Черную карту под ней обозначаем, как «t».

1| ДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБСТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

3) Используя таблицу отыскиваем красную карту для карты «t».

1| ДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБСТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

4) Черная карта под ней будет расшифрованной буквой открытого текста.

1| ДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБСТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

5) Меняем местами вторую красную карту и верхнюю карту (тоже красная).

1| ДЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБСТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

1| СЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБДТУЖЯ
2| МНИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛ

6) Перемещаем 2 верхние карты (красная и черная) вниз колоды и продолжаем расшифровывание следующей буквы криптограммы.

1| ЧШВЩЪЙКОПРФЫЬЭЮГЛМЕЁЗИХЦНАБДТУЖЯС
2| НИЬЭЙКУФХЦВГДЕЁЖЗЧШЩПРСТАБЪЫЮЯОЛМ

    Повторяем процедуру пока не расшифруем остальные буквы.

 

Комментарии

Популярные сообщения из этого блога

Математика Люшера

Поиграем на микрокалькуляторе

Погода по барометру