我想在我的游戏中使用xxtea进行数据加密/解密.
以下是库使用的示例:
#include#include #include 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")可能介于无用和有效之间,具体取决于您将投入多少精力,而不是对它的兴趣程度.随着新攻击的出现,你的持续预算是什么?您预期的攻击者的复杂程度是多少?
Apple(作为一个例子)非常严格地控制他们的硬件,固件和操作系统,并且有一个团队完全致力于不断改进它.新版本发布后,iPhone通常会在几周到几个月内越狱.你应该考虑一个有吸引力的目标的最佳案例场景.
如果你想"好吧,我可以在一个下午放在一起会阻止踝关节咬伤吗?" 做任何想到的事情.将其与其他一些硬编码值进行异或.也许bithift它或其他什么.它对任何关心的人都没有多大帮助,但它会阻止最随意的攻击者,至少你不会浪费大量的时间和金钱.
从中加速,查看平台的内置解决方案.OS帮助是一个很大的帮助.特别是,请查看Windows 上的SLP服务.如果您通过Mac App Store工作,Mac会提供许可执行.或者你可以看看像eSellerate这样拥有自己专有解决方案的商业供应商.SafeNet有几种产品.当然,所有这些都可以(并且经常被)击败.但它们比你几天内发展的任何东西都强大得多.
根据定义,您从StackOverflow中获得的任何特定方法都是无用的.混淆的唯一原因是它的细节是秘密的.如果你知道它是如何工作的,那么你可以击败它.这就是它与加密的区别.即使攻击者知道整个算法,良好的加密设计也同样强大.这就是为什么混淆技术是专有的.他们几乎必须这样做.这意味着你要么(a)快速建立一个糟糕的,(b)花费大量的时间和金钱建立一个稍微糟糕的,或(c)花更多的钱来获得一些 - 可以从专门从事这些事情的供应商那里得到的.
(如果你在StackOverflow上问这个问题,你绝对不可能自己建立一个好的.如果你自己没有破解过一些程序,你就无法建立一些东西来停止其他.)