Dibujo "seguro" de lotes [cerrado]

1

Quiero elegir un juego al azar en los 50 juegos que tengo para jugar con uno de mis amigos. Pero este amigo no confía en mí, y yo tampoco: cada vez que uno de nosotros elige un juego, el otro se queja de que la elección no fue realmente aleatoria.

Una primera solución podría ser poner todos los nombres en un sombrero y después de elegir un nombre; pero ambos somos paranoicos: el sombrero podría contener solo un nombre repetido 50 veces, así que tenemos que verificar que todos los nombres estén presentes solo una vez para asegurar una elección aleatoria. Esto es demasiado largo.

Segunda solución: ambos elegimos al azar un número entero en [1,50], lo escribimos en un papel y luego sumamos el módulo de resultado 50. Esta es una buena solución cuando nos enfrentamos.

¿Pero qué pasa si queremos elegir un juego en línea, yo jugando en París y mi amigo jugando en Nueva York? He intentado emular el protocolo anterior: cada jugador elige aleatoriamente un número en un gran intervalo como [1,1e30] y, por primera vez, envía un hash de su número (simulando el hecho de ocultar el número en un papel) . Cuando cada jugador ha recibido el hash del otro, los dos jugadores publican sus números y los agregan en módulo 50.

¿Este protocolo es correcto? ¿Hay un protocolo mejor (quizás más rápido) para este propósito?

    
pregunta Sebastien 05.01.2015 - 22:13
fuente

2 respuestas

1

Lo que quieres es una variante de un esquema de cambio de moneda. La forma estándar de hacer esto es, como lo ha identificado, hacer que ambas personas obtengan un valor y luego combinen esos valores de modo que ninguna de las partes tenga control sobre el resultado por sí misma. Has decidido utilizar la adición modular; Esta es de hecho una forma estándar. También identificó el problema con eso, y es que quienquiera que decidiera en segundo lugar podría controlar el resultado (ya que saben lo que eligió la primera persona), por lo que necesita que las personas se comprometan con sus valores antes de que sepan el valor de la otra persona.

Este tipo de cosas se denomina esquema de compromiso . En estos sistemas, Alice tiene algún valor al que quiere comprometerse. Específicamente, debería enviar algo a Bob que codifique su valor, pero Bob no puede recuperar el valor. Alice puede enviar a Bob una información cuando sea el momento de revelar su secreto; la idea es que solo puede revelar el valor con el que se comprometió originalmente.

Para concretar más, asumamos que Alice quiere comprometerse un poco. Ella quiere producir un "blob" para enviar a Bob; este blob codifica 1 o 0. Luego, cuando es el momento de revelar el bit, Alice y Bob pueden abrir este blob, usando alguna información adicional que Alice proporciona. Las dos propiedades clave del blob son que Bob no puede descubrir qué bit codifica, y solo pueden abrir el blob a uno de los dos bits (Alice no puede producir un blob que codifique 1 y luego hacer trampa abriéndolo a 0). ).

Con el compromiso de bits, puedes usar un hash resistente a la colisión, calcular el blob como H(s||b) con s aleatorio largo (hash s concatenado con b ) y revelar s para abrirlo (bueno, s y b , pero revelar s hace que sea fácil obtener b ). Esto es equivalente a tener un número largo y tomar el módulo 2 para obtener el bit confirmado. Su esquema tiene un efecto similar, y debería funcionar siempre no puede encontrar colisiones.

Desafortunadamente, solo haciendo eso significa que alguien que encuentre una colisión puede usarlo repetidamente. Es mejor que Bob proporcione una cadena de bits aleatoria b a Alice, y que Alice calcule una segunda cadena de bits aleatoria (secreta) a , que Alice codifique un número de 0 a 50 como 6 bits n (longitud fija, por lo que no puede reclamar que la línea divisoria es diferente de lo que realmente es), y calcular el blob como H(b||a||n) . Esto significa que incluso si Alice encuentra una colisión en H , no ayuda; ella necesita un par en colisión que comience con b .

    
respondido por el cpast 05.01.2015 - 22:53
fuente
0
  

¿Hay un protocolo mejor (quizás más rápido) para este propósito?

Echa un vistazo a "Esquemas de compromiso" .

Aquí hay uno simple: piense en un secreto aleatorio y en su compromiso. Ejecute ambos a través de HMAC-SHA256. Usando la parte aleatoria como la clave (o sal si lo desea)

Publicar el resultado. Cuando ambos socios hayan recibido el hash, publique las claves / salt. Ahora cada socio puede calcular el hash por sí mismo y verificar que funcione correctamente.

Ahora no puede haber regateo después del hecho.

    
respondido por el StackzOfZtuff 05.01.2015 - 22:56
fuente

Lea otras preguntas en las etiquetas