Posizioni nascoste della rete P2P?


13

Ho lavorato su un'architettura P2P per giochi sicuri e ho suddiviso il problema in cinque sotto-problemi:

  • Modifica illegale dello stato del gioco inviato
  • Fai cadere con precisione gli imbroglioni
  • Accordarsi su uno stato di gioco
  • Evitare i cheat "guardare avanti"
  • Nascondere informazioni sensibili dagli avversari

I primi quattro li ho praticamente tutti risolti, ma è l'ultimo con cui ho problemi.

Prima di entrare nei dettagli, voglio solo chiedere se c'è qualcosa che mi è sfuggito nel mio elenco di creare una rete p2p "a prova di imbroglione". Non mi interessano i cheat come usare i aimbot, mi interessa solo rendere la rete p2p sicura come un server centralizzato.

Quindi, nel mio sforzo finora di nascondere informazioni sensibili, mi sono concentrato sulla posizione dei giocatori in una partita in cui la posizione del tuo avversario non dovrebbe essere sempre conosciuta. Il problema diventa quindi come determinare se è necessario inviare la posizione all'avversario senza conoscere la posizione dell'avversario.

Ho escluso metodi come l'avversario che invia più false posizioni per farti confrontare anche le tue poiché il tuo avversario può facilmente abusare di un tale sistema poiché otterrà la tua posizione se una delle false posizioni fosse "visibile" dalla tua posizione.

Il metodo su cui mi sono concentrato su quello in cui ricevi un "campo visivo" dal tuo avversario e posso quindi determinare se devi inviare la tua posizione o meno. Questo è tuttavia un problema in giochi come League of Legends in cui il campo visivo del tuo avversario è anche un'informazione altamente sensibile. Ho cercato di risolverlo trasformando il campo visivo usando una matrice singolare, il che significa che non puoi passare dalla versione trasformata del campo visivo alla versione originale, ma poiché si tratta di una trasformazione lineare puoi ancora capire se la tua posizione è all'interno il campo visivo o no.

Tuttavia, ciò non funziona perfettamente, il campo visivo esatto non può essere ripristinato dopo la trasformazione, ma le informazioni sulle "pendenze" nel campo visivo (il campo visivo è costruito da più linee e può essere determinata la pendenza di ciascuna linea) possono essere ripristinato e può essere utilizzato per ricostruire in modo relativamente economico il campo visivo originale.

In sostanza, ciò di cui ho bisogno è una funzione che può determinare se una posizione è "visibile" o meno, e la ricostruzione di questa funzione / campo visivo deve essere così impegnativa dal punto di vista computazionale che una volta terminata la ricostruzione del campo visivo non è più rilevante per il gioco in azione. C'è qualche persona super intelligente là fuori che capita di conoscere un tale metodo?

Modifica Le persone sembrano un po 'confuse sull'intero "campo visivo", quindi ho l'obiettivo di dare una spiegazione più dettagliata qui. Il campo visivo è costituito da gruppi di una serie di linee, puoi facilmente verificare se una posizione si trova all'interno di uno di questi gruppi semplicemente controllando quale lato della linea è la tua posizione, se è sullo stesso lato per tutte le linee in quel gruppo che conosci è all'interno di quel gruppo e quindi all'interno del campo visivo.

Le informazioni inviate comunque non sono questa linea, ma una trasformazione della linea e della trasformazione (2 per 2 singolarmente una matrice), puoi comunque controllare su quale lato della linea si trova la tua posizione trasformandola prima usando la trasformazione che hai ricevuto e confrontando quel valore con la linea trasformata. La chiave qui è che la trasformazione è singolare, il che significa che è impossibile trovare un inverso per tornare alla linea originale. Tuttavia è possibile determinare la pendenza della linea che rende la ricostruzione della linea semplicemente controllando su quale lato della linea trasformata si trovano molti punti finché non si è individuata l'origine della linea molto più computazionalmente meno che se non si fosse a conoscenza la pendenza della linea.

Quello che sto cercando è un metodo per determinare se un punto si trova all'interno di un'area, dove ricostruire l'area dal metodo è impossibile (che dubito esiste dal momento che si può sempre forzare la forza bruta) o molto computazionalmente pesante.


1
Ho trascorso circa 11 anni a concentrarmi su questo esatto problema e le prime 4 cose che hai elencato sono banali ma quella a cui hai chiesto non si adattava a una risposta SE. Alla fine tirerò fuori un white paper.
MickLH,

Penserei che questo dipenderebbe molto dal tuo approccio agli altri problemi
Phoenix,

@MickLH Qual è il metodo migliore che hai trovato per risolvere questo problema? :) E cosa pensi dell'utilizzo di campi visivi / di interazione trasformati? È qualcosa che hai esaminato?
Elon

Ho studiato campi trasformati e dimostrato che è assolutamente insicuro. Un giocatore sarà sempre in grado di inferire la posizione dell'altro giocatore, indipendentemente da come nascondi la trasformazione, poiché nessuno dei due giocatori può imparare nulla fino a quando uno di loro non ha tutte le informazioni richieste, a quel punto apprende la posizione dell'altro giocatore e può terminare il protocollo senza dirlo all'altro giocatore.
MickLH,

Per quanto riguarda il metodo "migliore" ... Sono stato seriamente sopra, anche il metodo più semplice è un argomento complesso che ha davvero bisogno di un intero white paper per spiegare.
MickLH,

Risposte:


1

Penso che anche se avessi un algoritmo irreversibile per un campo visivo, le persone potrebbero ancora trarre vantaggio calcolando se i punti vicini a loro porterebbero a un'intersezione di quella posizione e un campo visivo degli avversari si intersecerebbe. In un brutto caso (di un campo visivo sufficientemente ampio per il rapporto della mappa) potresti calcolare, con il processo di eliminazione, il punto esatto del tuo nemico.

Penso invece che forse tutti i peer collegati dovrebbero annunciare in quale parte della mappa si trovano, per determinare se è possibile se possono vedersi o meno. Dividi innanzitutto la mappa in 2x2 o 2x2x2 se la 3a dimensione è importante. Quindi tutti si dicono se sono in 1,0 1,1 0,1 o 0,0. Se non si trovano nello stesso quadrante, la loro conversazione termina fino al prossimo controllo. Questo protegge la loro posizione esatta. Se esistono nello stesso quadrante, divideranno questo spazio in 4 nuovi quadrupli e continueranno fino a quando non determineranno che sono abbastanza vicini da essere visti l'uno dall'altro.

Naturalmente ci sono problemi con i bordi dei quadranti, ma dovrebbe essere risolvibile con query aggiuntive ai quadranti vicini.


-1

Non prenderlo come una risposta definitiva, l'argomento è davvero ampio (non sarò sorpreso se qualcuno segnalasse la tua domanda).

Puoi risolverlo usando alcuni giocatori come server e quando un giocatore viene usato come server non può partecipare al gioco dei giocatori che stanno effettivamente giocando quel server .

Se il tuo gioco non è troppo impegnativo, puoi anche eseguire più server dalla stessa macchina del giocatore (ovviamente sarebbe utile, dal momento che non tutti i giocatori possono funzionare come server a causa di problemi NAT, grazie IPv6 !!).

Il problema principale qui è che, poiché un giocatore casuale verrà utilizzato come server, c'è una leggera possibilità che sia un giocatore "compromesso" o che passi la simulazione a un giocatore "compromesso", consentendo il trasferimento di informazioni sensibili ( beh, in realtà a quel punto il server potrebbe inviare dati arbitrari e forzare comunque la vincita).

Se si utilizza un server centrale per controllare le autorizzazioni e gli accessi, è possibile consentire di organizzare meglio i giochi e vietare facilmente i giocatori (tuttavia non sarebbe più una rete P2P pura).

Puoi anche dividere il mondo in sezioni e calcolare un hash delle sezioni visibili, ma questo potrebbe essere facilmente ingannato, le sezioni visibili più comuni permetteranno di costruire una tabella di hash abbastanza rapidamente.

Per me la tua domanda è come cercare una funzione crittografica. Il test dovrebbe essere rapido, ma la forza bruta dovrebbe essere lenta.

La cosa più semplice che mi viene in mente (anche in relazione al mio lavoro) è usare un algoritmo di riconoscimento rapido della visione (simile alla realtà aumentata).

Se riesci a fare una rapida "istantanea" della tua posizione (simile a sezioni), che può essere riconosciuta solo quando posizionata intorno a qualcosa di visibile, allora la avrai. Soprattutto se nella mappa sono presenti elementi temporizzati che consentono di generare modelli di riconoscimento a eliminazione rapida.

Tuttavia, anche se tali algoritmi diventano abbastanza veloci anche su dispositivi mobili, non penso che saranno abbastanza veloci per uno sparatutto in prima persona.

Inoltre, se li rendi troppo veloci, avrai falsi positivi! E un giocatore può comunque creare un gioco che prova alcuni "elementi visivi comuni" in modo che uno degli elementi visivi corrisponda positivamente all'algoritmo di rilevamento delle caratteristiche.

Non sarò sorpreso che l'unica soluzione possibile al tuo problema sarebbe possibile nel calcolo quantistico, e entro alcuni anni qualcuno pubblicherà un documento che proverà quel limite intrinseco nelle reti P2P.


Sì, suppongo che. Anche con 4 GB di dati puoi archiviare abbastanza hash da ingannare facilmente. Ho letto di un campo matematico che riguardava le trasformazioni su dati crittografati (come sommare un valore a un valore crittografato in modo che venga aumentato senza rivelare il valore reale), forse puoi trovare qualcosa in quel campo, ma onestamente non capisco quel campo ^^
GameDeveloper

Forse avrei dovuto essere più chiaro sul "campo visivo", è costituito da un gruppo di linee in modo da poter calcolare quale lato di questa linea è un punto, gruppi di tali linee compongono aree convesse e gruppi di tali aree compongono il tutto "campo visivo". La trasformazione trasforma ogni linea in un punto e quindi tutti i punti che si trovavano su un lato di quella linea vengono trasformati in un lato di questo punto in modo da poter ancora calcolare quale lato della linea era originariamente, anche se non è possibile calcolare il linea originale.
Elon

"e quando un giocatore viene utilizzato come server non può partecipare al gioco di giocatori che stanno effettivamente giocando quel server" Quindi intendi come far cadere P2P?
Hobbamok,

-3

Quando dici "Nascondere informazioni sensibili dagli avversari", intendi che vuoi evitare che le persone con sniffer di pacchetti ascoltino il tuo traffico e ottengano informazioni sul tuo gioco?

In tal caso, c'è una risposta semplice a questo; la maggior parte dei giochi AAA (e certamente giochi per console) usano la crittografia. In effetti, è così comune che molti dei middleware di rete utilizzati nei giochi hanno già incorporato la crittografia dei pacchetti.

Di solito funziona in questo modo: quando si apre una connessione a un'altra macchina, prima che il socket diventi attivo, si verifica uno scambio di chiavi. So che su XBox era lo scambio di chiavi Diffie-Hellman; Non ho idea se lo usano ancora adesso. Quindi, una volta che hai le tue chiavi, tutti i dati inviati vengono crittografati utilizzando le chiavi e non crittografati alla ricezione. Se qualcuno usa uno sniffer per leggere i tuoi pacchetti, sembreranno incomprensibili ed è improbabile che possano decifrarli poiché non hanno le chiavi. (Gli hacker avanzati possono essere in grado di ottenerli accedendo alla memoria di processo del gioco in esecuzione, ma questo è raro e improbabile.)

L'unica eccezione alla regola di crittografia sono i dati VoiceChat; per legge negli Stati Uniti, la chat vocale deve essere inviata in chiaro in modo che la CIA possa ascoltare se lo desidera. Le console di solito forniscono un modo per taggare i dati vocali in modo che non siano crittografati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.