【发布时间】:2011-10-03 14:59:58
【问题描述】:
我正在从事一个涉及为硬件实现编写低级 C 软件的项目。我们希望为我们的设备实施一项新功能,我们的用户可以在购买关联的许可证密钥时解锁该功能。
所需的实施步骤很简单。用户打电话给我们,他们请求该功能并向我们发送付款。接下来,我们通过电子邮件向他们发送产品密钥,他们将其输入硬件以解锁该功能。
我们的硬件没有连接到互联网。因此,必须以这样一种方式实施算法,即可以从服务器和设备内部生成这些密钥。密钥的种子可以从硬件序列号派生,这两个位置都可用。
我需要一个简单的算法,它可以采用连续数字并生成 16-20 个字母数字字符的唯一、非连续键。
更新
SHA-1 看起来是最好的方法。但是,我从 SHA-1 密钥的示例输出中看到的是它们很长(40 个字符)。如果我使用 40 char 键并截断除最后 16 个字符之外的所有字符,我会获得足够的结果吗?
【问题讨论】:
-
如果您只使用 16 个 base-64 字符,那么就是 96 位。如果您生成 281474976710656 个序列号(即 2^36 个键 - birthday paradox 50% 界限),您可能会发生冲突(读取:非唯一序列号)
-
为什么输入必须是序号?
-
@ThomasM.DuBuisson 如果他们以每个 2 美元的价格出售 2^36 个许可证,那就是新西兰的 GDP。我认为它们在一段时间内是安全的。
-
@NickJohnson 是的,这就是我的观点;-)。尽管如此,如果他们想要更安全,他们可以在 CNT 模式下使用 BlowFish(或仅 3DES)来生成 64 位值(11 个 base-64 字符),这些值在数学上肯定是唯一的,计数为 2^64。跨度>
-
@NickJ,输入的是设备序列号,在设备制造时顺序生成。这些序列号存储在数据库中,因此客户硬件和我为办公室创建的任何密钥生成器都可以访问种子。
标签: c algorithm security copy-protection