欢迎来到天天文库
浏览记录
ID:50743585
大小:47.00 KB
页数:9页
时间:2020-03-14
《VBA代码非常规加密.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、软件是个人智慧的结晶,凝结了自己的血汗。好不容易编写了一个属于自己的 软件,希望让别人共享自己的成果,希望别人能记住自己的大名,更希望别人能对 自己的软件提出宝贵意见,同时也希望使自己可以方便地提供最新版本的软件给对 自己的软件十分关心的用户,当然也要防止盗版(因为我们反对盗版)。这一切都 可以用用户注册的方式解决。 谈到注册,便立即联想到注册码,但如何生成注册码,对于软件的设计者是一个十 分关键的问题。首先,注册码需要有随机性,即注册码的生成每一次都不一样。其 次,注册码需要有特定性,即注册码对于同一用户是一样的或是功能相同的。再次 ,注册码要有保密性,即不易被他人查到并破
2、解。基于注册码的这种特点,首先就 需要有一种合理的设计思路。 笔者所用的是一种明码——密匙——暗码的加密思路。具体说来:当加密时,先取 一字符串作为明码(原码),再另取一字符串作密匙,利用某种算法(如常用的伪 随机数加密算法)将这两段字符串进行变换及运算,从而获得另一字符串(暗码) ,再将暗码和密匙用文件保存起来,这样就不怕别人偷看了;当解密时,将密匙和暗 码利用另一种解密算法进行变换和运算,还原得到明码。 这种方法的关键在于利用密匙和暗码能还原唯一的明码,而对于不同的用户应该有 不同的明码和密匙,且密匙必须是唯一的(对于同一用户)。如果以上几点无法满 足,将无法生成有效的注
3、册码,切记切记!!! 下面用以上思路来设计我们自己的注册码: 首先,选择原码。当然选择注册的用户的用户名(最好是英文)来做注册码的原码 ,是一个很好的办法,推荐用英文的理由是:英文字符串比中文字符串在运算中容 易控制,且不易出错;其次,选择密匙,按照密匙对于不同用户是不同且唯一的原 则,我强烈建议选择硬盘的序列号作为密匙。因为从理论上讲一个硬盘的序列号是 唯一的,而且不同分区的序列号也不相同。所以,我用硬盘上的C驱动器分区的序 列号来做密匙。因为C区好像每台电脑上都有(什么?你没有?我倒!!!);再 次,就是选择暗码了。当然了,暗码应该是由你利用以上思路做成的注册器来生成 ,
4、并作为注册码寄给用户的啦^-^,有关注册器的设计待会儿再说。 理解了以上的注册码生成的思想后,下面就利用Micosoft的VisualBasic6.0来完 成这项设计工作。需要利用几个Windows的API函数:GetVolumeInformation用以获 得硬盘的序列号、GetPrivateProfileString、WritePrivateProfileString用来读 写INI文件。对于以上三个API函数的使用不作介绍了,现将其声明如下: PrivateDeclareFunctionGetVolumeInformationLib″kernel32″Alias″ Ge
5、tVolumeInformationA″(ByVallpRootPathNameAsString,ByVal lpVolumeNameBufferAsString,ByValnVolumeNameSizeAsLong, lpVolumeSerialNumberAsLong,lpMaximumComponentLengthAsLong, lpFileSystemFlagsAsLong,ByVallpFileSystemNameBufferAsString,ByVal nFileSystemNameSizeAsLong)AsLongPrivateDeclareFunction G
6、etPrivateProfileStringLib″kernel32″Alias″ GetPrivateProfileStringA″(ByVallpApplicationNameAsString,ByVal lpKeyNameAsAny,ByVallpDefaultAsString,ByVallpReturnedStringAs String,ByValnSizeAsLong,ByVallpFileNameAsString)AsLong PrivateDeclareFunctionWritePrivateProfileStringLib″kernel32″ Alias″Wr
7、itePrivateProfileStringA″(ByVallpApplicationNameAsString, ByVallpKeyNameAsAny,ByVallpStringAsAny,ByVallpFileNameAs String)AsLong 以上这些声明放在窗体的“通用”中即可。程序窗体的结构图大致见图1: 程序的代码如下: 通用图1的代码: '定义ini文件的文件变量 DimnAsInteger DimregistryAsString*255 DiminifilenameAsStrin
此文档下载收益归作者所有