出于好奇:如何生成序列号?提示,算法?

Sim*_*mon 42 algorithm validation generator serial-number

我想知道序列号生成器和验证器如何工作.我的目标是生成一个序列号,其中包含五个部分,仅包括数字和字母.

我喜欢编码作为一种爱好,不会称自己为专业程序员.但是,我对这些有趣的功能如何在技术上工作以扩展我的想法非常感兴趣.

任何提示,经验或书面算法都表示赞赏.

stu*_*lly 25

Brandon Staggs写了一篇关于实现部分序列号验证系统的好文章.这些示例是用Delphi编写的,但可以转换为其他语言.


Pet*_*ham 16

好吧,传统的序列号是串行号码.因此,关闭生产线的第一个例子是sn 0001,然后下一个是0002,下一个是0003.我认为大多数人都可以计算出该算法.

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

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

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


Ecl*_*pse 16

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

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

困难的部分在于实现 - 将公钥隐藏在应用程序中,以便无法轻松替换.选择一些您可以轻松识别但不会耗尽值的序列. 混淆应用程序,以便有人不能轻易跳过整个检查.等等...

  • 大多数解密技术都可以让您通过解密算法运行任何值。对于大多数随机输入,您将只获得随机输出。对于许多算法,给定大量随机数据,有一个密钥可以将该字符串解密为任何其他字符串。 (2认同)

mjn*_*mjn 5

GUID(“全局唯一标识符”)可能是解决此问题的简单方法:

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

Guids 包含 16 个字节,最常以十六进制数字序列的形式写入文本,例如:

3F2504E0-4F89-11D3-9A0C-0305E82C3301
Run Code Online (Sandbox Code Playgroud)

大多数编程语言应该能够使用可用库之一生成 GUID。

  • “随机”一词未出现在规范中。然而,“串行”确实如此,这甚至与随机相反。那么你投反对票的原因是什么? (10认同)
  • 这有关系吗?当然,唯一的数字和随机的数字一样好。OP 没有指定随机。 (2认同)