1

我想在我的游戏中使用xxtea进行数据加密/解密。

以下是库使用示例:

#include <stdio.h>
#include <string.h>
#include <xxtea.h>

int main() {
    const char *text = "Hello World! 你好,中国!";
    const char *key = "1234567890";
    size_t len;
    unsigned char *encrypt_data = xxtea_encrypt(text, strlen(text), key, &len);
    char *decrypt_data = xxtea_decrypt(encrypt_data, len, key, &len);
    if (strncmp(text, decrypt_data, len) == 0) {
        printf("success!\n");
    }
    else {
        printf("fail!\n");
    }
    free(encrypt_data);
    free(decrypt_data);
    return 0;
}

那么如何保持密钥本身的安全呢?

4

5 回答 5

12

正如@ArtjomB 所指出的,您可以通过不将密钥放入您的程序来保证密钥的安全。在启动期间,授权用户或安全设备将需要提供密钥。

任何看起来不像的东西都不再是加密或安全,而是某种形式的混淆。混淆(或“DRM”)可能介于无用和有些有效之间,具体取决于您将投入多少精力与破解它的兴趣。随着新攻击的出现,您为改进这一点的持续预算是多少?您预期的攻击者的复杂程度如何?

苹果(作为一个例子)非常严格地控制他们的硬件、固件和操作系统,并拥有一支完全致力于不断改进的团队。iPhone 通常会在新版本发布后的几周到几个月内越狱。您应该考虑一个有吸引力的目标的最佳情况。

如果你在想“好吧,我可以在一个下午做些什么来防止脚踝咬伤?” 做任何想到的事情。将其与其他一些硬编码值进行异或。也许位移它或其他什么。它对任何关心的人都没有多大帮助,但它会阻止最随意的攻击者,至少你不会在上面浪费大量时间和金钱。

从那开始,看看你的平台的内置解决方案。操作系统帮助是一个很大的帮助。特别是,查看 Windows 上的SLP 服务。如果您通过 Mac App Store 工作,Mac 会提供许可强制执行。或者您可以查看拥有自己专有解决方案的商业供应商,例如 eSellerate。SafeNet 有几种产品。当然,所有这些都可以(并且经常)被击败。但它们比你在几天内要开发的任何东西都要强大得多。

根据定义,您从 StackOverflow 获得的任何特定方法都是无用的。唯一的混淆是它的细节是秘密的。如果你知道它是如何工作的,那么你就可以打败它。这就是它与加密的区别。即使攻击者知道整个算法,良好的加密也被设计为同样强大。这就是为什么混淆技术是专有的。他们几乎必须是。这意味着你要么(a)快速建造一个糟糕的,(b)花费大量时间和金钱建造一个稍微不那么糟糕的,或者(c)花费更多的钱来获得一个有点——可以从专门从事这些事情的供应商处获得。

(如果您在 StackOverflow 上提出这个问题,那么您绝对不可能自己构建一个好的程序。如果您自己没有破解过一些程序,那么您将无法构建一些停止的东西其他。)

于 2015-12-17T19:41:15.607 回答
3

这是不可能的。在大多数情况下,您可以做的就是破坏您的密钥、断词、拆分、混合、位移、异或等……以使其更难。但是没有什么能阻止一个非常积极的黑客对你的代码进行逆向工程并获得密钥。

这种情况的最佳解决方案称为白盒密码学: https ://en.wikipedia.org/wiki/Obfuscation#White_box_cryptography

这个想法是为您的加密生成个性化的二进制代码,decrypt(cypher, key)通过whitebox_decrypt(cypher)返回相同的结果来替换您的函数。第二个函数whitebox_decrypt不包含密钥本身,而是一个个性化算法,它带来与原始解密函数相同的结果。再说一遍:它可以像一切一样被逆向工程,但它是如此之难,以至于真的不会激励任何人这样做。

然而,这通常是非常昂贵的。我不知道有什么好东西是免费的。它非常用于保护 DRM 内容。

于 2015-12-17T19:40:52.577 回答
3

最好的混淆是在运行时计算密钥。例如,您可以在系统字符串上计算 SHA1 或 MD5,例如“Press any key...”或“Error loading file”。然后使用哈希作为 XXTEA 密钥。

于 2015-12-17T19:43:01.077 回答
1

这并不容易。我前段时间给出了类似的答案。如果您的情况允许,您可以使用用户输入的密码来加密密钥,并将加密的密钥存储在某处。

然后当您需要密钥时,您可以输入密码并解密并使用密钥。

这样,当您的密钥以加密形式保存时,您不必担心有人会知道它是什么。

于 2015-12-17T19:38:05.087 回答
1

加密密钥是一个秘密(这是一个技术术语,描述了只有应该知道的人才能知道的东西)。

在程序中存储一个秘密就像把它写在一张纸上,然后传真给世界上的每个人。

即这不再是秘密。

将密钥保密的方法是要求用户输入它,然后在执行解密后删除它的所有痕迹。

于 2015-12-17T19:41:12.950 回答