42

我想知道序列号生成器和验证器是如何工作的。我的目标是生成一个由仅由数字和字母组成的五部分的序列号。

我喜欢将编码作为一种爱好,并且不会称自己为专业程序员。但是,我对这些有趣的功能如何在技术上发挥作用以拓宽我的思维非常感兴趣。

感谢任何提示、经验或书面算法。

4

6 回答 6

25

Brandon Staggs wrote a good article on Implementing a Partial Serial Number Verification System. The examples are written in Delphi, but could be converted to other languages.

于 2009-04-03T19:44:15.423 回答
16

好吧,传统上序列号是序列号。所以生产线下的第一个例子有sn 0001,然后下一个是0002,下一个是0003。我认为大多数人都可以计算出这个算法。

我认为您实际上是在询问产品密钥,它使用与公钥消息签名类似的机制 - 产品密钥是加密值,程序有一个公钥允许它验证密钥是否有效,但只有软件供应商拥有“签署”产品密钥的密钥。关于数字签名的维基百科文章具有一般机制;唯一的附带条件是,对于用户输入的密钥,它必须比 PGP 的密钥短很多。

如果您被限制为非常短的序列号,那么它不太可能大到足以存储典型签名机制的结果,在这种情况下,只使用校验和的一些变体是很常见的。这具有易于逆向工程的缺点 - 它的安全性是因为算法是“秘密”的,而不是由于任何加密属性。每个产品都有自己的算法,它们通常很快就会被破解。

如果您有 5 个 5 个字符的块,则您有 36^25 个组合,大于 2^128,因此可以使用生成 128 位的标准数字签名算法之一,然后将该值转换为基数 36。

于 2009-04-03T19:18:54.907 回答
16

给自己一个公钥/私钥对。生成具有某些识别特征(例如可被 10000 整除)的序列号(10000、20000、30000、40000 ......)。使用您的私钥加密该号码。使用一些人类可读的系统( base 3264 )对该值进行编码,并将这些值分成组,以便人们更容易解析。在每次销售您的应用时分发编码的序列号。

在应用程序的某个地方,您隐藏了公钥。当用户输入编码的序列号时,首先将其解码回二进制。使用公钥对其进行解密。检查它是否能被 10000 整除。

困难的部分是在实现中——将公钥隐藏在应用程序中,这样就不能轻易替换它。选择一些您可以轻松识别但不会用完值的序列。 混淆应用程序,使某人无法轻易跳过整个检查。ETC...

于 2009-04-03T19:25:14.753 回答
5

A GUID ("Globally Unique Identifier") could be an easy way to solve this:

http://en.wikipedia.org/wiki/Globally_Unique_Identifier

Guids contain 16 bytes and are most commonly written in text as a sequence of hexadecimal digits such as:

3F2504E0-4F89-11D3-9A0C-0305E82C3301

And most programming languages should be able to generate a GUID with one of the available libraries.

于 2009-04-03T21:25:47.583 回答
3

您可以使用随机数生成器并将输出存储在数据库中。在激活请求的情况下,您只需检查序列号是否在数据库中并将序列号标记为“已使用”。

当然,这需要互联网连接,但不利于“一次购买,多次使用”的方法,如果需要支持,您可以重新激活该序列号以再次重新安装。

稍后编辑:您还必须使用加密和经过身份验证的连接进行 Internet 验证,例如 HTTPS 连接。

于 2009-04-03T19:43:01.463 回答
0

这里有很多信息:

http://en.wikipedia.org/wiki/Luhn_algorithm

http://en.wikipedia.org/wiki/Check_digit

于 2009-04-03T19:17:51.790 回答