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.