如何在不使用密钥的情况下encryption保存文件?

说我做了一个简单的程序,它采用二进制格式encryption.dat文件,然后将其解密为一个字节数组 ,然后再次将所有内容重写到解密的文件中。

例如:

我做了一个二进制encryptionalgorithm。 => 0100100001100101001000000110100001100101011000 …

但是这是非常容易解密的…

有什么办法,如果有可能不需要任何种类的密钥,encryption我的保存进度?

一般来说,你不应该发明自己的密码algorithm,除非你在math计算机科学方面至less有博士学位。 但是有很多好的股票algorithm没有已知的攻击,并且在许多编程语言中有免费的实现。 例如RC5,AES或Blowfish。 根据您使用哪种技术开发您的游戏,它甚至可以提供开箱即用的安全encryption。

然而,问题是如果encryptionsavegames是一个好主意。

首先,当你的游戏可执行文件进行encryption和解密时,你必须在游戏可执行文件中包含algorithm和密钥。 这意味着一个坚定的黑客可以find他们,提取他们,并使用他们来建立一个savegame编辑器。 所以它绝不能100%安全。

其次,你为什么要这样做呢? 当它是一个在线游戏时,你应该在线存储游戏状态,玩家不能修改它。 当它是一个离线游戏,那为什么要麻烦? 骗子只能在最坏的情况下伤害自己的游戏体验。 想要按照预期享受游戏的诚实玩家不会受到此影响。 另一方面,让玩家作弊可以增加游戏的价值。 它可以让玩家以不同的方式体验游戏,从而增加游戏的长期享受。

要在本地进行encryption和解密,您需要将密钥存储在您的程序中,以便人们可以在反汇编代码时破解encryption。 有一些技巧来模糊密钥,但即使是那些专门的攻击者也会find密钥,然后在线发布给那些不太热心的人。 encryption唯一防止的是使用hex编辑器的人 – 您可以使用压缩和任何使解压缩程序无法读取文件的任何东西轻松地进行压缩。 例如在数据前添加一个字节。

另外,你可以在文件末尾添加savefile的md5,所以你会注意到一个文件是否被篡改。 然后,您可以使用它来拒绝加载游戏存档,或者适当地标记支持故障单,这样您就不会浪费时间处理由手动修改的savegames引起的问题。 再说一遍,任何可以阅读你的代码的人都可以避开这个问题。

如果你想要某个人能够访问他们的设备上的二进制文件,那么你需要在你的控制之下的服务器上运行一部分程序。

要回答您的上一个问题,密钥加encryptiontypes只是标识需要应用于encryption/解密的确切algorithm。 如果没有定义如何操作的algorithm,则无法encryption/解密数据。

在保存文件中存储实际保存数据的转换SHA256散列。

将存储的散列值与加载数据时的SHA256值进行比较。

如果那不匹配,他们欺骗或损坏了文件。

编辑澄清:这使得它更难打破反作弊系统,但仍然有可能

我会使用一个标准的encryptionalgorithm(因为它使得在保存的文件上执行encryption分析变得困难),而不是使用最多的五个之一,并将其​​隐藏在整个代码中(因为它使得更难理解它是什么algorithm是,关键在哪里)

要将encryptionalgorithm隐藏到代码中:取一个开源版本,理解它的stream程(哪些函数以什么顺序调用哪个函数),然后重命名所有variables,结构域和函数名称(只是为了肯定),并将函数遍及你的代码库,在不同的对象和模块中,可能暂时分离它们的执行(执行一​​段encryption,然后做一些其他的事情,然后在一些ms从一个看起来不相关的代码回来并执行另一个阶段encryption等等)。密钥可以以同样的方式被隐藏起来,就像整个类中一些看起来不相关的常量一样,这些常量在运行时被encryptionalgorithm的各种隐藏部分所访问。

是否所有这些都成为经济意义是另一个话题。