2011-02-02 5 views
7

Мне задали этот вопрос, но не удалось найти статью, в которой описывается хороший метод. Вместо этого я вышел своим методом (см. Мой ответ ниже). Однако также возможно, что я просто придумал метод, который я недостаточно умен, чтобы сломать. Поэтому я передаю этот вопрос вам:Бросьте кубик по электронной почте

Алиса и Боб хотят играть в настольную игру по электронной почте. Им нужно найти способ бросить кости так, чтобы они не обманывали.

Что является хорошим алгоритмом для этого.

+3

Какой у вас был? –

+1

@ Justin Morgan: Он просто задал вопрос 2 минуты назад, дайте ему мгновение ... –

+0

Просто похоже, что он забыл вставить его, вот и все :) –

ответ

4

Алиса и Боб должны быть в состоянии отправить друг другу доказательство того, что они выбрали номер, прежде чем они покажут, какой номер они выбрали. Затем число, которое они выбрали, должно быть проверено против доказательства. Наконец, оба числа должны быть объединены каким-то образом, что не даст каждому из них полный контроль над результатом.

В следующем crypto_function может быть что-то вроде sha1sum или md5sum:

Шаг 1:

необходимо, чтобы сделать диапазон возможных значений для crypto_function ниже достаточно больших

  • Алиса выбирает случайные числа Ra1 и Ra2 и отправьте Ra1 Bob.
  • Боб выбирает случайные числа Rb1 и Rb2 и отправляет Rb1 Алисе.

Шаг 2:

создает доказательство Hx, что значение Vx теперь фиксированной, но предотвратить выводя это значение из этого доказательства

  • Алиса выбирает значение Va (0 < = Va < = 5), составить строку Sa="Va Ra2 Rb1" и отправить Ha=crypto_hash(Sa) Бобу.
  • Боб выбирает значение Vb (0 = < < Vb = 5), составляют строку Sb="Vb Rb2 Ra1", и отправить Hb=crypto_hash(Sb) Алисе.

Шаг 3:

создает желаемый результат V

  • Алиса посылает Бобу Sa. Bob Calculate Ha из Sa и сравните его с Ha с шага 2. Затем принимает Va из Sa и рассчитать значение V=(Va+Vb)%6+1.
  • Боб посылает Sb Алисе. Алиса рассчитать Hb из Sb и сравнить его с Hb с шага 2. Затем берет Vb из Sb и рассчитать значение V=(Vb+Va)%6+1.

Update:

на основе Coin Flipping by Telephone предложенной @Moron алгоритма может стать:

  1. Боб выбирает случайное число R и значение 0 <= Vb <= 5, вычисляет хэш H=crypto_hash("Vb R"), и отправляет его Алисе.

  2. Алиса выбирает значение 0 <= Va <= 5 и отправляет его Бобу.

  3. Боб посылает Vb и R Алисе; Bob вычисляет V=(Va+Vb)%6+1

  4. Alice проверяет H=crypto_hash("Vb R"); Алиса вычисляет V=(Va+Vb)%6+1

... Хотя я чувствовал бы себя лучше, если об этом:

0. Алиса выбирает случайное число Q и посылает его Бобу.

И строка, которая будет хеширована, становится тогда "Vb Q R".

+0

Похоже на то, что я сделал бы. хотя я не думаю, что вам понадобится -2 в окончательном расчете. Операция модуля снимает это. Я предполагаю, что ваши случайные числа не должны быть похожи на кубики, но это то, что я думал в первом чтении, чтобы вы могли прояснить это. – Chris

+1

При вычислении 'V', похоже, вы используете предположения о диапазонах' Va' и 'Vb'. Можете ли вы сделать это явным? –

+0

@Chriss, @jieedev, Спасибо. Я включил ваши комментарии. –

4

Игры, которые играют по почте - будь то электронная почта или нет - используются для использования общедоступного (псевдо) случайного числа - обычно наименее значащая цифра в листе цен на акции в определенной позиции по листингу акций (а не конкретному фонду) , Это невозможно предсказать и подлежит проверке после события. Игроки будут обмениваться информацией - перед броском кубиков - какую позицию в списке акций (как правило, при закрытии бизнеса) следует использовать для следующего броска (-ов).

+2

Современная версия - это что-то вроде http://www.rpglibrary.org/software/securedice/, которая может отправлять кубики по номерам с серийными номерами и хешем, который можно проверить в Интернете. –

+1

@justin Опубликовать это как ответ! - Серийные номера являются ключевой проблемой здесь –

+0

Вам также нужно решить проблему, когда игрок, выбрав *, когда * бросает кости, может выбрать свое значение. –

0

Настройка автоматического сервера сторонних производителей, где каждый отправляет туда электронные письма для качки и пересылки кубиков другому игроку?

В противном случае это просто просто чертовски много работы, чтобы играть в эту игру, и я ушел!

2

Алиса и Боб соглашаются на двух сеансовых клавишах, используя что-то вроде Diffie-Hellman, Sa и Sb. Каждый ключ сеанса - это семя генератора случайных чисел, Ra и Rb.

RNG используются в качестве одноразовых прокладок для каждого рулона. Если Алиса хочет катиться, берет Ra[i], где i - это i-е случайное число в последовательности. Алиса отправляет Бобу i и Ra[i]. Боб может подтвердить i, используя собственную копию Ra.

Это держит Алису честной, требуя от нее использовать последовательные значения i, которые поддаются проверке Боба.

+0

Если Боб также имеет Ра и знает, что я следующий, то разве он не может предсказать бросок кости до того, как Алиса отправит его? Делает игру «кто катит шесть первых» немного тусклый ... – Spacedman

+0

Разве не эта игра уже скучна? ;) Да, если важна неопределенность в отношении следующего броска, то это неправильное решение. Но это, вероятно, самое простое решение в тех случаях, когда это не имеет значения. –

4

Использовать доверенную третью сторону, такую ​​как http://rpglibrary.org/software/securedice, которая может отправлять кубики по номерам с серийными номерами и хешем, который можно проверить в Интернете.

1

Я получил ответ на аналогичный вопрос, который я спросил, кто такой Как я могу сделать кости для R? Ответ был программой для R в дополнение к программе для «интимных костей». Я не уверен, кого интересуют Алиса и Боб, но я предлагаю использовать R в дополнение к удаленному рабочему столу, чтобы каждый игрок мог видеть, что другой не обманывает.

Я не знаю, как писать коды, поэтому я копировать/вставить в ответ я получил:

Если вы хотите, чтобы кости в статистической программе R. Start, загрузив его здесь: http://cran.r-project.org/.

сделать нормальные кости использовать следующий сценарий: #Dice функции крена RollDie = функция (п) Образец (1: 6, п, заменить = Т) #use Die RollDie (п)

#If you'd like to spice things up a bit and make a dice for safe and consensual adult 
#activities then use the following series of scripts: 

#Creating the function, use this script: 
#Intimate dice function 

Actions= c("kiss","lick","suck","bite", 
"spank","blow", "stroke", 
"tickle","pinch", 
"torment") 

Body= c("lips","arms","chest","thighs", 
"neck","ear", "wrist", 
"navel","nipples", 
"the good stuff") 

Action= function(n) sample(Actions[1:10],n,replace=T) 

Area= function(n) sample(Body[1:10],n,replace=T) 

Action(1) 

Area(1) 

#If you'd like the dice saved to the R global environment so you can be ready for when 
the mood is right use the following script: 

#Save the following script as yourfile.R in something like this location "C:\\Documents   
and Settings\\yourfile.R" 

#Intimate dice 
Action(1) 
Area(1) 
#yes 

#Now create the following function to save to R's global environment with the following:  

#Run all 
source("C:\\Documents and Settings\\yourfile.R",echo=T) 

hi<-function(){source("C:\\Documents and Settings\\yourfile.R",echo=T)} 

#ok 

#close and save your R workspace 
#upon opening run the following function: 
hi() 
#If this has been done properly then you should see something along the lines of this: 
#Intimate dice 
Action(1) 
[1] "bite" 

Area(1) 
[1] "ear" 

#yes 

#Here's to one more reason for celebrating math & science 
Смежные вопросы