天天看点

.NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用1.基本功能介绍2.核心的SKGL源码分析3.SKGL核心功能调用5.资源

<b>阅读目录</b>

<a href="http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_SKGL_Key_Generate.html#_label0">1.基本功能介绍</a>

<a href="http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_SKGL_Key_Generate.html#_label1">2.核心的SKGL源码分析</a>

<a href="http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_SKGL_Key_Generate.html#_label2">3.SKGL核心功能调用</a>

<a href="http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_SKGL_Key_Generate.html#_label3">5.资源</a>

看看界面所演示的功能截图:

.NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用1.基本功能介绍2.核心的SKGL源码分析3.SKGL核心功能调用5.资源

 如果选择了锁定机器,就只能在指定机器码上的电脑用了,下面是验证序列号的截图:

.NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用1.基本功能介绍2.核心的SKGL源码分析3.SKGL核心功能调用5.资源

    下面来简单看看核心的SKGL源代码以及使用情况。

    SerialKeyConfiguration是序列号配置类,继承自BaseConfiguration抽象配置基类。其主要作用是存储机器码,以及生成序列号说需要的一些特征字段。目前配置里面默认有8个特征配置项,通过选择不同的配置特征项,可以更加灵活生成序列号加密方案。SerialKeyConfiguration作为核心类,在序列号的生成和验证中都有用到。

    Generate类也是继承BaseConfiguration的类,作用是根据配置类生成说需要的序列号。里面有密钥的设置,以及生成序列号的核心函数doKey,里面的逻辑也不是很复杂,主要是根据需要生成的类型,如时间限制,是否有机器码来进行判断,然后调用内部方法来生成序列号。

    Validate类也是继承BaseConfiguration类,因为验证是一个解密的逆向过程,也需要用到配置相关的项。类的主要作用是验证序列号是否合法,是否过期等功能,也是要调用核心的内部类进行解密。总体来说思路是很简单的,关于具体的实现过程,暂时没必要深究,可以查看源代码进行详细的理解。 

     这个组件一个是核心类,1个是非常成熟可以直接使用的UI界面,UI界面的代码是VB.NET,很简单。这里我将演示几种使用方法,来调用核心的SKGL组件来完成序列号的生成和解密功能。使用之前添加引用,新建项目这些东西就不必说了。直接进入主题吧。

    创建key使用Generate类,主要有3个重载方法,下面的例子很简单的进行了演示,看代码注释即可理解。

1

2

3

4

5

6

7

8

9

10

<code>//1.创建key生成对象</code>

<code>var</code> <code>CreateAKey = </code><code>new</code> <code>Generate();</code>

<code>//2.设置密钥</code>

<code>CreateAKey.secretPhase = </code><code>"testdemo"</code><code>;</code>

<code>//3.生成key,30天时间限制</code>

<code>var</code> <code>key1 = CreateAKey.doKey(30);</code>

<code>//4.还可以设置机器码以及设置起始日期,机器码是1个5位Int数</code>

<code>var</code> <code>key2 = CreateAKey.doKey(30, 61125);</code>

<code>Console.WriteLine(</code><code>"Key 1 :"</code><code>+key1);</code>

<code>Console.WriteLine(</code><code>"Key 2 :"</code><code>+key2);</code>

    结果如下,第2个key使用了本机的机器码,我们在下面的代码中将进行验证:

<code>Key 1 :MFZIL-NSTBB-DLLXZ-RFHYV</code>

<code>Key 2 :JPVFS-BLQOQ-FLFTN-HXLFW</code>

    验证key是一个逆向过程,使用Validate类,我们使用上面代码生成的key和配置来进行验证。代码如下,具体看注释:

11

12

13

14

15

16

<code>//1.创建key验证对象</code>

<code>var</code> <code>ValidateAKey = </code><code>new</code> <code>Validate();</code>

<code>ValidateAKey.secretPhase = </code><code>"testdemo"</code><code>;</code>

<code>//3.设置要验证的key,注意,这是上面代码生成的key1内容</code>

<code>ValidateAKey.Key = </code><code>"MFZIL-NSTBB-DLLXZ-RFHYV"</code><code>;           </code>

<code>//4.直接验证是否被修改</code>

<code>Console.WriteLine(</code><code>"Key 1 验证:{0}"</code> <code>, ValidateAKey.IsValid);</code>

<code>//5.检查key是否过期,false说明在有效期内</code>

<code>Console.WriteLine(</code><code>"Key 1 有效期:{0}"</code><code>, ValidateAKey.IsExpired);</code>

<code>//同样验证Key2</code>

<code>ValidateAKey.Key = </code><code>"JPVFS-BLQOQ-FLFTN-HXLFW"</code><code>;</code>

<code>//检查密钥是否被修改</code>

<code>Console.WriteLine(</code><code>"Key 2 验证:{0}"</code><code>, ValidateAKey.IsValid);</code>

<code>//我电脑的实际机器码是 61125,所以结果是不一样的</code>

<code>Console.WriteLine(</code><code>"Key 2 是否和当前机器的机器码一样:{0}"</code><code>, ValidateAKey.IsOnRightMachine);</code>

结果如下:

<code>Key 1 验证:True</code>

<code>Key 1 有效期:False</code>

<code>Key 2 验证:True</code>

<code>Key 2 是否和当前机器的机器码一样:False</code>

    如上图可以验证密钥是否修改,以及是否过期,以及对应的机器码是否和本机一样。在实际使用中,如果要锁定机器,必须先获得机器码,然后生成对应的才行。

    简单的说,设置这个属性,可以让你定义密钥的使用在不同的环境或者版本中。例如应用程序发布后,可能会有试用版,个人版,专业版等等不同版本。实际使用的时候就可以拿出其中的位来设置是否是某一个版本,或者某一个功能类型。SKGL在实际的验证中,也会对这些特征进行验证,从而根据序列号的类型来使用对应的功能。下面我们使用1个简单的例子,演示如何使用这个特征码属性。这个属性需要在生成或者验证的配置对象中进行设置:

    比如8个特征码,选择其中1个设置是否为时间限制的试用版。如下面代码和注释:

<code>//配置对象</code>

<code>SerialKeyConfiguration skc = </code><code>new</code> <code>SerialKeyConfiguration(); </code>

<code>//生成key对象</code>

<code>Generate CreateAKey = </code><code>new</code> <code>Generate(skc);</code>

<code>//</code>

<code>string</code> <code>trialKey = CreateAKey.doKey(30); </code><code>//试用版30天期限</code>

<code>//创建1个有时间限制的试用版</code>

<code>skc.Features = </code><code>new</code> <code>bool</code><code>[8] { </code><code>true</code><code>, </code><code>false</code><code>, </code><code>false</code><code>, </code><code>false</code><code>,</code><code>false</code><code>, </code><code>false</code><code>,</code><code>false</code> <code>,</code><code>false</code> <code>};</code>

<code>// 当然这里的版本可以自定义,只要你自己认识就行了</code>

    这里设置的位置的意义,在自己的程序中你认识就行了。

    下面是对应的一个解密后验证功能的代码例子:

17

18

19

20

21

22

23

<code>SerialKeyConfiguration skc = </code><code>new</code> <code>SerialKeyConfiguration();</code>

<code>//验证对象</code>

<code>Validate ValidateAKey = </code><code>new</code> <code>Validate(skc);</code>

<code>ValidateAKey.Key = textBox4.Text; </code><code>// 对比输入的序列号</code>

<code>{</code>

<code>    </code><code>if</code> <code>(ValidateAKey.IsValid)</code><code>//如果没有被修改</code>

<code>    </code><code>{   </code><code>//验证特征码是否符合某些版本的特征</code>

<code>        </code><code>if</code> <code>(ValidateAKey.Features[0] == </code><code>false</code><code>)</code>

<code>        </code><code>{</code>

<code>            </code><code>//TODO:</code>

<code>        </code><code>}</code>

<code>        </code><code>if</code> <code>(ValidateAKey.Features[0] == </code><code>true</code><code>)</code>

<code>        </code><code>//TODO:</code>

<code>     </code><code>}</code>

<code>    </code><code>else</code>

<code>    </code><code>{</code>

<code>    </code><code>}</code>

<code>}</code>

    总的来说,这个组件基本功能都满足了,非常值得一用。至于思路,大家可以做成网站验证或者生成注册码的。自己写一个其实也挺费劲的,在一般的软件中是足够了。

    源码不复杂,在学习过程中,就顺便把它给翻译了。所以这里奉献我翻译后的源代码以及Demo,以及制作的帮助文档。上个图:

.NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用1.基本功能介绍2.核心的SKGL源码分析3.SKGL核心功能调用5.资源

本文转自叶小钗 h数据之巅博客园博客,原文链接:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_SKGL_Key_Generate.html,如需转载请自行联系原作者