有时,隐藏二进制(可执行)文件中的字符串很有用。例如,从二进制文件中隐藏加密密钥是有意义的。
当我说“隐藏”时,我的意思是让字符串在编译后的二进制文件中更难找到。
例如,这段代码:
const char* encryptionKey = "My strong encryption key";
// Using the key
编译后生成一个可执行文件,其数据部分包含以下内容:
4D 79 20 73 74 72 6F 6E-67 20 65 6E 63 72 79 70 |My strong encryp|
74 69 6F 6E 20 6B 65 79 |tion key |
您可以看到我们的秘密字符串很容易找到和/或修改。
我可以隐藏字符串…
char encryptionKey[30];
int n = 0;
encryptionKey[n++] = 'M';
encryptionKey[n++] = 'y';
encryptionKey[n++] = ' ';
encryptionKey[n++] = 's';
encryptionKey[n++] = 't';
encryptionKey[n++] = 'r';
encryptionKey[n++] = 'o';
encryptionKey[n++] = 'n';
encryptionKey[n++] = 'g';
encryptionKey[n++] = ' ';
encryptionKey[n++] = 'e';
encryptionKey[n++] = 'n';
encryptionKey[n++] = 'c';
encryptionKey[n++] = 'r';
encryptionKey[n++] = 'y';
encryptionKey[n++] = 'p';
encryptionKey[n++] = 't';
encryptionKey[n++] = 'i';
encryptionKey[n++] = 'o';
encryptionKey[n++] = 'n';
encryptionKey[n++] = ' ';
encryptionKey[n++] = 'k';
encryptionKey[n++] = 'e';
encryptionKey[n++] = 'y';
…但这不是一个好方法。有更好的想法吗?
PS:我知道仅仅隐藏秘密对坚定的攻击者不起作用,但总比没有好……
另外,我知道不对称加密,但在这种情况下是不可接受的。我正在重构一个使用 Blowfish 加密并将加密数据传递给服务器的现有应用程序(服务器使用相同的密钥解密数据)。
我 无法 更改加密算法,因为我需要提供向后兼容性。我什至 无法 更改加密密钥。
原文由 Dmitriy 发布,翻译遵循 CC BY-SA 4.0 许可协议
我很抱歉回答太长了。
你的答案是绝对正确的,但问题是如何隐藏字符串并做得很好。
我是这样做的:
隐藏字符串.h:
HideString.h 中最棘手的一行是:
让我解释一下这条线。对于代码:
生成序列:
产生:
最后,
产生:
“我的强加密密钥”的数据如下所示:
非常感谢您的回答!