Pracowałem nad architekturą P2P dla bezpiecznego grania i podzieliłem problem na pięć podproblemów:
- Nielegalna modyfikacja wysłanego stanu gry
- Dokładnie upuść oszustów
- Uzgodnienie stanu gry
- Unikanie oszustwa „patrz przed siebie”
- Ukrywanie poufnych informacji przed przeciwnikami
Pierwsze cztery, które prawie wszystkie rozwiązałem, ale jest to ostatnia, z którą mam problemy.
Zanim przejdę do szczegółów, chcę tylko zapytać, czy jest coś, co przeoczyłem na mojej liście tworzenia „odpornej na oszustwa” sieci p2p. Nie interesują mnie kody, takie jak korzystanie z aimbots, jestem zainteresowany tylko tym, aby sieć p2p była tak bezpieczna jak scentralizowany serwer.
W dotychczasowych wysiłkach ukrywania poufnych informacji skupiłem się na pozycji graczy w grze, w której pozycja przeciwnika nie zawsze powinna być znana. Problem polega na tym, jak ustalić, czy powinieneś wysłać swoją pozycję do przeciwnika, nie znając jego pozycji.
Wykluczyłem metody, takie jak przeciwnik wysyłający wiele fałszywych pozycji, abyś również mógł porównać twoje, ponieważ przeciwnik może łatwo nadużyć takiego systemu, ponieważ uzyska on twoją pozycję, jeśli jedna z fałszywych pozycji będzie „widoczna” z twojej pozycji.
Metoda, na której skupiam się, polega na tym, że otrzymujesz „pole widzenia” od przeciwnika, dzięki czemu możesz ustalić, czy powinieneś wysłać swoją pozycję, czy nie. Jest to jednak problem w grach takich jak League of Legends, w których pole widzenia przeciwnika jest również bardzo poufną informacją. Próbowałem rozwiązać ten problem, przekształcając pole widzenia za pomocą pojedynczej macierzy, co oznacza, że nie można przejść z przekształconej wersji pola widzenia z powrotem do pierwotnej wersji, ale ponieważ jest to transformacja liniowa, nadal można dowiedzieć się, czy pozycja jest w środku pole widzenia czy nie.
Nie działa to jednak idealnie, dokładne pole widzenia nie może zostać przywrócone po transformacji, ale informacje o „nachyleniach” w polu widzenia (pole widzenia jest zbudowane z kilku linii i można określić nachylenie każdej linii) odrestaurowany, co można wykorzystać do stosunkowo niedrogiej rekonstrukcji pierwotnego pola widzenia.
Zasadniczo potrzebuję funkcji, która może określić, czy pozycja jest „widoczna”, czy nie, a rekonstrukcja tej funkcji / pola widzenia musi być tak wymagająca obliczeniowo, że po zakończeniu rekonstrukcji pola widzenia nie ma już znaczenia gra w akcji. Czy jest jakaś super inteligentna osoba, która zdaje sobie sprawę z takiej metody?
Edytuj Ludzie wydają się nieco zdezorientowani całym „polem widzenia”, dlatego staram się tutaj podać bardziej szczegółowe wyjaśnienie. Pole widzenia składa się z grup zestawu linii, możesz łatwo sprawdzić, czy pozycja znajduje się w jednej z tych grup, po prostu sprawdzając, po której stronie linii znajduje się twoja pozycja, jeśli jest po tej samej stronie dla wszystkich linii w tej grupie, którą znasz jest w tej grupie, a zatem w polu widzenia.
Wysyłana informacja nie jest jednak tą linią, ale transformacją linii i transformacją (2 na 2 w liczbie pojedynczej macierzy), nadal możesz sprawdzić, po której stronie linii znajduje się twoja pozycja, najpierw przekształcając ją za pomocą transformacji, którą otrzymałeś i porównanie tej wartości z przekształconą linią. Kluczem tutaj jest to, że transformacja jest pojedyncza, co oznacza, że nie można znaleźć odwrotności, aby wrócić do pierwotnej linii. Możliwe jest jednak określenie nachylenia linii, która sprawia, że rekonstrukcja linii polega po prostu na sprawdzeniu, po której stronie przekształconej linii znajduje się wiele punktów, dopóki nie określisz początku linii znacznie taniej obliczeniowo, niż gdybyś nie wiedział nachylenie linii.
To, czego szukam, to metoda ustalenia, czy punkt znajduje się w obszarze, gdzie odtworzenie obszaru z tej metody jest albo niemożliwe (co, jak sądzę, istnieje, ponieważ zawsze można go brutalnie użyć), albo bardzo ciężkie obliczeniowo.
źródło
Odpowiedzi:
Myślę, że nawet gdybyś miał nieodwracalny algorytm pola widzenia, ludzie nadal mogliby zyskać przewagę, obliczając, czy pobliskie punkty prowadzące do nich spowodowałyby przecięcie się tej lokalizacji, a pole widzenia przeciwnika przecinałoby się. W złym przypadku (o wystarczająco dużym stosunku pola widzenia do mapy) można obliczyć poprzez eliminację dokładnego punktu wroga.
Myślę, że zamiast tego może wszyscy połączeni koledzy powinni ogłosić, w której części mapy się znajdują, aby ustalić, czy to możliwe, czy mogą się zobaczyć czy nie. Najpierw podziel mapę na 2x2 lub 2x2x2, jeśli trzeci wymiar jest ważny. Następnie wszyscy mówią sobie nawzajem, jeśli są w 1,0 1,1 0,1 lub 0,0. Jeśli nie znajdują się w tej samej ćwiartce, rozmowa kończy się do następnego sprawdzenia. Chroni to ich dokładną lokalizację. Jeśli istnieją w tej samej ćwiartce, podzielą to miejsce na 4 nowe kwadraty i będą kontynuować, dopóki nie stwierdzą, że są wystarczająco blisko, aby mogli się zobaczyć.
Oczywiście występują problemy z granicami ćwiartek, ale powinny być rozwiązane przez dodatkowe zapytania do sąsiednich ćwiartek.
źródło
Nie bierz tego za ostateczną odpowiedź, temat jest naprawdę szeroki (nie będę zaskoczony, jeśli ktoś oflaguje twoje pytanie).
Możesz rozwiązać ten problem, używając niektórych graczy jako serwera, a gdy gracz jest używany jako serwer, nie może brać udziału w grze graczy, którzy faktycznie grają na tym serwerze .
Jeśli twoja gra nie jest zbyt wymagająca, możesz równie dobrze uruchomić wiele serwerów z tego samego komputera gracza (oczywiście byłoby to przydatne, ponieważ nie wszyscy gracze mogą działać jako serwer z powodu problemów z NAT, dzięki IPv6 !!).
Główny problem polega na tym, że ponieważ losowy gracz będzie używany jako serwer, istnieje niewielka szansa, że będzie to „skompromitowany” gracz lub że przekaże symulację „skompromitowanemu” odtwarzaczowi, umożliwiając przekazanie poufnych informacji ( cóż, w rzeczywistości w tym momencie serwer mógł wysyłać dowolne dane i i tak wymuszać wygraną).
Jeśli używasz centralnego serwera do sprawdzania autoryzacji i logowania, możesz pozwolić lepiej organizować gry i łatwo banować graczy (jednak nie byłaby to już czysta sieć P2P).
Możesz także podzielić świat na plasterki i obliczyć skrót widocznych plasterków, ale można to łatwo oszukać, najczęściej widoczne plasterki pozwolą dość szybko zbudować tabelę skrótów.
Dla mnie twoje pytanie jest jak próba wyszukiwania funkcji kryptograficznej. Test powinien być szybki, ale brutalna siła powinna być powolna.
Najprostszą rzeczą, jaka przychodzi mi na myśl (również związaną z moją pracą), jest użycie algorytmu szybkiego rozpoznawania wzroku (podobnego do rzeczywistości rozszerzonej).
Jeśli uda ci się zrobić szybką „migawkę” swojej lokalizacji (podobną do wycinków), można to rozpoznać dopiero po umieszczeniu wokół czegoś widocznego, to będziesz ją miał. Zwłaszcza jeśli na mapie znajdują się elementy czasowe, które pozwalają na generowanie wzorów rozpoznawania szybkiego wyrzucania.
Jednak nawet jeśli takie algorytmy staną się dość szybkie nawet na urządzeniach mobilnych, nie sądzę, że będą one wystarczająco szybkie dla strzelanek z perspektywy pierwszej osoby.
Również jeśli zrobisz je zbyt szybko, będziesz miał fałszywe pozytywy! Gracz może i tak stworzyć grę, która wypróbuje niektóre typowe efekty wizualne, tak aby jeden z efektów wizualnych pasował pozytywnie do algorytmu wykrywania funkcji.
Nie będę zaskoczony, że jedyne możliwe rozwiązanie tego problemu byłoby możliwe w obliczeniach kwantowych, a za kilka lat ktoś opublikuje artykuł potwierdzający ten wewnętrzny limit w sieciach P2P.
źródło
Kiedy mówisz „Ukrywanie poufnych informacji przed przeciwnikami”, masz na myśli, że chcesz, aby ludzie z snifferem pakietów nie słuchali Twojego ruchu i nie uzyskiwali informacji o Twojej grze?
Jeśli tak, istnieje łatwa odpowiedź na to; większość gier AAA (i na pewno gry konsolowe) używa szyfrowania. W rzeczywistości jest tak powszechny, że wiele sieciowych pośredników używanych w grach ma już wbudowane szyfrowanie pakietów.
Zwykle działa to tak: Po otwarciu połączenia z innym komputerem, zanim gniazdo stanie się aktywne, nastąpi wymiana kluczy. Wiem, że w XBox była to wymiana kluczy Diffie-Hellman; Nie mam pojęcia, czy nadal go używają. Następnie, gdy masz klucze, wszystkie przesłane dane są szyfrowane przy użyciu kluczy i nieszyfrowane przy odbiorze. Jeśli ktoś użyje sniffera do odczytania twoich pakietów, będzie wyglądał jak bełkot i jest mało prawdopodobne, aby mógł je odszyfrować, ponieważ nie ma kluczy. (Zaawansowani hakerzy mogą je zdobyć, uzyskując dostęp do pamięci procesu uruchomionej gry, ale jest to rzadkie i mało prawdopodobne).
Jedynym wyjątkiem od reguły szyfrowania są dane VoiceChat; zgodnie z prawem w Stanach Zjednoczonych czat głosowy musi być wysyłany jawnie, aby CIA mogła go słuchać, jeśli tego chce. Konsole zazwyczaj zapewniają sposób oznaczania danych głosowych, aby nie były szyfrowane.
źródło