假设我做了一个简单的程序,该程序接收.dat
以二进制格式加密的文件,然后将其解密为字节数组,然后将所有内容再次重写为解密的文件。
例如:
我已经做了一个二进制加密算法。=> 0100100001100101001000000110100001100101011000 ...
但这很容易解密...
是否有可能(如果不需要任何密钥)来加密保存进度?
假设我做了一个简单的程序,该程序接收.dat
以二进制格式加密的文件,然后将其解密为字节数组,然后将所有内容再次重写为解密的文件。
例如:
我已经做了一个二进制加密算法。=> 0100100001100101001000000110100001100101011000 ...
但这很容易解密...
是否有可能(如果不需要任何密钥)来加密保存进度?
Answers:
通常,除非您至少拥有数学和计算机科学博士学位,否则永远不要发明自己的密码算法。但是,有许多好的股票算法没有已知的攻击,并且可以用许多编程语言免费实现。例如RC5,AES或河豚。根据您用来开发游戏的技术的不同,它甚至可以提供现成的安全加密。
但是,问题是加密保存游戏是否是一个好主意。
首先,当您的游戏可执行文件进行加密和解密时,您必须在游戏可执行文件中同时包含算法和密钥。这意味着坚定的黑客可以找到它们,提取它们,然后使用它们来构建保存游戏编辑器。因此,它永远不可能100%安全。
其次,您为什么仍要这样做?当它是在线游戏时,您应该在线存储游戏状态,以便玩家无法对其进行修改。如果是离线游戏,那又何必呢?作弊者只会在最坏的情况下伤害自己的游戏体验。想要按预期享受游戏的诚实玩家完全不会受到此影响。另一方面,允许玩家作弊可以为您的游戏增加价值。它允许玩家以不同的方式体验游戏,这可以增加他们对游戏的长期乐趣。
要在本地进行加密和解密,您需要将密钥存储在程序中,这样,如果人们反汇编您的代码,便能够破解加密。有一些使密钥变得模糊的技巧,但是即使是那些迷惑人心的密钥,攻击者也会找到密钥,然后将其发布给所有不那么愿意看到的人。加密唯一可以防止的是使用十六进制编辑器的人-您可以轻松地通过压缩以及任何使文件无法被解压缩程序读取的东西来挫败它。例如,在数据前面添加一个字节。
或者,您可以在文件末尾附加保存文件的md5,这样您就会注意到文件是否已被篡改。然后,您可以使用它来拒绝加载存档游戏,或者适当地标记支持通知单,这样您就不会浪费时间在由手动修改的存档游戏引起的问题上。同样,对于任何可以阅读您的代码的人来说,这都是微不足道的。
如果您希望某些人无法访问其设备上的二进制文件,则需要在您控制的服务器上运行该程序的一部分。
为了回答您的最后一个问题,密钥加加密类型仅标识需要用于加密/解密的确切算法。如果没有定义如何加密/解密数据的算法,您将无法加密/解密数据。
将实际保存数据的转换后的SHA256哈希存储在保存文件中。
加载时将存储的哈希与数据的SHA256值进行比较。
如果不匹配,则说明他们欺骗或破坏了文件。
编辑澄清:这使得破解反作弊系统更加困难,但仍然可能。
我将使用标准的加密算法(因为这样会使对保存的文件执行加密分析变得更加困难),但不是最常用的前五种算法之一,而是将其隐藏在整个代码中(因为这会使您更难理解它采用的算法)是,关键在哪里。)
要将加密算法隐藏在代码中:采取开放源代码版本,了解其流程(该函数按什么顺序调用其他人),然后重命名所有变量,结构字段和函数名称(请确保)并扩展函数在整个代码库中,在不同的对象和模块中,可能还暂时将其执行分开(执行一段加密,然后执行其他操作,然后在看似无关的一段代码返回到它之后执行另一阶段)可以以相同的方式隐藏密钥,因为整个类中有许多看似无关的常量,它们在运行时由加密算法的各个隐藏部分进行访问。
所有这些是否都具有经济意义是另外一个话题。