发信人: williamlong(蓝色月光)
整理人: williamlong(2002-07-10 20:01:57), 站内信件
|
本文提供了一种简单可靠的低成本的加密方法及其远程注册技巧。其基本原理是通过测试本地网卡号实现应用软件的加密与注册。
问题提出
关于软件盗版问题,国家有关部门已采取了多种方式进行打击,但是,由于种种原因软件盗版现象却还客观存在着,为了捍卫软件开发者的利益和知识的尊严,不断涌现了各种各样的加密技术。
目前软件加密行业普遍采用的加密方法主要分为两大类:软加密和硬加密。
软加密是指不依靠特殊硬件来实现对软件的加密保护。它的最大优势在于极低的加密成本。目前主要有密码法、计算机硬件校验法、软件自校验法、钥匙盘法等加密方式。
硬加密是指利用硬件和软件相结合来实现软件的加密,采用硬加密的软件执行时需和相应的硬件交换数据,若没有相应的硬件,加密后的软件将无法执行。其典型产品包括软件狗和加密卡等。硬加密因为具有软加密不可比拟的优势,如加密强度高、加密性能好、加密方式灵活等,正在逐渐成为许多优秀软件开发商的加密首选。
随着互联网的发展,解密技术也正以更快的速度传播,这给软件加密带来了更大的挑战,同时各种加密方案本身也存在着这样那样的不足,如:加密的简易性、可靠性、兼容性、透明性以及加密成本等问题,这就需要不断推出新的加密方案,改进加密方式。为此本文提供了一种简单可行的加密方法,即在不额外增加硬件的情况下,通过测试微机基本配件网卡实现应用软件加密。
加密原理
随着Internet的发展,网卡必将成为电脑不可缺少的基本配件,利用网卡加密不会增加加密成本,同时网卡本身开发已很成熟,不会产生加密时的不稳定性,而且每一块网卡其内部都有一个唯一的生产序列号。本文介绍的加密方法正是利用了网卡的这些特点。
在介绍加密原理之前,要特别指出的是在本加密方法中要选取两种字符串加密算法: 加密算法1与加密算法2。加密算法1用于把用户网卡号加密成用户授权号,加密算法2用于把用户授权号加密成用户注册密码。
应用软件的加密原理如图1所示。
图1
对于某一应用软件,如果采用本文介绍的方法进行加密,必须提供以下几个接口模块:
● 网卡侦测模块
此模块用于读取网卡号。
● 注册状态监视模块
此模块用于判断该用户是不是已注册的合法用户。如果是合法用户,则应用软件正常运行,否则激活注册接口模块提醒用户注册。
● 注册接口模块
此模块用于将网卡侦测模块读取的网卡号按加密算法1加密成用户授权号。同时,向用户提供注册接口。如图2所示。
图2
● 远程注册模块
此模块主要功能是根据用户授权号产生用户注册密码。该模块独立于应用软件之外,不随应用软件一起发布,而是留在开发者端,用于产生用户注册密码。如图3所示。
图3
经加密后的应用软件如果未经注册将不能正常运行,具体加密流程如下:
1. 应用软件执行,网卡侦测模块启动并读取网卡号;
2. 网卡侦测模块把读取的网卡号传送给注册状态监视模块,注册状态监视模块根据获得的网卡号与数据库中的注册标识进行比较,判断该用户是否是已注册的合法用户。如果是合法用户,则应用软件正常运行,否则激活注册接口模块提醒用户注册;
3. 被激活的注册接口模块根据网卡侦测模块提供的网卡号,按加密算法1加密成用户授权号;
4. 用户把用户授权号通过电话、传真或E-mail发送给开发者;
5. 开发者收到用户发送来的授权号按加密算法2进行加密,得出用户注册密码并发送给用户;
6. 用户收到开发者发送来的注册密码,通过应用软件中的注册接口模块注册应用软件。
实 例
以下将通过一个具体实例,来向读者介绍上述加密方法的实现过程。实例在Power Builder 6.5下调试通过。
一、用户主窗口程序
在应用软件主程序中添加网卡侦测程序和注册状态监视程序。
1. 打开加密程序主窗口。
2. 在Declare下的Global External Functions 中加入以下语句,定义API函数,用于读取网卡号:
FUNCTION int fnNet(ref string cardno) LIBRARY “net.dll”
//net.dll内包含网卡读取函数
3. 自定义函数。选择Declare下的Window Founctions,出现select function in window界面,选择New,取函数名为f_netcard(),返回值类型为integer,无传入参数,单击OK,输入以下代码:
String cover_cardno,ls_mynetno,netpass,cardno
ulong ll_num = 13
int li_flg
cover_cardno = space(ll_num)
li_flg = fnNet(cover_cardno)
cover_cardno = left(cover_cardno,12)
//根据以上读取的网卡号cover_cardno计算出用户授权号
//从后台数据库中读取对应注册密码串,把读取的注册密码串按加密算法2进行解密运算,并与由网卡算出的用户授权号进行比较,如果两者一致,则继续运行系统,否则打开注册窗口
二、用户注册窗口程序
在应用软件中添加用户注册窗口,用于产生用户授权号并提供用户注册接口。
1. 在用户系统注册窗口(如图 2)的open()方法中加入以下代码:
integer li_net
string ls_netcardno
ulong ll_num = 13
ls_netcardno = space(ll_num)
li_net = fnNet(ls_netcardno)
//读取网卡号
//把读取的网卡号按加密算法1进行加密运算,得到用户授权号输出到屏幕,以供用户注册。如图 2“软件授权号”所示
2. 在用户系统注册窗口“注册”按钮的click()事件中加入以下代码:
integer li_net
string ls_netcardno,ls_netpass
int i
//取网卡号
li_net = fnNet(ls_netcardno)
//取网卡密码
ls_netpass =sle_1.text+sle_2.text+sle_3.text+sle_4.text+sle_5.text
//拆分网卡密码
string my[25]
int j = 0
for j = 1 to 25
my[j]=mid(ls_netpass,j,1)
next
……
//按加密算法2进行解密运算,判断网卡密码是否正确,如果正确,则注册成功,否则不予注册
三、开发者端远程注册程序
编写开发者端远程注册程序,用于产生用户注册密码。
1. 在“反算网卡号”按钮的click()事件中加入实现以下功能的代码:
//加入加密算法1的解密算法,按用户传送来的软件授权号解密出用户机器的网卡号
//将生成的网卡号输出到“反算网卡号”后面的单行输入框中
2. 在“产生密码”按钮的click()事件中加入实现以下功能的逻辑代码:
//按用户传送来的软件授权号,经过加密算法2加密,产生相应密码串
3. 在“验证密码”按钮的click()事件中加入以下逻辑代码:
string ls_cardno,ls_netpass
int i
//取网卡号
ls_cardno= sle_2.text
//取网卡密码
ls_netpass =sle_4.text+sle_5.text+sle_6.text+sle_7.text+sle_8.text
//根据用户网卡号和产生的相应密码串,运行与用户程序注册窗口“注册”按钮的click()事件中相应的解密算法,验证产生的用户密码串是否正确
小 结
软件加密者在选择加密方法时,总是要在加密成本、可靠性、兼容性、透明性等方面进行权衡,本文介绍的加密方法适合于中小型软件系统的加密。
----
|
|