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

C++ 在C+中加密存档的方法+;,c++,compression,encryption,password-protection,C++,Compression,Encryption,Password Protection,我正在编写一个游戏,在一些xml文档以及资源文件中包含大量信息(配置、一些内容等)。这将使我自己和其他人更容易编辑程序而不必编辑实际的C++文件,而不必重新编译。 但是,随着程序开始增长,与程序位于同一目录中的文件也在增加。所以我想把它们放在一个文件归档中(因为它们大部分是文本,压缩效果很好) 我的问题是:压缩所有文件和: 为其设置密码(如密码保护的ZIP),然后在程序需要时提供密码 使用Crypto++或类似工具加密存档 稍微修改文件头作为“临时”加密,并在加载文件时修复文件头 我认为数字1和

我正在编写一个游戏,在一些xml文档以及资源文件中包含大量信息(配置、一些内容等)。这将使我自己和其他人更容易编辑程序而不必编辑实际的C++文件,而不必重新编译。 但是,随着程序开始增长,与程序位于同一目录中的文件也在增加。所以我想把它们放在一个文件归档中(因为它们大部分是文本,压缩效果很好)

我的问题是:压缩所有文件和:

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


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

    如果我必须在三个选项中选择,我会选择密码+ +,因为它与C++ iOnSt流非常适合。 但是:你是

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

    可以通过各种扩展(或)添加加密。它安全、快速、完全透明

    您不会得到压缩,但是再次强调,通过使用SQLite而不是XML,这将不会是一个问题(或者我认为是这样)

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

    首先,你不能这样做,除非你要问一个用户的密码。如果该加密密钥存储在代码中,不要指望一个确定的逆向工程能够找到它并解密归档文件

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

    现在,谈谈其他问题。正如他们所指出的。我怀疑如果你这么想找到一个,你可能会找到一个能够处理加密的zip/压缩库。(我相信处理Zip+AES,但您需要为此付费)


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

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

    只要程序在不受信任的主机上执行,就不可能保证任何事情

    最多,您可以使代码逆向工程变得困难(加密、代码混淆)或极其困难(自修改代码、调试/钩子检测),但您无法防止代码被破解。有了互联网,只要一个人破解了,所有人都可以使用

    确实,防止个人篡改配置也是如此。无论采用何种方法(CRC、哈希-->顺便说一句,加密不是为了防止篡改),只要有足够的时间和手段(以及动机),仍然可以对其进行反向工程

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

    你知道最糟糕的是什么吗?人们可能会更喜欢破解版,因为它摆脱了所有“安全”措施的负担,运行速度会更快

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

    注意:关于动机,你越聪明地保护程序,它对黑客就越有吸引力-->这就像是一个脑筋急转弯

    那么,您如何提供安全的服务呢

    • 你需要信任执行程序的人
    • 您需要信任存储配置的人员
    只有当您提供瘦客户机并在您信任的服务器上执行所有操作时,才能完成此操作。。。即使这样,您也很难确保没有人在您的服务器中找到您没有想到的门


    在您的情况下,我只需确保检测到对配置的轻微篡改(将其视为恶意,并确保在运行任何东西之前验证数据)。毕竟,文件损坏的可能性是一样的,如果一个损坏的配置文件意味着一台损坏的客户端机器,你为什么要加密这些东西呢?它需要加密,因为我不想让任何人编辑它或反向工程它。如果数据和可执行代码在用户的机器上,那么你的加密不会阻止一个坚定的黑客。哎呀,很多游戏都使用自己的虚拟文件系统,并且通常仅适用于只读文件。为了保护保存的游戏,可以使用CRC。我考虑过数据库,但由于有许多不同类型的文件(不仅仅是xml配置),我认为将.png存储到数据库中是没有意义的。此外,如果我需要编辑多个或单个文件,我可以:解压缩文件,编辑文件,然后重新打包。我认为数据库会更复杂一点。我以前从未使用过SQLite,所以如果你不同意,请男人们