📄 注册码算法问题~!!.htm
字号:
'髡夔ㄩ蔚坋輛秶杅趼 oData 蛌遙峈匐輛秶杅趼 <BR>
Dim k As Integer <BR>
Dim oData As Long
<BR> <BR>
oData = SerialNumber <BR>
<BR> Do While
oData >= 8 <BR>
k = oData Mod
8 <BR>
GetSerial = k & GetSerial
<BR>
oData = oData \ 8 <BR>
Loop <BR> If
oData > 0 Then GetSerial =
oData & GetSerial <BR>End Function
<BR> <BR>Private Function CheckRegKey(vData
As String) As Boolean <BR>
'髡夔ㄩ潰桄怀&#63541;腔蛁聊鎢岆瘁淏&#63489;ㄛTrue
=> 淏&#63489;ㄛFalse => 囮啖
<BR> '&#63220;笢 vData
峈蛁聊鎢 <BR> <BR>
If UCase(BreakRegKey(vData)) =
UCase(Hex(SerialNumber)) Then <BR>
CheckRegKey =
True <BR> Else
<BR>
CheckRegKey = False <BR>
End If <BR>Quit_Check: <BR>
Exit Function <BR>End Function
<BR> <BR>Private Function SerialNumber()
As Long <BR>
'髡夔ㄩ跦擂茞攫煦&#63397;陓洘鳳腕蛁聊陓洘(翋猁岆?煦&#63397;)
<BR> Dim lpVolumeNameBuffer
As String * 128 <BR>
Dim lpVolumeSerialNumber As Long
<BR> Dim
lpMaximumComponentLength As Long <BR>
Dim lpFileSystemFlags As Long
<BR> Dim
lpFileSystemNameBuffer As String <BR>
Dim nFileSystemNameSize As
Long <BR> <BR>
GetVolumeInformation "C:\",
lpVolumeNameBuffer, Len(lpVolumeNameBuffer),
lpVolumeSerialNumber, _ <BR>
lpMaximumComponentLength,
lpFileSystemFlags, lpFileSystemNameBuffer, _
<BR>
nFileSystemNameSize <BR>
<BR> SerialNumber =
lpVolumeSerialNumber <BR>End Function
<BR> <BR>Private Function BreakRegKey(mstrKey
As String) As String <BR>
'髡夔ㄩ湖汃蛁聊鎢ㄛ遜埻峈茞攫煦&#63397;?腔橙梓 <BR>
'mstrKey 峈蛁聊鎢 <BR>
Dim sKey As String, iKey
As Double <BR> Dim
lKey As Integer, iLoop As
Integer <BR> <BR>
'&#63471;裁熬瘍 "-" <BR>
While InStr(1, mstrKey, "-")
> 0 <BR>
lKey = InStr(1, mstrKey,
"-") <BR>
mstrKey = Left(mstrKey, lKey -
1) & Right(mstrKey, Len(mstrKey) -
lKey) <BR> Wend
<BR> <BR>
lKey = Len(mstrKey) - 1
<BR> '遜埻峈坋輛秶杅趼 <BR>
For iLoop = lKey To
0 Step -1 <BR>
sKey = Mid(mstrKey,
lKey - iLoop + 1, 1)
<BR> If
IsNumeric(sKey) Then <BR>
iKey
= iKey + CInt(sKey) * 16 ^
iLoop <BR>
Else <BR>
iKey =
iKey + (Asc(UCase(sKey)) - 55) *
16 ^ iLoop <BR>
End If <BR>
Next <BR>
<BR> sKey = ""
<BR> mstrKey =
CStr(iKey) <BR> '遜埻峈坋鞠輛秶趼睫揹
<BR> Do While
CDbl(mstrKey) > 35 <BR>
iKey =
CDbl(mstrKey) / 36 <BR>
<BR>
lKey = InStr(1,
CStr(iKey), ".") <BR>
If lKey > 0
Then <BR>
mstrKey =
Left(CStr(iKey), lKey - 1) <BR>
iKey = Round(CDbl("0." &
Right(CStr(iKey), Len(CStr(iKey)) - lKey))
* 36) <BR>
Else <BR>
mstrKey
= CStr(iKey) <BR>
iKey =
0 <BR>
End If <BR>
<BR>
If iKey > 9 Then
<BR>
sKey = Chr(iKey +
55) & sKey <BR>
Else <BR>
sKey = iKey & sKey
<BR> End
If <BR> Loop <BR>
If CDbl(mstrKey) > 9
Then <BR>
sKey = Chr(CDbl(mstrKey) + 55)
& sKey <BR> Else
<BR>
sKey = mstrKey & sKey
<BR> End If <BR>
<BR>
BreakRegKey = sKey <BR>End Function
<BR> <BR>---------------------------------------------------------------
<BR> <BR>软件是个人智慧的结晶,凝结了自己的血汗。好不容易编写了一个属于自己的软件,希望让别人共享自己的成果,希望别人能记住自己的大名,更希望别人能对自己的软件提出宝贵意见,同时也希望使自己可以方便地提供最新版本的软件给对自己的软件十分关心的用户,当然也要防止盗版(因为我们反对盗版)。这一切都可以用用户注册的方式解决。
<BR>谈到注册,便立即联想到注册码,但如何生成注册码,对于软件的设计者是一个十分关键的问题。首先,注册码需要有随机性,即注册码的生成每一次都不一样。其次,注册码需要有特定性,即注册码对于同一用户是一样的或是功能相同的。再次,注册码要有保密性,即不易被他人查到并破解。基于注册码的这种特点,首先就需要有一种合理的设计思路。
<BR>笔者所用的是一种明码——密匙——暗码的加密思路。具体说来:当加密时,先取一字符串作为明码(原码),再另取一字符串作密匙,利用某种算法(如常用的伪随机数加密算法)将这两段字符串进行变换及运算,从而获得另一字符串(暗码),再将暗码和密匙用文件保存起来,这样就不怕别人偷看了;当解密时,将密匙和暗码利用另一种解密算法进行变换和运算,还原得到明码。
<BR>这种方法的关键在于利用密匙和暗码能还原唯一的明码,而对于不同的用户应该有不同的明码和密匙,且密匙必须是唯一的(对于同一用户)。如果以上几点无法满足,将无法生成有效的注册码,切记切记!!!
<BR>下面用以上思路来设计我们自己的注册码:
<BR>首先,选择原码。当然选择注册的用户的用户名(最好是英文)来做注册码的原码,是一个很好的办法,推荐用英文的理由是:英文字符串比中文字符串在运算中容易控制,且不易出错;其次,选择密匙,按照密匙对于不同用户是不同且唯一的原则,我强烈建议选择硬盘的序列号作为密匙。因为从理论上讲一个硬盘的序列号是唯一的,而且不同分区的序列号也不相同。所以,我用硬盘上的C驱动器分区的序列号来做密匙。因为C区好像每台电脑上都有(什么?你没有?我倒!!!);再次,就是选择暗码了。当然了,暗码应该是由你利用以上思路做成的注册器来生成,并作为注册码寄给用户的啦^-^,有关注册器的设计待会儿再说。
<BR>理解了以上的注册码生成的思想后,下面就利用Micosoft 的Visual
Basic6.0来完成这项设计工作。需要利用几个Windows的API函数:GetVolumeInformation用以获得硬盘的序列号、GetPrivateProfileString、WritePrivateProfileString用来读写INI文件。对于以上三个API函数的使用不作介绍了,现将其声明如下:
<BR>Private Declare Function
GetVolumeInformation Lib ″kernel32″ Alias
″GetVolumeInformationA″ (ByVal lpRootPathName
As String, ByVal lpVolumeNameBuffer As
String, ByVal nVolumeNameSize As Long,
lpVolumeSerialNumber As Long,
lpMaximumComponentLength<BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<HR noShade SIZE=1 width=770>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
<TBODY>
<TR align=middle>
<TD height=10 vAlign=bottom><A
href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A
href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A
href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
border=0 height=48 src="注册码算法问题~!!.files/biaoshi.gif" width=40></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -