]> Cypherpunks.ru repositories - cypherpunks-www.git/commitdiff
Шифр Пасьянс
authorSergey Matveev <stargrave@stargrave.org>
Tue, 14 Feb 2017 20:52:13 +0000 (23:52 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Tue, 14 Feb 2017 20:52:13 +0000 (23:52 +0300)
index.texi
solitaire.texi [new file with mode: 0644]

index cef4942342ece9adbba1098c1796c399f7fadba1..c037eacfed9c6955e36c078d47afea06afdcd1d4 100644 (file)
@@ -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 (file)
index 0000000..b61f5ae
--- /dev/null
@@ -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