创造属于自己的注册码
--------------------------------------------------------------------------------
软件是个人智慧的结晶,凝结了自己的血汗。好不容易编写了一个属于自己的软件,希望让别人共享自己的成果,希望别人能记住自己的大名,更希望别人能对自己的软件提出宝贵意见,同时也希望使自己可以方便地提供最新版本的软件给对自己的软件十分关心的用户,当然也要防止盗版(因为我们反对盗版)。这一切都可以用用户注册的方式解决。 谈到注册,便立即联想到注册码,但如何生成注册码,对于软件的设计者是一个十分关键的问题。首先,注册码需要有随机性,即注册码的生成每一次都不一样。其次,注册码需要有特定性,即注册码对于同一用户是一样的或是功能相同的。再次,注册码要有保密性,即不易被他人查到并破解。基于注册码的这种特点,首先就需要有一种合理的设计思路。 笔者所用的是一种明码——密匙——暗码的加密思路。具体说来:当加密时,先取一字符串作为明码(原码),再另取一字符串作密匙,利用某种算法(如常用的伪随机数加密算法)将这两段字符串进行变换及运算,从而获得另一字符串(暗码),再将暗码和密匙用文件保存起来,这样就不怕别人偷看了;当解密时,将密匙和暗码利用另一种解密算法进行变换和运算,还原得到明码。 这种方法的关键在于利用密匙和暗码能还原唯一的明码,而对于不同的用户应该有不同的明码和密匙,且密匙必须是唯一的(对于同一用户)。如果以上几点无法满足,将无法生成有效的注册码,切记切记!!! 下面用以上思路来设计我们自己的注册码: 首先,选择原码。当然选择注册的用户的用户名(最好是英文)来做注册码的原码,是一个很好的办法,推荐用英文的理由是:英文字符串比中文字符串在运算中容易控制,且不易出错;其次,选择密匙,按照密匙对于不同用户是不同且唯一的原则,我强烈建议选择硬盘的序列号作为密匙。因为从理论上讲一个硬盘的序列号是唯一的,而且不同分区的序列号也不相同。所以,我用硬盘上的C驱动器分区的序列号来做密匙。因为C区好像每台电脑上都有(什么?你没有?我倒!!!);再次,就是选择暗码了。当然了,暗码应该是由你利用以上思路做成的注册器来生成,并作为注册码寄给用户的啦^-^,有关注册器的设计待会儿再说。 理解了以上的注册码生成的思想后,下面就利用Micosoft 的Visual Basic6.0来完成这项设计工作。需要利用几个Windows的API函数:GetVolumeInformation用以获得硬盘的序列号、GetPrivateProfileString、WritePrivateProfileString用来读写INI文件。对于以上三个API函数的使用不作介绍了,现将其声明如下: Private Declare Function GetVolumeInformation Lib ″kernel32″ Alias ″GetVolumeInformationA″ (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long Private Declare Function GetPrivateProfileString Lib ″kernel32″ Alias ″GetPrivateProfileStringA″ (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long Private Declare Function WritePrivateProfileString Lib ″kernel32″ Alias ″WritePrivateProfileStringA″ (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long 以上这些声明放在窗体的“通用”中即可。程序窗体的结构图大致见图1: 程序的代码如下: 通用图1的代码: 注释:定义ini文件的文件变量 Dim n As Integer Dim registry As String * 255 Dim inifilename As String 窗体中的代码: 注释:取得硬盘的序列号的函数 Function GetSerialNumber(strDrive As String) As Long Dim SerialNum As Long 注释:定义序列号 Dim Res As Long Dim Temp1 As String Dim Temp2 As String Temp1 = String$(255, Chr$(0)) Temp2 = String$(255, Chr$(0)) 注释:调用windows的API函数来获得硬盘序列号 Res = GetVolumeInformation(strDrive, Temp1, Len(Temp1), SerialNum, 0, 0, Temp2, Len(Temp2)) GetSerialNumber = SerialNum End Function Private Sub Command1_Click() Text3.Text = GetSerialNumber(″c:\″) 注释:取C分区的硬盘序列号 Dim test As New password 注释:定义新的加密类 Dim r_string As String Dim temp As String Dim registry_string As String registry_string = Text3.Text 注释:操作读写ini文件的API函数 Call WritePrivateProfileString(″mouselock″, ″registry″, registry_string, inifileName[1] [2] [3] 下一页
|