如何在不使用密钥的情况下加密保存文件?[关闭]


21

假设我做了一个简单的程序,该程序接收.dat二进制格式加密的文件,然后将其解密为字节数组,然后将所有内容再次重写为解密的文件。

例如:

我已经做了一个二进制加密算法。=> 0100100001100101001000000110100001100101011000 ...

但这很容易解密...

是否有可能(如果不需要任何密钥)来加密保存进度?


15
您确定要加密保存吗?作弊有更简单的方法,例如在使用内存修改时。我只是用zlib压缩它们(将它们放到.gz中),它将减小大小并防止某些可能的作弊者对其进行修改。
HolyBlackCat

36
细读:您正在做的是编码,而不是加密
菲利普

13
(假设这是针对单人游戏)不要试图阻止单人游戏中的作弊行为,这对您和您的玩家来说都是很烦人的。并且最终是无用的。

6
这是不可能的加密保存的文件,使用户无法读取或修改。(例如,因为它们可以在解密后立即在调试器中暂停您的游戏!)。但是,您可以加大难度(因为与在调试器中查找暂停游戏的正确时机相比,打开纯文本文件确实很容易)。那是你想做的吗?
user253751 '16

6
@DanielBejar我刚刚告诉过你,你不可能使之成为不可能,只能使它变得更难。
user253751 '16

Answers:


77

通常,除非您至少拥有数学计算机科学博士学位,否则永远不要发明自己的密码算法。但是,有许多好的股票算法没有已知的攻击,并且可以用许多编程语言免费实现。例如RC5,AES或河豚。根据您用来开发游戏的技术的不同,它甚至可以提供现成的安全加密。

但是,问题是加密保存游戏是否是一个好主意。

首先,当您的游戏可执行文件进行加密和解密时,您必须在游戏可执行文件中同时包含算法和密钥。这意味着坚定的黑客可以找到它们,提取它们,然后使用它们来构建保存游戏编辑器。因此,它永远不可能100%安全。

其次,您为什么仍要这样做?当它是在线游戏时,您应该在线存储游戏状态,以便玩家无法对其进行修改。如果是离线游戏,那又何必呢?作弊者只会在最坏的情况下伤害自己的游戏体验。想要按预期享受游戏的诚实玩家完全不会受到此影响。另一方面,允许玩家作弊可以为您的游戏增加价值。它允许玩家以不同的方式体验游戏,这可以增加他们对游戏的长期乐趣。


5
尽管我无法想象有人会在几个小时内提出好的建议。而且,您可能会在可能不需要的东西上浪费资源。
Aistis '16

6
“当它是一款离线游戏时,为什么还要麻烦呢?” 如果它是具有在线得分的单人游戏怎么办?
戴帽子的家伙

19
“允许玩家作弊可以为您的游戏增添价值”-对此声明表示支持。那些决定锁定我所付费用的游戏直到达到一定程度的掌握之前,我真的很生气,我很高兴在这些情况下,有一些作弊可以解锁整个游戏。例如,在旧版《极品飞车》中,我在与AI的赛车比赛中完全迷路了;对我来说,享受的乐趣在于穿越多姿多彩的风景,因此我通常跳过比赛并解锁所有地图和汽车。一个阻止这种情况的游戏只会惹恼我。
OR Mapper

6
我想将“除非您至少拥有数学和计算机科学博士学位”改写为“除非您至少拥有获得数学和计算机科学博士学位所需的知识”(即使如此,至少在德国,课程通常充满了与加密货币无关的内容。一个人本质上并不需要学位来胜过博士学位。
phresnel

5
@phresnel尽管您在技术上是正确的,但博士学位是由受信任的机构授予的对理论主题掌握程度的标准度量。因此,将其用作获得博士学位所需的大量知识和技能的捷径是有意义的。换句话说:OP的意思很清楚:-)
Tobia

10

要在本地进行加密和解密,您需要将密钥存储在程序中,这样,如果人们反汇编您的代码,便能够破解加密。有一些使密钥变得模糊的技巧,但是即使是那些迷惑人心的密钥,攻击者也会找到密钥,然后将其发布给所有不那么愿意看到的人。加密唯一可以防止的是使用十六进制编辑器的人-您可以轻松地通过压缩以及任何使文件无法被解压缩程序读取的东西来挫败它。例如,在数据前面添加一个字节。

或者,您可以在文件末尾附加保存文件的md5,这样您就会注意到文件是否已被篡改。然后,您可以使用它来拒绝加载存档游戏,或者适当地标记支持通知单,这样您就不会浪费时间在由手动修改的存档游戏引起的问题上。同样,对于任何可以阅读您的代码的人来说,这都是微不足道的。

如果您希望某些人无法访问其设备上的二进制文件,则需要在您控制的服务器上运行该程序的一部分。

为了回答您的最后一个问题,密钥加加密类型仅标识需要用于加密/解密的确切算法。如果没有定义如何加密/解密数据的算法,您将无法加密/解密数据。


您的第二点很好。在文件损坏的情况下,它还可以帮助跟踪问题。
Knowledge_is_power

4

将实际保存数据的转换后的SHA256哈希存储在保存文件中。

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

如果不匹配,则说明他们欺骗或破坏了文件。

编辑澄清:这使得破解反作弊系统更加困难,但仍然可能


7
进行修改后,没有什么可以阻止人们重新计算哈希值。而且,我不明白为什么还有其他人会提出更好的替代方案,例如SHA-256(用于签名)或bcrypt(用于密码),以其众所周知的所有加密弱点来倡导破碎的MD5算法。
菲利普

1
简单,快速且完全损坏。
DeadMG '16

2
@DeadMG它被设计破坏了,因为用户可以访问必须包含密钥的二进制文件。使用更强的散列或使用诸如AES之类的文件加密文件会浪费资源,并且设计不良,因为它没有提供任何额外的安全性,但确实增加了成本。+1,因为降级投票不当。
彼得-Unban罗伯特·哈维

7
@Philipp,因为在这种情况下,MD5明显优于SHA-256。所描述的方法所需要的是便宜的校验和算法,这恰好是MD5。
彼得-Unban罗伯特·哈维

3
@ transistor09,如果它纯粹是客户端,我们无法确保任何事情,校验和与让客户端对整个事物进行加密一样有效。无论哪种方式,它都可以被破解。
卢卢斯,2013年

1

我将使用标准的加密算法(因为这样会使对保存的文件执行加密分析变得更加困难),但不是最常用的前五种算法之一,而是将其隐藏在整个代码中(因为这会使您更难理解它采用的算法)是,关键在哪里。)

要将加密算法隐藏在代码中:采取开放源代码版本,了解其流程(该函数按什么顺序调用其他人),然后重命名所有变量,结构字段和函数名称(请确保)并扩展函数在整个代码库中,在不同的对象和模块中,可能还暂时将其执行分开(执行一段加密,然后执行其他操作,然后在看似无关的一段代码返回到它之后执行另一阶段)可以以相同的方式隐藏密钥,因为整个类中有许多看似无关的常量,它们在运行时由加密算法的各个隐藏部分进行访问。

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


我不知道...让比赛变得更加艰难...但是感谢您的帮助!我会尽力的!
DanielBéjar'16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.