C# 客户端到客户端通信-阻止用户查看内容

C# 客户端到客户端通信-阻止用户查看内容,c#,json,encryption,aes,multiplayer,C#,Json,Encryption,Aes,Multiplayer,我正在开发一个简单的回合制游戏(有点像棋盘游戏)。我决定为多人游戏实现一个简单的PBEM(通过电子邮件播放)系统。系统使用JSON传输每个玩家的动作 在3名玩家的情况下,系统的工作原理如下: Player1做出动作并将其(作为JSON)发送给player2 玩家2读取JSON,然后附加自己的动作,然后将JSON发送给玩家3 Player3读取JSON,进行自己的移动,然后向player1发送一个新的JSON 我希望我在所有3台玩家电脑上的应用程序都可以打开并读取json,但玩家本身不应该能够

我正在开发一个简单的回合制游戏(有点像棋盘游戏)。我决定为多人游戏实现一个简单的PBEM(通过电子邮件播放)系统。系统使用JSON传输每个玩家的动作

在3名玩家的情况下,系统的工作原理如下:

  • Player1做出动作并将其(作为JSON)发送给player2
  • 玩家2读取JSON,然后附加自己的动作,然后将JSON发送给玩家3
  • Player3读取JSON,进行自己的移动,然后向player1发送一个新的JSON
我希望我在所有3台玩家电脑上的应用程序都可以打开并读取json,但玩家本身不应该能够读取.json的内容(他们可能会获得优势,这将是欺骗)

为了防止玩家读取JSON,现在我加密了.JSON文件

问题是我用来加密/解密的密钥在应用程序中是硬编码的

所以现在一切都正常,.json是加密的,但一旦我的应用程序二进制文件被反向工程,用于加密的密钥就会出现,每个人都可以用它来解密.json

我如何解决这个问题

注意,通信完全基于客户端到客户端,没有服务器或用户管理

编辑:标题稍加修改

一旦我的应用程序二进制文件被反向工程,用于加密的密钥

你对此无能为力。加密确保了针对第三方参与者的机密性,但客户端实际上是。。客户端,需要解密和处理数据

您可以尝试将密钥隐藏在某个位置,使其更难找到(混淆),但最终应用程序在客户端运行,需要将密钥放在某个位置

每个人都可以用它来解密.json


您可以使用PKI(ech播放器将有自己的私钥/私钥对),他们将交换公钥。这样,只有收件人才能解密邮件。

我认为PKI基础设施将解决您的问题,但这是一个非常昂贵的解决方案

与其考虑逆向工程,不如考虑访问控制措施。一旦player1向player2发送信息,应用程序应该锁定JSON数据文件。应用程序必须锁定该文件,以便其他程序或用户无法打开该文件进行读写


在这里,我们应该先问用例的问题。没有人能保证内部威胁。

你的应用程序真的需要知道整个游戏状态吗?保守秘密的最好方法是在他们需要知道之前不要告诉任何人

例如,每个玩家可以在本地写下他们的游戏状态,然后对其进行散列,并且只与其他玩家共享该回合的散列。之后,他们可以向其他玩家提供完整的游戏状态,以验证他们没有作弊


您使用的技术取决于游戏的工作方式以及您实际需要共享的信息量。

P2P通信和安全性并非微不足道。你不能只是建立一个连接并加密它。顺便说一句,HTTPS解决了安全通信问题。JSON根本不起作用。事实上,如果您使用gRPC,您将获得更好的性能。真正的问题是验证玩家身份、播放状态、防止作弊等。几乎所有在线游戏都使用服务器是有原因的。Windows上的DirectX有一个P2P组件,但WAN上的延迟太高了,即使是像《电子商务时代》这样的战略游戏。事实上,P2P和云计算一起发展:当你不能信任服务器,或者不能拥有一个受信任的服务器时,你如何处理数据中心中的通信?如何将eg文件或BLOB的状态分发到所有服务器,并在任何一个服务器随时可能出现故障时恢复正确的数据?通过广域网?可以说
分布式玩家,没有信任,比特币