软件作为计算机的重要组成部分,随着计算机的普及,已渗入生活的各个角落。由于计算机软件易于复制,导致了盗版软件的泛滥,所以软件开发者有必要加强自我保护意识,对自己编写的软件进行加密保护,防止或尽量减少被盗版的可能性。下面我们就针对这个问题提出了一种简便易行的对正版软件进行加密的方法,保护软件开发者的合法利益。
一、软件加密保护方案
软件加密方法大致分为两大类:硬加密方法和软加密方法。
硬加密方法是指利用软件结合特定的硬件来实现软件的加密,典型的硬加密产品有加密卡、指纹认证和软件狗等;
软加密方法是指仅使用软件方法加密,主要加密方式有序列号保护、警告窗口、时间限制、KeyFile保护、功能限制等。目前,一些大型软件通常是采用综合软加密和硬加密两种方法来实现软件的保护,而一些中小型软件受制于资金等条件,一般只采用软加密方法,如序列号保护机制等,这使得中小型软件加密的可靠性和安全性大大降低。
我们知道不同计算机的硬盘序列号不相同,如果读取软件所装的计算机的硬盘序列号作为软件加密的特征值,那么即使序列号保护机制中的“用户名”和“序列号”均被盗用,那么在别的计算机上也不能成功注册使用软件,从而使得软件加密的安全性大大提高。但是,如果软件加密保护采用的是简单的对称加密算法,一旦算法被攻破或采用的是何种算法被盗版者猜出,盗版者就可以根据算法写出加密机和注册机,这个缺点使其加密的安全性和可靠性大打折扣。
因此,我们提出了一种基于硬盘序列号和RSA加密算法的软件加密方法,将硬盘序列号所具有的唯一性和不可变性,同RSA加密算法的安全性结合起来应用于软件的加密,即不会不增加软件保护成本,又提高了软件加密的安全性,保护了软件开发者的知识产权。
二、硬盘序列号
通过CPUID、分区卷标、硬盘大小、网卡MAC地址等信息均可以将任意两台计算机区分出来。但是这些信息中有的是不可靠的,例如分区卷标仅与软件系统有关,是一种不稳定的信息;有的是无法得到的,例如当机器中没有网卡或早于PentiumⅢ型号的CPU,就得不到网卡MAC地址或CPUID等信息。
而硬盘的序列号存在于硬盘的控制芯片内,不能用常规办法修改,是在出厂前由生产厂家设定的,像硬盘的物理柱面数、扇区数一样,具有与操作系统无关的特性,不会随着硬盘的分区、格式化状态而改变。硬盘序列号与将硬盘格式化成FAT或FAT32后在分区引导扇区自动生成的卷序列号根本的区别是硬盘序列号是物理存在的,而每次格式化产生的序列号是不同的,其实质是一种逻辑上的号码,并且可以手工修改。由于硬盘序列号具有唯一性、不可变性、稳定性等优点,因此本文选择硬盘序列号作加密特征值。
三、RSA加密算法原理
由Rivest、Shmair和Adlernan三人研究发明的RSA加密算法,属于非对称密钥加密算法,这种加密算法最主要特点就是加密和解密使用不同的密钥。RSA加密算法利用两个很大的质数相乘所产生的乘积来进行加密,两个质数无论那一个与原文件编码相乘对文件加密后,均可由另一个质数再与原文件编码相乘来进行解密。它的算法大致步骤如下:
1)取两个相近的大素数p、q;
2)计算n=p*q,z=(p-1)*(q-1);
3)任取一个与z互素的整数e;
4)计算满足e*dmodz=1的整数d;
5)若用整数m表示明文,整数c表示密文(m,c均小于n),加密、解密过程如下:
加密:c=memodn
解密:m=cdmodn
6)(n,e)和(n,d)分别称为“公开密钥”和“秘密密钥”。根据Euler定理可得:
m=cddmodn=(memodn)dmodn=m
四、设计流程与程序的具体实现
1、设计流程
基于硬盘序列号和RSA加密算法的软件加密流程如图1所示,按如下三个步骤进行:
1)软件使用方在安装软件的过程中,点击“注册”按钮后,程序会自动读取软件使用方PC机的硬盘序列号diskID并显示在文本框中,同时按默认路径自动搜索认证文件。若认证文件存在,则程序自动进行步骤(3)中的解密判断注过程;若不存在,则提示软件使用方将硬盘序列号diskID通过e_mail发送给软件开发方;
2)软件开发方将硬盘序列号diskID逆序后得到的m经RSA加密后得到序列号c,将序列号c写入认证文件,并将认证文件和认证文件的指定存储路径通过email发送给客户;
3)软件使用方将认证文件按指定路径保存后点击“下一步”按钮,程序读取认证文件中的序列号c进行解密,得到m,再将m逆序后得到diskID1。然后比较diskID1和用户得到、提供给软件开发方的diskID,如果两者相等,则认为是正版软件,显示“注册成功”。否则认为是盗版软件,退出注册界面。
2、程序的具体实现
(1)硬盘序列号的读取
读取硬盘序列号程序使用了第三方开发的DiskID32.dll动态链接库,使操作简单易行,降低了程序编写难度,缩短了开发周期。
ghDiskID=LoadLibrary("DiskID32.dll");//动态加载DLL
diskIDFunc=(DISKID32)GetProcAddress(ghDiskID,"DiskID32");//获取DiskID32.dll的导出函数
diskIDFunc(factory,diskID);//得到硬盘序列号diskID
(2)RSA加密算法的加密、解密过程
RSA加密算法的加密、解密过程使用了Miracl4.82大数运算库。(Miracl全称为Multipreci-sionIntegerandRationalArithmeticC/C++Library,即多精度整数和有理数算术运算C/C++库。它是一个大数库,实现了设计使用大数的加密计数的最基本的函数,提供了C和C++两种接口,使用方便,速度相当令人满意,并且是开源的。)
在使用Miracl4.82大数运算库时,要将Miracl大数运算库的miracl.h、mirdef.h和ms32.lib添加到工程后就可以调用Miracl大数运算库提供的powmod()等函数进行加密、解密。Miracl是C库,要在头文件见中添加以下程序:
extern"C"
{
#include"miracl.h"#include"mirdef.h"
}
#pragmacomment(lib,"ms32.lib")
加密、解密的主要参数取值:
P(HEX)=E34436F5F48A227
BQ(HEX)=A92FA24467C4E3E3
N(HEX)=963251DC5A9C90D9F203A03C363BA411
D(HEX)=56157D29A89D77BF2F669A8F0B123CC9
E(HEX)=10001
加密、解密都使用ms32.lib中的powmod()函数。
powmod(m,e,n,c);//计算c=memodn
powmod(c,d,n,m);//计算m=cdmodn
3、认证文件的读写
将硬盘序列号逆序后经RSA加密得到的序列号c写入认证文件,编译运行程序后得到认证文件,并将存储路径一并通过email发送给软件使用者。
CFilefile;
file.Open("renzhengwenjian.exe",CFile::modeCreate|CFile::modeWrite);
sYouStructtmpRcd;
ZeroMemory(&tmpRcd,sizeof(sYouStruct));
CStringstr="c";//写入硬盘序列号逆序后经RSA加密后得到的序列号clstrcpyn(tmpRcd.strYou,(LPCTSTR)str,40);
file.Write(&tmpRcd,sizeof(sYouStruct));
file.Close();
程序在用户点击“下一步”按钮后,读取软件使用者按指定位置存储的认证文件中的序列号c。
CFile file;
file.Open("C:\\WINDOWS\\system32\\1025\\renzhengwenjian.exe",CFile::modeRead)
;sYouStructtmpRcd;
ZeroMemory(&tmpRcd,sizeof(tmpRcd));
file.Read(&tmpRcd,sizeof(tmpRcd));
CStringstr=tmpRcd.strYou;file.Close();
本文采用了硬盘序列号作为RSA加密算法的特征值,加密产生的序列号写入的认证文件与硬盘序列号一一对应,在不需增加新的硬件和软件加密保护成本的前提下,具备了一定硬件加密的优点,确保了软件加密的可靠性,有效地防止了非法拷贝和破解。本例的程序已在VC++6.0环境下调试通过并在一些小型软件加密中得到应用。在软件加密保护的开发过程中,软件开发者还可以通过改变加密算法、限制注册次数等方法,进一步增强软件加密的可靠性,最大程度的防止盗版的发生,保护软件开发者的知识产权。
小知识之软件加密
软件加密就是用户在发送信息前,先调用信息安全模块对信息进行加密,然后发送,到达接收方后,由用户使用相应的解密软件进行解密并还原。采用软件加密方式有以下优点:已经存在标准的安全API(Application Programming Interface,应用程序编程接口)产品、实现方便、兼容性好。