@node Solitaire @unnumbered Пасьянс (шифр Solitaire) @url{https://www.schneier.com/solitaire.html, Алгоритм Solitaire} (пасьянс) изобретён @url{https://www.schneier.com/, Брюсом Шнайером} специально по запросу Нила Стивенсона для его книги "Криптономикон". Его вопросом было изобретение возможности обмена зашифрованными сообщениями в тяжелейших условиях, когда невозможно пользоваться какими-либо подручными средствами в виде электроники или других компрометирующих устройств, не вызывая подозрений. Шнайер придумал как для этого можно использовать обычную игральную колоду карт. Очень доступная и дешёвая вещь, которая не привлечёт особого внимания полицию. Сама по себе колода используется как генератор псевдослучайных чисел, вывод которого необходимо сложить по модулю 26 с цифровыми значениями букв алфавита. Алгоритм очень легко запоминается, прост, криптографически достаточно стоек, можно без проблем выполнить и на компьютере. Использоваться должна полная колода карт: 4 масти по 13 карт каждой и два различимых джокера. Интересный и очень полезный факт @verb{|2 * 13 = 26|}: столько же, сколько и букв в латинском алфавите. Всего колода (ключ) может иметь @verb{|((4 * 13) + 2)! = 54! ~ 2.31 * 10^71|} значений. @strong{Шифрование/дешифрование} @enumerate @item Уберите @strong{все} знаки пунктуации. Их можно заменить буквенными эквивалентами. Все буквы переведите в один регистр. @item Переведите буквы в их численное представление: @verb{|A=1, B=2, ..., Z=26|} @item Сгенерируйте последовательность псевдослучайных чисел по алгоритму Solitaire. Длина должна быть равна длине открытого текста. @item Поочерёдно сложите каждое числовое представление буквы открытого текста с этой случайной последовательностью по модулю 26. @item Преобразуйте получившиеся числа в буквенное представление: получите шифротекст. @item Для дешифрования необходимо проделать всё то же самое, только вместо сложения, использовать вычитание случайной последовательности из шифротекста. @end enumerate @strong{Пример} Мы хотим зашифровать сообщение @verb{|DO NOT USE PC|}. В криптографии любят разбивать сообщения на группы по пять символов: @verbatim DONOT USEPC @end verbatim Преобразуем в численный вид: @verbatim 4 15 14 15 20 21 19 5 16 3 @end verbatim Используйте Solitaire для генерирования ключевой последовательности (случайной последовательности, зависящей от ключа). Предположим что мы получили: @verbatim KDWUP ONOWT @end verbatim Преобразуем в численный вид: @verbatim 11 4 23 21 16 15 14 15 23 20 @end verbatim Сложим их по модулю 26 (если сумма больше 26, то тогда необходимо вычесть 26 из результата (1 + 1 = 2, 26 + 1= 27 - 26 = 1): @verbatim 15 19 11 10 10 10 7 20 13 23 @end verbatim Преобразуем этот шифротекст в буквенное представление: @verbatim OSKJJ JGTM @end verbatim Это сообщение можно передать собеседнику. Собеседник использует Solitaire для получения ключевой последовательности. Если все правила её генерирования совпадают, то его последовательность тоже получится @verb{|KDWUP ONOWT|}. Ему необходимо преобразовать шифротекст в численное представление и вычесть из него числа ключевой последовательности по модулю 26 (то есть, если первое число больше или равно второму, то добавьте к первому 26 (22 - 21=21, 1 - 22=5)): @verbatim 4 15 14 15 20 21 19 5 16 @end verbatim Преобразуйте получившуюся последовательность в буквенное представление: @verbatim DONOT USEPC @end verbatim @strong{Генерирование случайных чисел} Каждая карта имеет своё собственно число. От 1 (туз) до 13 (король), от 14 до 26, итд. Сначала одна масть, затем другая, итд. Необходимо условиться какой порядок мастей будет идти. Разницы никакой -- главное чтобы обе стороны договорились об этом. Шнайер предлагает правила бриджа: трефы (♣), бубны (♦), черви (♥), пики (♠). Также джокеры необходимо отличать друг от друга. Условимся и назовём одного джокера как A, а другого как B. Для удобства колоду лучше иметь не перемешанную. Сначала туз треф, потом двойка треф,..., король треф, туз бубен,..., король пик, джокер A, джокер B. Чтобы получить одну букву "вывода" из Solitaire проделайте следующее: @enumerate @item Найдите джокера A. Переместите на одну карту вниз. То есть, поменяйте местами с картой под ним. Если он внизу колоды, то поместите его наверх. @item Найдите джокера B. Переместите на две карты вниз. Если он внизу колоды, то значит его необходимо поместить под первую карту сверху. Колода это зацикленная структура. Если колода до первого пункта была такой: @verbatim A 7 2 B 9 4 1 @end verbatim то, после второго пункта она должна быть такой: @verbatim 7 A 2 9 4 B 1 @end verbatim А если была такой: @verbatim 3 A B 8 9 6 @end verbatim то станет: @verbatim 3 A 8 B 9 6 @end verbatim @item Сделайте тройной отрез (triple cut). То есть, обменяйте карты над верхним джокером и под нижним. Если колода была такая: @verbatim 2 4 6 B 5 8 7 1 A 3 9 @end verbatim то станет: @verbatim 3 9 B 5 8 7 1 A 2 4 6 @end verbatim Помните, что джокеры и карты между ними места не меняют. Если колода была такой: @verbatim B 5 8 7 1 A 3 9 @end verbatim то станет: @verbatim 3 9 B 5 8 7 1 A @end verbatim Если была такой: @verbatim B 5 8 7 1 A @end verbatim то на этом шаге не изменится. @item Сделайте отрез с отсчётом (count cut). Посмотрите на нижнюю карту. Преобразуйте в число от 1 до 53. (если ♣, то число показано на карте; если ♦, то значение @verb{|+13|}; если джокер, то значение @verb{|= 53|}). Отсчитайте от верхней карты такое количество карт и поместите их над последней картой. Если колода была такая: @verbatim 7...cards...4 5...cards...8 9 @end verbatim а @verb{|4|} является девятой картой, то колода станет такой: @verbatim 5...cards...8 7...cards...4 9 @end verbatim Если нижней картой является джокер, то колода останется неизменной. @item Найдите выходную карту (output card). Посмотрите на верхнюю карту. Преобразуйте в число то 1 до 53. Отсчитайте столько же карт (верхняя карта является первой). Запишите/запомните карту до которой дошёл счёт. @item Преобразуйте карту (числовое значение) в буквенное представление. Так как в алфавите 26 букв, то трефы (♣) от 1-13, бубны (♦) от 14-26, черви (♥) от 1-13, пики (♠) от 14-26. @end enumerate Для получение следующего символа ключевой последовательности просто повторите все шаги. @strong{Начальное состояние колоды} Начальное состояние колоды перед генерирование ключевой последовательности является, по сути, ключом шифрования. Стойкость алгоритма основана полностью на стойкости (качестве) ключа. Алгоритм может быть известен любой полиции, но вся сила заключена в ключе. Как это применимо и к любому другому серьёзному "боевому" алгоритму. @strong{Ключевание} колоды -- самая ответственная часть. @itemize @item В идеале лучше иметь две идентичные как можно более случайно перемешанные колоды. Одна идёт отправителю, а другая получателю сообщений. Но полиция может найти колоды -- это опасно. @item Использовать сторонний независимый источник и правила перемешивания колоды относительно его. Например газеты или журналы. @item Использовать парольную фразу для ключевания колоды. Просто используйте алгоритм Solitaire, только вместо пятого шага (output card) произведите ещё один отрез с отсчётом (count cut) -- то есть ещё один четвёртый шаг повторно, только в качестве числа отсчёта используйте символ из парольной фразы. И так повторяйте для каждого символа парольной фразы. @end itemize @strong{Пример использования} Первый выходной символ: @itemize @item @verbatim 1 2 3 4 ... 52 A B @end verbatim @item @verbatim 1 2 3 4 ... 52 B A @end verbatim @item @verbatim 1 B 2 3 4 ... 52 A @end verbatim @item @verbatim B 2 3 4 ... 52 A 1 @end verbatim @item @verbatim 2 3 4 ... 52 A B 1 @end verbatim @item пятый шаг производит выходной символ, так как наверху 2, то отсчитайте до 4 -- это и есть выход. @end itemize Второй выходной символ: @itemize @item @verbatim 2 3 4 ... 49 50 51 52 B A 1 @end verbatim @item @verbatim 2 3 4 ... 49 50 51 52 A 1 B @end verbatim @item @verbatim A 1 B 2 3 4 ... 49 50 51 52 @end verbatim @item @verbatim 51 A 1 B 2 3 4 ... 49 50 52 @end verbatim @item Пятый шаг производит выход. Наверху карта 51, отсчёт 51-ой карты даёт карту 49. @end itemize @strong{Заметки по применению} @itemize @item @strong{Никогда} не используйте один и тот же ключ для шифрования двух различных сообщений. @item Шифруйте достаточно короткие сообщения, не более нескольких тысяч символов. @item Как и все потоковые шифры, одна ошибка приводит к сбою всего алгоритма и дешифровать сообщение уже не получится. Желательно всегда дважды зашифровать сообщение, чтобы убедиться в отсутствии ошибок. @item Весь процесс Solitaire может быть обращён. Если вы оставите хотя бы что-то (записи, какую-то часть колоды), то полиция может обратить весь процесс шифрования. @item Пытайтесь всё делать в своей голове, иметь как можно меньше записей. Если полиция врывается, то перемешайте колоду. Если на бумаге вы имеет записи, то лучше всего сжечь их. Папиросная бумага может быть сожжена без пепла. @end itemize