P2P red ocultando posiciones?

13

He estado trabajando en una arquitectura P2P para juegos seguros y he dividido el problema en cinco subproblemas:

  • Modificación ilegal del estado del juego enviado.
  • Deja caer tramposos con precisión
  • Acordar un estado de juego
  • Evitar trampas "mirar hacia adelante"
  • Ocultar información confidencial de los oponentes

Los primeros cuatro los tengo casi todos resueltos, pero es el último con el que tengo problemas.

Antes de entrar en detalles, solo quiero preguntar si hay algo que me haya perdido en mi lista de hacer una red p2p "a prueba de trampas". No estoy interesado en trucos como el uso de aimbots, solo estoy interesado en hacer que la red p2p sea tan segura como un servidor centralizado.

Entonces, en mi esfuerzo hasta ahora por ocultar información sensible, me he centrado en la posición de los jugadores en un juego donde la posición de tu oponente no siempre debe ser conocida. El problema se convierte en cómo determinar si debe enviar su posición a su oponente sin conocer la posición de su oponente.

He descartado métodos como que el oponente envíe múltiples posiciones falsas para que pueda comparar las suyas también, ya que su oponente puede abusar fácilmente de dicho sistema, ya que obtendrá su posición si una de las posiciones falsas resulta "visible" desde su posición.

El método en el que me he centrado es uno en el que recibe un "campo visual" de su oponente y puede determinar si debe enviar su posición o no. Sin embargo, este es un problema en juegos como League of Legends, donde el campo visual de tu oponente también es información altamente sensible. He intentado resolver esto transformando el campo visual usando una matriz singular, lo que significa que no puede pasar de la versión transformada del campo visual a la versión original, pero como es una transformación lineal, aún puede determinar si su posición está dentro El campo visual o no.

Sin embargo, esto no funciona perfectamente, el campo visual exacto no se puede restaurar después de la transformación, pero se puede determinar la información sobre las "pendientes" en el campo visual (el campo visual está construido por varias líneas y se puede determinar la pendiente de cada línea) restaurado y esto se puede utilizar para reconstruir relativamente barato el campo visual original.

En esencia, lo que necesito es una función que pueda determinar si una posición es "visible" o no, y la reconstrucción de esta función / campo visual debe ser tan exigente desde el punto de vista computacional que una vez que haya terminado de reconstruir el campo visual, ya no es relevante para El juego en acción. ¿Hay alguna persona súper inteligente que conozca ese método?

Editar gente parece un poco confundida acerca de todo el "campo de visión", así que pretendo dar una explicación más detallada aquí. El campo de visión consiste en grupos de un conjunto de líneas, puede verificar fácilmente si una posición está dentro de uno de estos grupos simplemente verificando de qué lado de la línea está su posición, si está en el mismo lado para todas las líneas de ese grupo que conoce está dentro de ese grupo y, por lo tanto, dentro del campo de visión.

Sin embargo, la información que se envía no es esta línea, sino una transformación de la línea y la transformación (2 por 2 en singular una matriz), aún puede verificar en qué lado de la línea se encuentra su posición al transformarla primero usando la transformación que recibió y comparar ese valor con la línea transformada. La clave aquí es que la transformación es singular, lo que significa que es imposible encontrar un inverso para volver a la línea original. Sin embargo, es posible determinar la pendiente de la línea que hace que la reconstrucción de la línea simplemente verifique en qué lado de la línea transformada se encuentran muchos puntos hasta que haya identificado el origen de la línea mucho más barato computacionalmente que si no lo supiera La pendiente de la línea.

Lo que estoy buscando es un método para determinar si un punto está dentro de un área, donde reconstruir el área a partir del método es imposible (lo cual dudo que exista ya que siempre se puede forzarlo por fuerza bruta) o muy computacionalmente pesado.

Elon
fuente
1
He pasado unos 11 años enfocado en este problema exacto, y las primeras 4 cosas que enumeró son triviales, pero la que ha preguntado no encajaría en una respuesta SE. Eventualmente sacaré un documento técnico sobre él.
MickLH
Creo que esto dependería mucho de sus enfoques sobre los otros problemas
Phoenix,
@MickLH ¿Cuál es el mejor método que se te ocurrió para resolver este problema? :) ¿Y qué piensas sobre el uso de campos visuales / de interacción transformados? ¿Es esto algo que has investigado?
Elon
Investigué los campos transformados y demostré que es completamente inseguro. Un jugador siempre podrá inferir la posición del otro jugador, sin importar cómo oculte la transformación, ya que ninguno de los jugadores puede aprender nada hasta que uno de ellos tenga toda la información requerida, momento en el que aprende la posición del otro jugador y puede terminar el protocolo sin decirle al otro jugador.
MickLH
En cuanto al "mejor" método ... Lo dije en serio, incluso el método más simple es un tema complejo que realmente necesita un documento técnico completo para explicarlo.
MickLH

Respuestas:

1

Creo que incluso si tuvieras un algoritmo irreversible para un campo de visión, las personas aún podrían obtener ventajas al calcular si los puntos cercanos a ellos darían como resultado una intersección de esa ubicación y un campo visual de los oponentes se cruzaría. En un mal caso (de un campo de visión lo suficientemente grande como para mapear la relación), podría calcular por proceso de eliminación el punto exacto de su enemigo.

Creo que, en cambio, tal vez todos los pares conectados deberían anunciar en qué parte del mapa se encuentran, para determinar si es posible si pueden verse o no. Primero divide el mapa en 2x2 o 2x2x2 si la tercera dimensión es importante. Luego, todos se dicen si están en 1,0 1,1 0,1 o 0,0. Si no están en el mismo cuadrante, su conversación terminará hasta la próxima verificación. Esto protege su ubicación exacta. Si existen en el mismo cuadrante, dividirán este espacio en 4 quads nuevos y continuarán hasta que determinen que están lo suficientemente cerca como para ser vistos entre sí.

Por supuesto, hay problemas con los bordes de los cuadrantes, pero debe resolverse mediante consultas adicionales a los cuadrantes vecinos.

usuario115137
fuente
-1

No tome esto como una respuesta definitiva, el tema es muy amplio (no me sorprendería si alguien marcara su pregunta de hecho).

Puede resolverlo usando algunos jugadores como servidor, y cuando un jugador se usa como servidor, no puede participar en el juego de jugadores que realmente están jugando ese servidor .

Si su juego no es demasiado exigente, también podría ejecutar varios servidores desde la misma máquina de jugador (por supuesto, eso sería útil, ya que no todos los jugadores pueden ejecutarse como servidor debido a problemas de NAT, ¡gracias IPv6!).

El principal problema aquí es que, dado que un jugador aleatorio se usará como servidor, existe una pequeña posibilidad de que sea un jugador "comprometido" o de que pase la simulación a un jugador "comprometido", lo que permite que se transmita información confidencial ( bueno, en realidad en ese punto el servidor podría enviar datos arbitrarios y forzar la victoria de todos modos).

Si usa un servidor central para verificar autorizaciones e inicios de sesión, entonces podría permitir organizar mejor los juegos y prohibir fácilmente a los jugadores (sin embargo, eso ya no sería una red P2P pura).

También podría dividir el mundo en rebanadas y calcular un hash de las rebanadas visibles, pero esto podría ser fácilmente engañado, las rebanadas visibles más comunes permitirán construir una tabla de hash con bastante rapidez.

Para mí, su pregunta es como tratar de buscar una función criptográfica. La prueba debe ser rápida, pero la fuerza bruta debe ser lenta.

Lo más simple que me viene a la mente (también relacionado con mi trabajo) es usar un algoritmo de reconocimiento de visión rápido (similar a la realidad aumentada).

Si logra hacer una "instantánea" rápida de su ubicación (similar a las rebanadas), solo puede reconocerse cuando se coloca alrededor de algo visible, entonces la tendrá. Especialmente si hay elementos cronometrados en el mapa que permiten generar patrones de reconocimiento de descarte rápido.

Sin embargo, incluso si tales algoritmos se vuelven bastante rápidos incluso en dispositivos móviles, no creo que sean lo suficientemente rápidos para un tirador en primera persona.

Además, si los haces demasiado rápido, ¡tendrás falsos positivos! Y de todos modos, un jugador puede crear un juego que pruebe algunas "Imágenes comunes" para que una de las imágenes coincida con el algoritmo de detección de características.

No me sorprenderá que la única solución posible a su problema sería posible en Quantum Computing, y en unos años alguien publicará un documento que pruebe ese límite intrínseco en las redes P2P.

Desarrollador de juegos
fuente
Sí, supuse eso. Incluso con 4 GB de datos, puede almacenar suficientes hashes para hacer trampa fácilmente. Leí acerca de un campo matemático que trataba sobre transformaciones en datos cifrados (como sumar un valor a un valor cifrado para que se incremente sin revelar el valor real), tal vez pueda encontrar algo en ese campo, pero sinceramente no entiendo ese campo ^^
GameDeveloper
Tal vez debería haber sido más claro en el "campo de visión", que consiste en un montón de líneas para que pueda calcular de qué lado de esta línea está un punto, grupos de tales líneas forman áreas convexas y grupos de tales áreas forman el todo "campo de visión". La transformación transforma cada línea en un punto y luego todos los puntos que estaban en un lado de esa línea se transforman en un lado de este punto para que pueda calcular de qué lado de la línea era originalmente, aunque no pueda calcular el linea original.
Elon
"y cuando un jugador se usa como servidor, no puede participar en el juego de jugadores que realmente están jugando ese servidor" ¿Entonces quieres decir como dejar caer P2P?
Hobbamok
-3

Cuando dices "Ocultar información confidencial de los oponentes", ¿quieres decir que quieres evitar que las personas con rastreadores de paquetes escuchen tu tráfico y obtengan información sobre tu juego?

Si es así, hay una respuesta fácil para esto; La mayoría de los juegos AAA (y ciertamente los juegos de consola) usan encriptación. De hecho, es tan común que muchos de los middlewares de redes utilizados en los juegos ya tienen incorporado el cifrado de paquetes.

Por lo general, funciona así: cuando abre una conexión a otra máquina, antes de que el socket se active, se produce un intercambio de claves. Sé que en XBox solía ser el intercambio de claves Diffie-Hellman; No tengo idea si todavía lo usan ahora. Luego, una vez que tenga sus claves, todos los datos enviados se cifran con las claves y no se cifran en el recibo. Si alguien usa un sniffer para leer sus paquetes, se verá como un galimatías y es poco probable que pueda descifrarlos ya que no tienen las claves. (Los piratas informáticos avanzados pueden obtenerlos accediendo a la memoria de proceso del juego en ejecución, pero eso es raro y poco probable).

La única excepción a la regla de cifrado son los datos de VoiceChat; por ley en los EE. UU., el chat de voz debe enviarse de manera clara para que la CIA pueda escucharlo si lo desea. Las consolas generalmente proporcionan una forma de etiquetar los datos de voz para que no se cifren.

JanSolo
fuente