dimview: (Default)
[personal profile] dimview

Для обучения мелких основам криптографии придумал игрушечный шифр. Ну то есть не то чтоб сам придумал с нуля, а сложил из готовых кубиков. Хотелось, чтобы весь алгоритм можно было бы запомнить, не напрягаясь, объяснить на пальцах, и чтобы он не ломался базовыми способами вроде частотного анализа.

Описание того, что получилось — под катом.

Сначала превращаем текст в цифры. Для этого используем такую шахматную таблицу:

  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 из сообщения, переводим цифры в буквы по шахматной табличке.

Известные недостатки:

  • Нельзя повторно использовать одну и ту же страницу. Но при этом нельзя помечать использованные страницы. Можно положить закладку и двигать её только вперёд, но это заметно сокращает кодовое пространство.
  • Противник может получить доступ к гамме. Например, отсканировать и перепробовать все существующие книги.
  • Нет возможности уничтожить использованную страницу. Если книга попадёт в руки противнику, то уже неважно, вырвана там страница или нет — всегда можно найти ещё одну точно такую же книгу и прочитать с её помощью старые сообщения.
  • Гамма не совсем случайна. Третья буква распределена ровнее и корреляция между буквами в соседних строчках невелика, но это всё равно не настоящий одноразовый блокнот. С другой стороны зашифровать вручную много сообщений всё равно не получится, так что статистики для частотного анализа будет мало.
  • Нет контроля целостности сообщений. Я пытался придумать простой способ его добавить, но пока ничего толкового не нашёл.

Profile

dimview: (Default)
dimview

July 2017

S M T W T F S
      1
23 4567 8
9101112131415
16171819202122
23242526272829
3031     

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 28th, 2017 06:44 am
Powered by Dreamwidth Studios