如何在安全(C ++)中存储加密密钥?

时间:2015-12-17 19:34:06

标签: c++ encryption xxtea

我想在游戏中使用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;
}

如何保持钥匙本身安全?

5 个答案:

答案 0 :(得分:6)

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

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

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

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

从此开始,查看平台的内置解决方案。 OS帮助是一个很大的帮助。特别是,请查看Windows上的SLP Services。如果您通过Mac App Store工作,Mac会提供许可执行。或者你可以看看像eSellerate这样拥有自己专有解决方案的商业供应商。 SafeNet has several products。当然,所有这些都可以(并且经常被)击败。但它们比你几天内发展的任何东西都强大得多。

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

(如果你在StackOverflow上提出这个问题,你绝对不可能自己建立一个好的。如果你自己没有破解过一些程序,你就无法构建什么阻止他人。)

答案 1 :(得分:2)

无法完成。对于大多数情况,你可以做的是破坏你的钥匙,打破单词,分裂,混合,比特移位,xor等等......让它变得更难。但没有什么能阻止一个非常有动力的黑客对你的代码进行逆向工程并获得密钥。

此案例的最佳解决方案称为白盒密码术: https://en.wikipedia.org/wiki/Obfuscation#White_box_cryptography

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

然而,这通常非常昂贵。我不会免费知道任何好事。它非常用于保护DRM内容。

答案 2 :(得分:1)

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

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

这样,当您的密钥以加密形式保存时,您不会害怕有人会了解它是什么。

答案 3 :(得分:1)

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

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

即。这不再是秘密了。

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

答案 4 :(得分:1)

最好的混淆是在运行时计算密钥。例如。您可以在系统字符串上计算SHA1或MD5,例如“按任意键...”或“加载文件时出错”。然后使用散列作为XXTEA密钥。