VBA代码非常规加密.doc_第1页
VBA代码非常规加密.doc_第2页
VBA代码非常规加密.doc_第3页
VBA代码非常规加密.doc_第4页
VBA代码非常规加密.doc_第5页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件是个人智慧的结晶,凝结了自己的血汗。好不容易编写了一个属于自己的软件,希望让别人共享自己的成果,希望别人能记住自己的大名,更希望别人能对自己的软件提出宝贵意见,同时也希望使自己可以方便地提供最新版本的软件给对自己的软件十分关心的用户,当然也要防止盗版(因为我们反对盗版)。这一切都可以用用户注册的方式解决。 谈到注册,便立即联想到注册码,但如何生成注册码,对于软件的设计者是一个十分关键的问题。首先,注册码需要有随机性,即注册码的生成每一次都不一样。其次,注册码需要有特定性,即注册码对于同一用户是一样的或是功能相同的。再次,注册码要有保密性,即不易被他人查到并破解。基于注册码的这种特点,首先就需要有一种合理的设计思路。 笔者所用的是一种明码密匙暗码的加密思路。具体说来:当加密时,先取一字符串作为明码(原码),再另取一字符串作密匙,利用某种算法(如常用的伪随机数加密算法)将这两段字符串进行变换及运算,从而获得另一字符串(暗码),再将暗码和密匙用文件保存起来,这样就不怕别人偷看了;当解密时,将密匙和暗码利用另一种解密算法进行变换和运算,还原得到明码。 这种方法的关键在于利用密匙和暗码能还原唯一的明码,而对于不同的用户应该有不同的明码和密匙,且密匙必须是唯一的(对于同一用户)。如果以上几点无法满足,将无法生成有效的注册码,切记切记!下面用以上思路来设计我们自己的注册码: 首先,选择原码。当然选择注册的用户的用户名(最好是英文)来做注册码的原码,是一个很好的办法,推荐用英文的理由是:英文字符串比中文字符串在运算中容易控制,且不易出错;其次,选择密匙,按照密匙对于不同用户是不同且唯一的原则,我强烈建议选择硬盘的序列号作为密匙。因为从理论上讲一个硬盘的序列号是唯一的,而且不同分区的序列号也不相同。所以,我用硬盘上的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, ByVallpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long,lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long,lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByValnFileSystemNameSize As Long) As Long Private Declare FunctionGetPrivateProfileString Lib kernel32 Alias GetPrivateProfileStringA (ByVal lpApplicationName As String, ByVallpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString AsString, ByVal nSize As Long, ByVal lpFileName As String) As LongPrivate Declare Function WritePrivateProfileString Lib kernel32Alias WritePrivateProfileStringA (ByVal lpApplicationName As String,ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName AsString) As Long以上这些声明放在窗体的“通用”中即可。程序窗体的结构图大致见图1:程序的代码如下:通用图1的代码:定义ini文件的文件变量Dim n As IntegerDim registry As String 255Dim inifilename As String窗体中的代码:取得硬盘的序列号的函数Function GetSerialNumber(strDrive As String) As LongDim SerialNum As Long 定义序列号Dim Res As LongDim Temp1 As StringDim Temp2 As StringTemp1 = String(255, Chr(0)Temp2 = String(255, Chr(0)调用windows的API函数来获得硬盘序列号Res = GetVolumeInformation(strDrive, Temp1,Len(Temp1), SerialNum, 0, 0, Temp2, Len(Temp2)GetSerialNumber = SerialNumEnd FunctionPrivate Sub Command1_Click()Text3.Text = GetSerialNumber(c:) 取C分区的硬盘序列号Dim test As New password 定义新的加密类Dim r_string As StringDim temp As StringDim registry_string As Stringregistry_string = Text3.Text操作读写ini文件的API函数Call WritePrivateProfileString(mouselock, registry,registry_string, inifileName)r_string = Text2.Texttemp = test.crypt(D, registry_string, r_string)If Text1.Text = ThenMsgBox 必须输入用户名!, , 注册EndEnd IfIf temp (Text1.Text i) Then 设置区分码MsgBox 你应该找作者注册,共享软件凝聚着作者的血和汗., , 注册ElseMsgBox 谢谢使用本软件!, , 注册Dim registry_string1 As Stringregistry_string1 = tttt 加入注册的标记并保存于ini文件中,可以自己设定调用Windows的API函数来读写ini文件Call WritePrivateProfileString(mouselock, reg, registry_string1,inifileName)Form1.Show 调用自己的应用程序Unload Me 关闭注册程序End IfText3.Visible = TrueLabel4.Visible = TrueLabel5.Visible = TrueLabel6.Visible = TrueEnd SubPrivate Sub Command2_Click()Form1.Show 运行你的共享软件主程序Unload Me 关闭注册程序End SubPrivate Sub Form_Load()Form2.Caption = Microsoft Visual Basic6.0 此处可以改为你的共享软件名Text3.Visible = FalseLabel4.Visible = FalseLabel5.Visible = FalseLabel6.Visible = FalseEnd Sub还需要加一个password的类模块,在其中利用的是伪随机数的加密算法来完成加密和解密转换,因涉及到算法,其原理不再详述,仅列其代码如下:Option ExplicitFunction crypt(Action As String, Key As String, Src As String) AsStringDim Count As Integer, KeyPos As Integer, KeyLen As Integer, SrcAsc AsInteger, dest As String, offset As Integer, TmpSrcAsc, SrcPosKeyLen = Len(Key)If Action = E ThenRandomizeoffset = (Rnd 10000 Mod 255) 1dest = Hex(offset)If Len(dest) = 1 Thendest = 0 destEnd IfFor SrcPos = 1 To Len(Src)SrcAsc = (Asc(Mid(Src, SrcPos, 1) offset) Mod 255If KeyPos KeyLen Then KeyPos = KeyPos 1 Else KeyPos = 1SrcAsc = SrcAsc Xor Asc(Mid(Key, KeyPos, 1)dest = dest Format(Hex(SrcAsc),)offset = SrcAscNextElseIf Action = D Thenoffset = Val(H Left(Src, 2)For SrcPos = 3 To Len(Src) Step 2SrcAsc = Val(H Trim(Mid(Src, SrcPos, 2)If KeyPos KeyLen Then KeyPos = KeyPos 1 Else KeyPos = 1TmpSrcAsc = SrcAsc Xor Asc(Mid(Key, KeyPos, 1)If TmpSrcAsc = offset ThenTmpSrcAsc = 255 TmpSrcAsc offsetElseTmpSrcAsc = TmpSrcAsc offsetEnd Ifdest = dest Chr(TmpSrcAsc)offset = SrcAscNextEnd Ifcrypt = destEnd Function好啦,按F5运行你的注册程序,在点击了“注册”按钮后就出现如图2所示的窗体:还需添加一个ini文件到程序的相对目录下,且字段如下:mouselockregistry=757931525reg=好了,一个软件的注册的部分基本完工了,你可以自己设置“运行”按钮中的的代码来控制未注册用户的使用权限,如:使用次数、使用天数、以及用户注册的要求(当然我们都喜欢免费共享软件)等等。当然也可以不加以限制,只是在每次运行软件时会弹出一个注册窗体而已,就如著名的软件ACDSee一样。还有一点须加以注意:在窗体代码中,有一行代码如下:If temp (Text1.Text i) Then 设置区分码它是用来设置区分码的,因为这个程序的加密算法并不是像微软的加密算法那样无人可知,它不过是一种普通的加密算法,但加上了区分码后它的加密性能便提高了许多,如同锁上加锁一样。分区码“i”可以由自己随意去添加,这样即使别人知道了你的算法也无法破译你的注册码,因为整个加密过程已经由:(明码密匙)暗码,变为:(明码区分码密匙)暗码;而解密过程也相应的由:(暗码密匙)明码,变为:(暗码密匙)(明码区分码)。当然,你也可以对区分码来一个加密,不过这样一层层的加密下去是永无止境的,还是适可为止的好。注册程序搞定后当然还需要一个注册器啦,用来向你的用户提供注册码嘛!其设计的窗体结构如图3:在窗体和“生成”按钮中添加如下代码:Private Sub Command1_Click()Dim ppp As New password 定义一个型的类定义明码、暗码、密匙、及区分码Dim D_string As StringDim E_string As StringDim Qf_string As StringDim MC_string As StringD_string = Text1.TextQf_string = Text2.TextMC_string = Text3.Text加密If Text2.Text = ThenE_string = ppp.crypt(E, MCstring, D_string)ElseD_string = D_string Qf_stringE_string = ppp.crypt(E, MC_string, D_string)End IfText4.Text = E_stringEnd SubPrivate Sub Form_Load()Form1.Caption =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论