计算机软件是一类特殊商品,极易非法复制和盗版,为了保护软件开发商的利益,必须对软件进行加密保护。而随着Intemet的发展,利用注册码机制进行软件加密保护变得十分普遍,这种保护方法实现起来相对简单,不需要额外的成本。为此,我们在基于注册码软件加密保护的基础上提出了一套完整的保护方案,加强了对软件的保护,更好地防止了非法注册码和注册机的制作。
一、注册码软件的加密保护分析
在注册码软件加密保护方法中,注册机程序就是通过一定算法将用户信息换算成注册码,可用下式表示:
注册码=F(用户信息)
这一过程与用户软件中注册信息合法性验证环节有着密切的联系,软件合法性验证有以下两种基本表示:
注册码=F(用户信息)
用户信息=F逆(注册码)
其中换算关系设计的科学性与否直接关系到软件破解的难易程度,因为验证这一过程必然要暴露在他人计算机上运行,这样便使得破解者有机会使用类似TRW2000这样的调试工具对其进行跟踪分析,通过分析一方面可以找出合法注册码进行网上传播,另一方面破解者还可以通过进一步分析换算算法从而写出非法注册机。这将造成软件保护失效,严重损害了软件开发者的利益。
针对这些情况,相应又提出了“一机一码”制,即一台计算机对应一个注册码,那么即使某些注册码被破解传播也不能在其他计算机上使用;另外在合法性验证环节上采用注册机算法的逆算法,即:
用户信息=F逆(注册码)
并将F逆设计成一个非对称算法,这样即使破解者分析出验证中的F逆算法也很难推导出注册机中的F算法,也就写不出非法注册机了,但是这种加密算法相当不好设计。
二、完整的软件保护方案
我们今天设计的方案是在注册码软件加密保护基础上采用了“一机一码”制,密码学中成熟的非对称RSA加密算法,并且利用数据库管理算法密钥,通过这些措施提高了软件保护的可靠性,更好地防止了非法注册码和注册机。
1、 用户软件注册流程圈
图1描述了用户利用软件的注册模块得出注册申请码,以及将开发商反馈回来的注册码写入注册表完成注册的整个过程。其中软件的不同版本信息对应了软件开发商数据库中不同的RSA加密算法私钥,只有当开发商计算注册码时使用的私钥与用户软件验证程序中使用的公钥是一对时才构成一个完整的RSA加密算法。
2、用户软件注册信息合法性验证流程图
图2描述了软件进行用户注册信息合法性验证的过程。
在验证时软件再次读出当前计算机的硬件信息形成一个申请码,和解密后的明文(就是软件申请注册码时的那台计算机上的申请码)作比较,这样保证了注册过后的软件只能在规定的某台计算机上使用。
三、基于RSA加密算法的注册码软件加密保护关键部分分析
基于RSA加密算法的注册码软件加密保护采用VC++6.0为开发工具,Microsoft Access2000数据库保存相关数据,关键部分分析如下:
1、注册申请码的选取
注册申请码也就是软件用户要提交给软件开发商的用户信息,因为是“一机一码”制,所以必须是计算机的唯一性信息。通过这种手段能够将软件与某台固定计算机进行绑定,软件每次运行时都会去检查当前计算机的“注册申请码”,然后进行合法性验证,这样防止了非法注册码。方案中采取的是提取计算机的硬盘序列号和网卡的MAC地址,并将两者糅合成申请码。
2、用户与开发商信息的交换
方案中软件用户与开发商的沟通是必不可少的,用户需要将申请码提交给开发商,同时开发商又要将注册码反馈给用户,这都将通过网络进行。
用户提交给开发商的信息主要包括:注册申请码,版本信息,电子邮箱,联系电话。在用户端可以直接链接到开发商的网址,例如:
SheIIExecute( NULL,"open","http: //www.nuaa. edu. cn',NULL,NULL, SW_SHOWNORMAL):
注册信息通过网上注册直接保存到开发商的数据库中等待计算。
开发商在完成注册码计算的同时也将注册码以邮件的方式网上发给用户:
CString str=’‘mailto:”+returnemail;
SheIIExecute(NULL, "open", str, NULL, NULL,SW_SHOWNORMAL);
这里retumemail是当前被计算用户的邮箱地址。
3、对注册表的操作
当用户得到开发商反馈的注册码时必须在计算机里找一个不易被发现的地方保存起来,为以后注册信息的合法性验证环节读入注册码作好准备。可以将其写入注册表,IM配置文件或其他任一文件中,这里采用系统注册表来进行注册码的保存,在存入时尽量将文件夹名取的没有意义,这样较为安全。
HKEY retumopenedsubkey;
DWORD dwDisposition;
//注册表中生成jhylf\\ohs文件夹
::RegCreateKeyEx( HKEY_CURRENT_USER,”Sofiware\\jhylf\\ohs”, O, ““, 0, KEY—ALL—ACCESS. NULL.&retumopenedsubkey, &dwDisposition);
BYTE.lpDatal=(unsignedchar.)(LPCTSTR) m_repstercode;
//将注册信息写入注册表
:: RegSetValueEx( retumopenedsubkey,”注册号”,0,REG—SZ,lpDatal,m_registercodc. GetLength());
:: RegCloseKey( HKEY_CURRENT_USER);
4、RSA加密算法的引入
RSA非对称加密算法是由Rivest、Shamir和Adelman创立的,它是密码学上十分成熟的加密算法,广泛用于数据文件加密和数字签名。该加密算法采用一对公钥和私钥,从公钥很难推出私钥,反之从私钥也很难推出公钥,此难度是基于大数分解的难度,其简要原理如下:
(1)产生一对公钥E和私钥D,以及模N;
(2)加密:C - (M∧D) modN,用私钥D对信息M加密,得到密文C;
(3)解密:M’=(C∧E) modN,用公钥E对密文C解密,得到明文M'。
在方案中,RSA加密算法贯穿于注册机的制作和注册信息合法性验证环节。如前所述,验证解密过程是暴露在用户计算机上进行,容易被破解者破解。但是采用RSA非对称加密算法后,即使破解者有可能通过动态跟踪在验证程序中得到算法和公钥层,只要模数Ⅳ取适合的长度,并且保证D不要取很容易被猜到的一些常用值,就很难找出加密得私钥D,没有私钥D也就无法写出非法注册机程序。本方案中密钥长度取128bit,即模Ⅳ为256 bit,公钥层取65 537,私钥D随机生成。当然RSA密钥长度取得越长就使得模N越难分解,算法也就越难被破解。
方案中使用RSA公钥加密算法大致可以分为以下几个步骤:
(1)提取本地计算机的硬盘序列号和网卡MAC地址信息形成M(注册申请码);
(2)注册机程序用RSA加密算法对信息M(注册申请码)使用私钥D进行加密得到密文C(注册码);
(3)软件注册验证程序用RSA加密算法对密文C(注册码)使用公钥E进行解密得到明文M';
(4)将明文M'与M(当前计算机注册申请码)进行对比,相同则表示用户注册信息是合法的。
另外方案中RSA加密算法的实现调用了大数运算库Miraclver4.82,其中要被加密的注册申请码以及加密私钥D和模数N都是从数据库中调出的,保证了算法的灵活性。加密注册申请码成为注册码的关键程序实现如下:
miracl * mip = mirsys( 100, 0) ;
mip ->IOBASE =16;
big in = miwar(0);
biS out = mirvar( 0) ;
big N = mirvafio) ;
big D = mirvar( 0) ;
TCHAR 8hqm[256J = {0};
TCHAR SN[256] = {0};
m_in. GetWindowText ( shqm, len + 1) ;
bytes_to_big( len, shqm, in) ;
//初始化模数 N
cinstr( N, ( char * ) ( LPCTSTR) retumN) ;
cinstr( D, ( char * ) ( IPCTSTR) returnD) ;
//it算 out =in^D mod N
powmod(in, D, N, out) ;
cotstr( out, SN) ;
//释放内存
mirkill( in) ;
mirkill( out) ;
mirkill( N) ;
//16进制模式
//in放注册申请码
//out放注册码
//N模数
//D私钥进行加密
//16进制
//初始化私钥D
//以16进制串写入SN
//释放内存
mirkill(in);
mirkill( out);
mirkill(N);
mirkill(D);
mirexit();
在验证环节中是将从注册表中读出的注册码用RSA加密算法进行公钥E(65 537)解密,与上述注册机实现过程类似。
5、密钥的数据库管理与更新
首先介绍下RSA加密算法密钥的产生:
(1)取两个相近的大素数P、Q;
(2)计算N= P*Q,Z=(P—1)*(Q-1);
(3)任取一个与Z互素的整数E;
(4)计算满足E*D=1 mod Z的整数D;
(5)(N,E)或E称为‘‘公开密钥”;(N,D)或D称为“私有密钥”。
RSA加密算法的私钥(N,D)用于开发商的加密,公钥(N,E) (E=65537)在用户软件的验证部分用于解密,如果定期地更换这对密钥又将会给破解者带来破解的难度。在这个软件保护方案中,密钥对将是随机生成,并且建立了一套数据库管理方法,将密钥与不同的软件用户关联起来。采用了Access数据库建立了表KEY_TABLE来保存不同版本软件的加密密钥(N,D),表USER_TABLE来保存前来注册的软件用户信息:
这样对应每一批软件就可以给出一个版本信息,不同的版本信息又对应不同的RSA算法密钥,通过这种方法保证了密钥对的更新。当用户前来注册时,将通过SQL语句进行两表联合查询:
Belect SHQM.N,D
from KEY_TABLE.USER_TABLE
where KEY_TABIE. FLAG=USER_TABLE. FLAG
形成一张虚拟表:
这就等于系统自动把每个注册申请码对应的加密密钥找了出来,从而使得顺利利用RSA算法对申请码加密生成注册码。
6、软件合法性验证
用户软件每次启动时读出注册表中的注册码信息,并将其用RSA算法进行解密得出明文,将此明文与当前计算机注册申请码进行对比以判断合法性。下面的代码是应用软件启动初始化时进行判断的:
if( lstrcmp( shqm, my8hqm)!=0)
{
AfxMessageBox(”对不起,您在本机上的注册信息不正确!”,
MB_ICONEXCLAMATION);
exit(0;)//软件强行退出
}
7、程序界面介绍
用户端负责注册申请码的产生,提交以及将供应商反馈的注册码进行注册。
注册机端负责随机密钥的生成,保存以及注册码的生成和反馈。
方案不仅考虑了“一机一码”制防止非法注册码,也考虑了利用非对称加密算法来防止非法注册机的制作。相对于以往单纯地利用硬件信息或是自己编写换算算法来实现软件加密保护有了更深入的研究,从而实用性也就得到了进一步加强。
小知识之算法注册机
算法注册机是指根据软件反汇编得出来的注册算法,然后使用编程语言写出来的程序。它的功能是通过用户提供的注册序列号、注册名或者机器码等去计算出软件的注册码来 。