在C ++中加密存档的方法

时间:2011-01-26 22:21:05

标签: c++ compression encryption password-protection

我正在编写一个游戏,它会在一些xml文档中包含大量信息(配置,某些内容等)以及资源文件。这将使我和其他人更容易编辑程序,而无需编辑实际的C ++文件,也无需重新编译。

但是,随着程序开始增长,与程序在同一目录中的文件会增加。所以我想把它们放在一个文件存档中(因为它们主要是文本,压缩效果很好)。

我的问题是:压缩所有文件会更容易吗:

  1. 为其设置密码(如受密码保护的ZIP),然后在程序需要时提供密码
  2. 使用Crypto ++或类似的
  3. 加密存档
  4. 稍微修改文件标题作为“临时”加密,并在文件加载时修复文件标题
  5. 我认为数字1和2是相似的,但我找不到有关zlib是否可以处理受密码保护的档案的任何信息。

    另请注意,我不希望在程序使用时将存档中的文件“提取”到文件夹中。它应该只在系统的内存中。

3 个答案:

答案 0 :(得分:2)

我认为你误解了加密带来的可能性。

只要程序在不受信任的主机上执行,就无法保证任何内容。

最多,你可能会很难(加密,代码混淆)或极其困难(自我修改代码,调试/钩子检测),有些人可以对代码进行反向工程,但是你无法阻止破解。有了互联网,一旦被一个人破解,它就会全部可用。

同样,确实可以防止个人篡改配置。无论采用何种方法(CRC,Hash - >加密方式并不意味着防止篡改),只要有足够的时间和手段(和动机),仍然可以对其进行逆向工程。

保证未配置配置的唯一方法是将其存储在您控制的地方(服务器),签名(非对称)并让程序检查签名。但即使这样,它也不会阻止有人使用补丁程序来运行用户提供的(未签名的)配置文件...

你知道最糟糕的吗?人们可能更喜欢破解版本,因为摆脱了所有这些“安全”措施的负担,它会跑得更快......

注意:是的,这是非法的,但让我们务实......

注意:关于动机,保护程序越聪明,对黑客越有吸引力 - >这就像是他们的脑筋急转弯!

那么你如何提供安全的服务?

  • 您需要信任执行该程序的人
  • 您需要信任存储配置的人

只有当您提供瘦客户端并在您信任的服务器上执行所有操作时才能执行此操作...即使这样,您也无法确保没有人在服务器中找到您没想过的门约。

在你的鞋子里,我只是确保检测到光线篡改配置(将其视为敌对并确保在运行任何东西之前验证数据)。在所有文件损坏同样可能之后,如果损坏的配置文件意味着破坏了客户端的计算机,那么将会付出代价:)

答案 1 :(得分:1)

如果我必须在你的三个选项中进行选择,我会选择Crypto ++,因为它非常适合C ++的iostreams。

但是:你是

  • 将您的数据序列化为XML
  • 压缩它
  • 加密
全都在记忆中,然后又回来了。我真的在重新考虑这个选择。为什么不使用eg。 SQLite将所有数据存储在基于文件的数据库中(SQLite不需要任何外部数据库进程)?

可以通过各种扩展程序(SEESQLCipher)添加加密。它安全,快速,完全透明。

你没有得到压缩,但是再次,通过使用SQLite而不是XML,这不会是一个问题(或者我认为)。

答案 2 :(得分:1)

  

为其设置密码(如受密码保护的ZIP),然后在程序需要时提供密码

首先,除非您要求用户输入密码,否则您无法执行此操作。如果该加密密钥存储在代码中,请不要向确定的逆向工程师下注并找到它并解密存档。

一个重要规则是:您无法在您的软件中存储加密密钥,因为如果您这样做,使用加密有什么意义?我能找到你的钥匙。

现在,转到其他方面。 zlib does not support encryption正如他们所指出的,PKZip is rather broken anyway。我怀疑如果你倾向于找到一个,你可能会找到一个能够处理加密的压缩/压缩库。 (ZipArchive我相信处理Zip + AES,但你需要为此付费。)

但是我的第二个丹尼尔的答案刚刚出现在我的屏幕上。为什么?加密/压缩不会给您带来任何好处,除非用户提供某种形式的令牌(密码,智能卡等),这些令牌不存在于已编译的二进制文件或相关文件中。同样,如果你没有耗尽大量磁盘空间,为什么要压缩?