Entry tags:
Сенатор

Для обучения мелких основам криптографии придумал игрушечный шифр. Ну то есть не то чтоб сам придумал с нуля, а сложил из готовых кубиков. Хотелось, чтобы весь алгоритм можно было бы запомнить, не напрягаясь, объяснить на пальцах, и чтобы он не ломался базовыми способами вроде частотного анализа.
Описание того, что получилось — под катом.
Сначала превращаем текст в цифры. Для этого используем такую шахматную таблицу:
0 1 2 3 4 5 6 7 8 9 С Е Н А Т О Р 7 Б В Г Д Ё Ж З И Й К 8 Л М П У Ф Х Ц Ч Ш Щ 9 Ь Ы Ъ Э Ю Я . /
В таблице десять колонок, пронумерованных от 0 до 9. В верхнюю строку таблицы вписываем по буквам слово СЕНАТОР. Три последние клетки (7, 8 и 9) остаются незаполненными. Для каждой из незаполненных клеток добавляем отдельную строку. Вписываем в клетки этих строк оставшиеся буквы алфавита и два спецсимвола - точку и косую черту. Остаются две незаполненные клетки, их можно будет потом для чего-нибудь ещё использовать.
Буквы в слове СЕНАТОР представляются одной цифрой. Например, С превращается в 0, Р превращается в 6 и так далее. Остальные буквы представляются двумя цифрами — номером строки и номером колонки. Например, Ъ превращается в 92, Ё превращается в 74.
Таким образом буквы с большой частотностью кодируются меньшим количеством цифр. Это не только позволяет слегка сжать текст, но также затрудняет частотный анализ, который Шерлок Холмс использовал в рассказе "Пляшущие человечки".
Косая черта используется для перехода к цифрам и обратно. Каждая цифра повторяется два раза. Например, 42 превратится в /42/, то есть 97 44 22 97.
Для примера будем шифровать послание из пляшущих человечков — «ПРИХОДИ НЕМЕДЛЕННО».
П Р И Х О Д И Н Е М Е Д Л Е Н Н О 82 6 77 85 5 73 77 2 1 81 1 73 80 1 2 2 5
Теперь надо подготовить гамму. В идеальном случае это должна быть страница из одноразового блокнота, но поскольку мы решили обойтись подручными материалами, то будем использовать в качестве источника ключевого материала какую-нибудь книгу. Книга эта должна быть у обоих сторон. Выбираем страницу наугад и записываем третью букву в каждой строке. Переводим буквы в цифры по той же таблице.
Р О Л К И Ш Ч С С И А Ш С Е О Ю Н 6 5 80 79 77 88 87 0 0 77 3 88 0 1 5 94 2
Остаётся прибавить гамму к сообщению (для каждой цифры отдельно, по модулю 10) и добавить в начало трёхзначный номер страницы.
82 67785 57377 21811 73801 225 04265 80797 78887 00773 88015 942 04247 47472 25154 21584 51816 167
Зашифрованное сообщение: 04247 47472 25154 21584 51816 167
Расшифровка производится в обратном порядке — по первым трём цифрам находим страницу, получаем из неё гамму, вычитаем по модулю 10 из сообщения, переводим цифры в буквы по шахматной табличке.
Известные недостатки:
- Нельзя повторно использовать одну и ту же страницу. Но при этом нельзя помечать использованные страницы. Можно положить закладку и двигать её только вперёд, но это заметно сокращает кодовое пространство.
- Противник может получить доступ к гамме. Например, отсканировать и перепробовать все существующие книги.
- Нет возможности уничтожить использованную страницу. Если книга попадёт в руки противнику, то уже неважно, вырвана там страница или нет — всегда можно найти ещё одну точно такую же книгу и прочитать с её помощью старые сообщения.
- Гамма не совсем случайна. Третья буква распределена ровнее и корреляция между буквами в соседних строчках невелика, но это всё равно не настоящий одноразовый блокнот. С другой стороны зашифровать вручную много сообщений всё равно не получится, так что статистики для частотного анализа будет мало.
- Нет контроля целостности сообщений. Я пытался придумать простой способ его добавить, но пока ничего толкового не нашёл.