如何将加密密钥存储在保险箱(C++)中



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

那么如何保证钥匙本身的安全呢?

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

任何看起来不是这样的东西都不再是加密或安全,而是某种形式的混淆。混乱(或"DRM")可能介于无用和有效之间,这取决于你将投入多少精力,以及对破解它有多大兴趣。随着新攻击的出现,你目前的预算是多少?你预期的攻击者有多老练?

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

如果你在想"好吧,我能在一个下午做些什么来阻止脚踝撕裂?"。将它与其他一些硬编码值异或。也许是比特移位或其他什么。它不会对任何关心它的人有太大帮助,但它会阻止最随意的攻击者,至少你不会在上面浪费大量的时间和金钱。

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

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

(如果你在StackOverflow上问这个问题,你绝对不可能自己构建一个好的程序。如果你自己还没有破解几个程序,你就无法构建一些东西来阻止其他程序。)

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

这是不可能的。在大多数情况下,你可以做的是弄乱你的密钥、插入单词、拆分、混合、移位、xor等……让它变得更难。但没有什么能阻止一个非常有动机的黑客对你的代码进行逆向工程并获得密钥。

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

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

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

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

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

这样,当你的密钥以加密的形式保存时,你就不怕有人会知道它是什么。

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

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

也就是说,这不再是秘密了。

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

相关内容

  • 没有找到相关文章