From 8af458a0b970ab733feeed4b97521b98b4fb4928 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Tue, 14 Feb 2017 23:52:13 +0300 Subject: [PATCH] =?utf8?q?=D0=A8=D0=B8=D1=84=D1=80=20=D0=9F=D0=B0=D1=81?= =?utf8?q?=D1=8C=D1=8F=D0=BD=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- index.texi | 2 + solitaire.texi | 337 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 339 insertions(+) create mode 100644 solitaire.texi diff --git a/index.texi b/index.texi index cef4942..c037eac 100644 --- a/index.texi +++ b/index.texi @@ -41,6 +41,7 @@ * Встреча для подписи ключей (PGP keysigning party): KSP. * Часто задаваемые вопросы: FAQ. * Полезные ссылки: Links. +* Шифр Пасьянс: Solitaire. * BitTorrent tracker: Tracker. * IRC (чат) сервер: IRC. * DNSCrypt сервер: DNSCrypt. @@ -52,6 +53,7 @@ @include ksp/index.texi @include faq.texi @include links.texi +@include solitaire.texi @include tracker.texi @include irc.texi @include dnscrypt.texi diff --git a/solitaire.texi b/solitaire.texi new file mode 100644 index 0000000..b61f5ae --- /dev/null +++ b/solitaire.texi @@ -0,0 +1,337 @@ +@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 -- 2.44.0