P2P сеть скрывается?

13

Я работал над архитектурой P2P для безопасных игр и разделил проблему на пять подзадач:

  • Незаконное изменение состояния отправленной игры
  • Точно сбрасывать читеров
  • Согласие на игровое состояние
  • Избегать читов "смотреть в будущее"
  • Сокрытие конфиденциальной информации от противников

Первые четыре я почти все решил, но это последний, с которым у меня проблемы.

Прежде чем я углублюсь в детали, я просто хочу спросить, пропустил ли я что-нибудь в моем списке создания "чит-защищенной" p2p-сети. Меня не интересуют читы, такие как использование прицельных роботов, я заинтересован только в том, чтобы сделать сеть p2p такой же безопасной, как централизованный сервер.

Поэтому в моих усилиях по сокрытию секретной информации я сосредоточился на положении игроков в игре, где позиция вашего противника не всегда должна быть известна. Тогда возникает проблема, как определить, следует ли отправлять свою позицию противнику, не зная позиции своего противника.

Я исключил такие методы, как оппонент, отправляющий несколько ложных позиций, чтобы вы тоже могли сравнить свои, поскольку ваш оппонент может легко злоупотребить такой системой, поскольку он получит вашу позицию, если одна из ложных позиций окажется «видимой» с вашей позиции.

Метод, на котором я сфокусировался, заключается в том, что вы получаете «поле зрения» от своего оппонента и можете таким образом определить, следует ли вам отправлять свою позицию или нет. Это, однако, проблема в таких играх, как League of Legends, где поле зрения вашего оппонента также содержит очень конфиденциальную информацию. Я попытался решить эту проблему путем преобразования поля зрения с помощью особой матрицы, означающей, что вы не можете перейти от преобразованной версии поля зрения к исходной версии, но, поскольку это линейное преобразование, вы все равно можете выяснить, находится ли ваша позиция внутри поле зрения или нет.

Это, однако, не работает идеально, точное поле зрения не может быть восстановлено после преобразования, но информация о «уклонах» в поле зрения (поле зрения состоит из нескольких линий, и можно определить наклон каждой линии) восстановлен, и это может быть использовано для сравнительно недорогой реконструкции исходного поля зрения.

По сути, мне нужна функция, которая может определить, является ли позиция «видимой» или нет, и реконструкция этой функции / поля зрения должна быть настолько вычислительно сложной, что после того, как вы закончите реконструкцию поля зрения, она больше не актуальна для игра в действии. Есть ли какой-нибудь супер умный человек, который знает о таком методе?

редактировать Люди, кажется, запутались во всем «поле зрения», поэтому я собираюсь дать более подробное объяснение здесь. Поле зрения состоит из групп из набора линий, вы можете легко проверить, находится ли позиция внутри одной из этих групп, просто проверив, с какой стороны линии находится ваша позиция, если она находится на одной стороне для всех линий в этой группе, которую вы знаете это внутри этой группы и, следовательно, внутри поля зрения.

Однако отправляемая информация - это не эта строка, а преобразование линии и преобразование (2 на 2 в единственной матрице), вы все равно можете проверить, на какой стороне линии находится ваша позиция, сначала преобразовав ее, используя полученное преобразование. и сравнивая это значение с преобразованной линией. Ключевым моментом здесь является то, что преобразование является единичным, то есть невозможно найти обратное, чтобы вернуться к исходной строке. Однако можно определить наклон линии, которая делает реконструкцию линии, просто проверив, на какой стороне преобразованной линии лежит много точек, пока вы не определили начало линии значительно вычислительно дешевле, чем если бы вы не знали наклон линии.

То, что я ищу, - это метод определения, находится ли точка внутри области, где восстановление области по методу либо невозможно (что, я сомневаюсь, существует, так как вы всегда можете использовать ее методом грубой силы), либо очень сложное в вычислительном отношении.

Элон
источник
1
Я провел около 11 лет, сосредоточившись на этой конкретной проблеме, и первые 4 вещи, которые вы перечислили, тривиальны, но та, о которой вы спрашивали, не вписывается в ответ SE. Я в конечном итоге выложу на нем официальный документ.
MickLH
Я думаю, что это будет очень зависеть от ваших подходов к другим проблемам
Феникс
@MickLH Какой лучший метод вы нашли для решения этой проблемы? :) А что вы думаете об использовании преобразованных визуальных полей / полей взаимодействия? Это то, что вы изучили?
Элон
Я исследовал преобразованные поля и показал, что это совершенно небезопасно. Один игрок всегда сможет определить позицию другого игрока, независимо от того, как вы скрываете трансформацию, поскольку ни один из игроков не может выучить что-либо, пока один из них не получит всю необходимую информацию, после чего они узнают позицию другого игрока и может прекратить протокол, не сказав другому игроку.
MickLH
Что касается «лучшего» метода ... Я был серьезен выше, даже самый простой метод - это сложная тема, для объяснения которой действительно необходим целый документ.
MickLH

Ответы:

1

Я думаю, что даже если бы у вас был необратимый алгоритм для поля зрения, люди все равно могли бы получить преимущество, рассчитав, не приведет ли пересечение ближайших к ним точек этого места и пересечение поля зрения противника. В плохом случае (достаточно большого поля зрения к отношению карты) вы можете вычислить точную точку вашего врага.

Вместо этого я думаю, что, возможно, все подключенные узлы должны объявить, в какой части карты они находятся, чтобы определить, могут ли они видеть друг друга или нет. Сначала разбейте карту на 2x2 или 2x2x2, если важно 3-е измерение. Тогда все говорят друг другу, находятся ли они в 1,0, 1,1, 0,1 или 0,0. Если они не находятся в одном и том же квадранте, их разговор окончен до следующей проверки. Это защищает их точное местоположение. Если они существуют в одном и том же квадранте, они разделят это пространство на 4 новых квадра и продолжают до тех пор, пока не определят, что находятся достаточно близко, чтобы их видели друг друга.

Конечно, есть проблемы с границами квадрантов, но это должно быть решено дополнительными запросами к соседним квадрантам.

user115137
источник
-1

Не принимайте это как окончательный ответ, тема очень широкая (я не удивлюсь, если кто-то пометит ваш вопрос как факт).

Вы можете решить эту проблему, используя некоторых игроков в качестве сервера, и когда игрок используется в качестве сервера, он не может участвовать в игре игроков, которые фактически играют на этом сервере .

Если ваша игра не слишком требовательна, вы также можете запускать несколько серверов с одного компьютера игрока (конечно, это будет полезно, поскольку не все игроки могут работать как сервер из-за проблем с NAT, спасибо, IPv6 !!).

Основная проблема здесь заключается в том, что поскольку случайный игрок будет использоваться в качестве сервера, есть небольшая вероятность, что он будет «скомпрометированным» игроком или что он передаст симуляцию «скомпрометированному» игроку, позволяя передавать конфиденциальную информацию ( ну, на самом деле на тот момент сервер мог отправлять произвольные данные и в любом случае вызывать победу).

Если вы используете центральный сервер для проверки авторизации и входа в систему, тогда вы можете позволить лучше организовывать игры и легко забанить игроков (однако это уже не будет чисто P2P-сеть).

Вы также можете разделить мир на фрагменты и вычислить хэш видимых фрагментов, но это можно легко обмануть, наиболее распространенные видимые фрагменты позволят довольно быстро построить таблицу хэшей.

Для меня ваш вопрос похож на попытку поиска криптографической функции. Тест должен быть быстрым, но грубая сила должна быть медленной.

Самое простое, что приходит мне в голову (также связанное с моей работой), - это использовать некоторый алгоритм быстрого распознавания зрения (дополненный, похожий на реальность).

Если вам удастся сделать быстрый «снимок» вашего местоположения (похожий на кусочки), то это можно будет распознать только в том случае, если вы разместите вокруг чего-то видимого, то вы получите его. Особенно, если на карте есть синхронизированные элементы, которые позволяют быстро генерировать шаблоны распознавания.

Однако даже если такие алгоритмы станут довольно быстрыми даже на мобильных устройствах, я не думаю, что они будут достаточно быстрыми для шутера от первого лица.

Также, если вы сделаете их слишком быстро, у вас будут поддельные позитивы! И игрок может в любом случае создать игру, которая пробует некоторые «обычные визуальные эффекты», чтобы один из визуальных эффектов совпадал с алгоритмом обнаружения признаков.

Я не удивлюсь, что единственное возможное решение вашей проблемы было бы возможно в квантовых вычислениях, и через несколько лет кто-то опубликует статью, доказывающую этот внутренний предел в P2P-сетях.

Разработчик игр
источник
Да, я предполагал это. Даже с 4 ГБ данных вы можете хранить достаточно хэшей, чтобы легко их обмануть. Я читал о математическом поле, которое было о преобразованиях зашифрованных данных (например, суммирование значения в зашифрованном значении так, чтобы оно увеличивалось без раскрытия реального значения), возможно, вы можете найти что-то в этом поле, но, честно говоря, я не понимаю это поле ^^
GameDeveloper
Возможно, мне следовало бы прояснить вопрос о «поле зрения», оно состоит из группы линий, чтобы вы могли вычислить, с какой стороны этой линии находится точка, группы таких линий образуют выпуклые области, а группы таких областей составляют целое «поле зрения». Преобразование преобразует каждую линию в точку, а затем все точки, которые находились на одной стороне этой линии, преобразуются в одну сторону этой точки, поэтому вы все еще можете рассчитать, с какой стороны линии она была изначально, даже если вы не можете вычислить оригинальная линия.
Элон
«и когда игрок используется в качестве сервера, он не может участвовать в игре игроков, которые на самом деле играют на этом сервере». То есть, вы хотите сбросить P2P?
Хоббамок
-3

Когда вы говорите «Скрытие конфиденциальной информации от оппонентов», вы имеете в виду, что хотите, чтобы люди с перехватчиками пакетов не слушали ваш трафик и не получали информацию о вашей игре?

Если так, есть простой ответ на это; большинство игр AAA (и, конечно, консольные игры) используют шифрование. На самом деле, это настолько распространено, что многие сетевые промежуточные программы, используемые в играх, уже имеют встроенное шифрование пакетов.

Обычно это работает так: когда вы открываете соединение с другим компьютером, прежде чем сокет станет активным, произойдет обмен ключами. Я знаю, что в XBox это был обмен ключами Диффи-Хеллмана; Я понятия не имею, используют ли они это сейчас. Затем, когда у вас есть ключи, все отправленные данные шифруются с использованием ключей и не шифруются при получении. Если кто-то использует сниффер для чтения ваших пакетов, он будет выглядеть как бред, и вряд ли он сможет их расшифровать, поскольку у него нет ключей. (Опытные хакеры могут получить их, получив доступ к памяти процесса запущенной игры, но это редко и маловероятно.)

Единственное исключение из правила шифрования - данные VoiceChat; по закону в США голосовой чат должен отправляться в открытом виде, чтобы ЦРУ могло прослушивать, если они этого хотят. Консоли обычно предоставляют способ пометить голосовые данные, чтобы они не были зашифрованы.

JanSolo
источник