Бросание монеты
Бросание монеты с помощью криптосистемы с открытым ключом
В этом случае от алгоритмов шифрования (Е) и расшифрования (D) требуется, чтобы они были коммутативны, т. е.:
D(E(E(M))) = E(M)
…где К1 и К2 – криптографические ключи, Р – открытый текст сообщения. Для симметричных криптоалгоритмов в общем случае это условие не выполняется, однако существуют алгоритмы шифрования с открытым ключом, для которых оно верно. Последние могут быть использованы в протоколе бросания монеты:
- Антон и Борис генерируют каждый для себя по паре ключей, состоящей из открытого и тайного ключа.
- Антон генерирует две случайные битовые строки P1 и Р2, одна из которых означает, что при бросании монеты выпал "орел", а другая – что получилась "решка".
- При помощи своего открытого ключа Антон шифрует сначала Р1 а потом Р2, и отсылает оба полученных в результате шифрсообщения (ЕА(Р1) и ЕА(Р2)) Борису.
- Борис выбирает одно из присланных ему Антоном шифрсообщений (для этой цели Борис может воспользоваться, например, известной считалкой "Эне, бене, раба, квинтер, минтер, жаба" или сходить за советом к астрологу). Борис шифрует выбранное шифрсообщение с помощью своего открытого ключа и отсылает результат (EБ(EA(P)), где Р – это либо Р1 либо Р2) Антону.
- Антон расшифровывает пришедшее от Бориса сообщение на своем тайном ключе и посылает то, что у него получилось (Da(EБ(Ea(P)))=EБ(P)) обратно Борису.
- Борис расшифровывает это сообщение Антона (DБ(EБ(P))=P) и узнает, какой стороной упала монета. Затем Борис шлет Р Антону.
- Антон проверяет, действительно ли Р – это одна из тех двух случайных битовых строк, которые он сгенерировал на шаге 2.
- Чтобы окончательно убедиться в честности друг друга, Антон и Борис обмениваются парами ключей, которые они сгенерировали на шаге 1.
Читателю предоставляется возможность самому доказать, что каждый из участников этого протокола немедленно обнаружит, если другой участник попытается смошенничать.
Интересно отметить, что участники протокола узнают результат подбрасывания монеты не одновременно, а по очереди. Поэтому в некоторый момент времени один из участников знает, как "легла" подброшенная монета, а другой – еще нет. А следовательно, в случае неблагоприятного исхода, тот, кто уже знает результат, может повести себя неспортивно, отказавшись от дальнейшего выполнения шагов протокола.
На практике протоколы бросания монеты часто используются для генерации сеансовых ключей. В этом случае Антон и Борис могут сгенерировать случайную битовую последовательность таким образом, что посторонние окажутся не в состоянии повлиять на ее выбор. Тем не менее при генерации сеансовых ключей с помощью протокола бросания монеты Антону и Борису все равно придется шифровать все свои сообщения, чтобы защититься от возможного подслушивания.
Игра в покер
Подобно тому, как Антон и Борис бросали монету, не имея при себе самой монеты, они могут сыграть в покер без колоды карт. Соответствующий криптографический протокол аналогичен протоколу, который помог Антону и Борису организовать бросание монеты – в обоих необходимо обеспечить, чтобы используемые алгоритмы шифрования и расшифрования были коммутативны.
Отличие между этими протоколами состоит в том, что теперь Антону требуется сгенерировать, зашифровать и отослать Борису не 2 битовых последовательности, а 52 – по числу карт в воображаемой колоде. Среди них Борис случайным образом выбирает 5 битовых последовательностей, шифрует их при помощи своего открытого ключа и посылает Антону. Антон расшифровывает полученные последовательности и шлет обратно Борису, который тоже расшифровывает их. Затем Борис выбирает еще 5 битовых последовательностей и посылает Антону, который опять их расшифровывает. В результате и у Антона, и у Бориса на руках окажется по 5 карт, которыми они и будут играть друг против друга. Если потребуется, дополнительные карты могут быть розданы обоим игрокам по той же схеме.
По окончании игры Антон и Борис открывают свои карты и обмениваются ключами, чтобы иметь возможность проверить, насколько честно они следовали правилам карточной игры. К сожалению, криптографические протоколы, предназначенные для игры в покер, устроены таким образом, что в ходе нее игроки могут слегка мошенничать. Характер этого мошенничества зависит от используемого криптоалгоритма. Например, при шифровании при помощи квадратичных вычетов играющие имеют возможность пометить несколько карт. Не бог весть что, но ведь покер – это такая игра, в которой даже небольшая порция дополнительной информации о сопернике может в конечном счете решить исход игры.