基于DSA算法的软件注册码保护
2009-08-13
作者:谭毓安,卢 超,崔志刚
摘 要:提出一种利用DSA算法生成和验证软件注册码的方法。注册码的计算和验证分别使用秘密密钥和公开密钥,以保证注册码计算的秘密性。
关键词:注册码 软件保护 DSA数字签名算法
计算机软件采用的加密方法可分为硬加密和软加密。硬加密主要有钥匙盘、软件狗、CD指纹等,其兼容性较差、成本高,不能有效地利用Internet来发布和销售软件。软加密是通过软件注册码的形式向用户提供授权,不依赖于专门硬件,从而避免了硬加密方法的一些限制。
本文研究了一种通过公开密钥数字签名算法进行软件加密的方法。该方法使用DSA(Digital Signature Algorithm)数字签名算法对主机ID生成一个数字签名作为软件的注册码,软件运行时再对数字签名进行验证来判断软件的合法性。只有开发商才能对主机ID进行数字签名,此方法可有效地保护软件版权,而且不依赖于任何特殊的硬件设备。
1 利用注册码实现软件加密
在软件运行前,对计算机硬件进行检测以获得该计算机的标识信息,即代表这个计算机的主机ID。用户通过Internet、E-mail、电话等方式将主机ID提供给软件开发商,软件开发商对用户进行验证后,再根据主机ID计算出一个注册码。用户输入注册码后,软件中的程序就可以检测计算机的主机ID和该序列号是否对应。如果用户将软件安装或拷贝到其他计算机上,由于主机ID不同,程序就能判断出该软件属于非法使用。微软最新发布的Windows XP和Office系列软件即采用了这种软加密方式。这种方式也被称为许可证加密方式或序列号加密方式。
1.1 注册码的计算和校验
主机ID可以根据计算机的CPU序列号、网卡序列号、硬盘卷标、BIOS的日期及版本等信息产生。用户将主机ID提供给软件开发商后,得到一个
1.2 数字签名在注册码加密的应用
软件开发商选定一个加密算法和一个私钥/
公钥对来实现注册码加密。私钥用来为ID产生数字签名,此签名作为软件的注册码。公钥存在于软件程序中,校验模块得到计算机的ID后,利用公钥验证数字签名(注册码)的正确性。
使用基于公开密码体制的数字签名算法来计算和校验注册码,在软件程序中包含了公钥和签名的验证过程,而注册码计算所需要的私钥则是秘密的。破解者通过分析、跟踪等方法可以获得注册码的校验过程和公钥,从而推导出注册码的计算方法,但他不能得到计算过程中所需要的私钥,因此不能计算出注册码。当密钥的位数足够长时,使用暴力穷举法或其他攻击方法也不能在有效时间范围内根据已获得的公钥计算出私钥。
如图1所示,注册码加密包括了密钥生成、主机ID生成、注册码计算、注册码校验四个主要模块。
密钥生成模块和注册码计算模块由软件开发商掌握,主机ID生成模块和注册码校验模块在软件中运行。
(1)密钥生成模块计算出具有一定长度的
<公钥,私钥>
对。公钥由注册码校验模块使用,而私钥由注册码计算模块使用。(2)主机ID生成模块按照主机的硬件信息计算出一个固定长度的ID。软件用户将主机ID交给软件开发商。(3)注册码计算模块根据主机ID计算出对应的注册码,注册码就是主机ID的数字签名,使用密钥生成模块提供的私钥进行签名。软件开发将
2 基于DSA算法的软件加密
数字签名算法包括两大类:基于公开密钥的数字签名和基于共享密钥的数字签名。前者包括ElGamal、DSA(Digital Signature Algorithm)、RSA(Rivest Shamir Adleman algorithm)等,后者包括HMAC(Keyed-Hashing for Message Authentication)、Asmuth-Bloom等。在软件加密中不能使用共享密钥签名方案,因为校验模块中包括的共享密钥会完全被暴露给破解者。
计算机的ID作为签名算法的输入(即消息)得到的签名作为注册码。算法的公钥存在于校验模块中,而私钥则必须秘密保存,由计算模块使用。注册码的计算和校验方法不需要保密。
2.1 DSA算法
DSA是Schnorr和ElGamal签名算法的变种,被美国NIST称为DSS(Digital Signature Standard)
[4]。DSA是基于整数有限域离散对数难题的,其安全性与RSA类似。DSA的一个重要特点是两个素数公开,这样,当使用p和q时,即使不知道私钥,也能确认它们的安全性。而RSA算法却没有这个特点。DSA算法由于其计算量大,其所用时间是RSA签名的10~40倍。在软件加密中,签名的计算和校验并不频繁,因此DSA算法的速度并不会带来明显的影响。
DSA算法既可用于数据的加密解密,也可用于数字签名。DSA算法产生的数字签名由于其长度固定,适合作为软件的注册码。也可以采用ElGamal、RSA等其他公开密钥数字签名算法。
算法中应用了下述参数:
p:L bits长的素数(L是64的倍数,取为1024);
q:p-1的160位的素因子;
g:g=h
((p-1)/q)mod p,h满足h
x:x
y:y=g
xmod p;
H(x):单向Hash函数。这里选用安全哈希算法SHA-1(Secure Hash Algorithm)。SHA也被称为安全哈希标准(SHS,Secure Hash Standard),是由美国政府提出的,它能为任意长度的字符串生成160位的哈希值。
2.2 注册码的计算
计算注册码的过程实际上就是产生数字签名的过程。
x为秘密密钥,y为公开密钥,p、q、g可由一组用户共享。但在实际应用中,和RSA算法一样,使用公共模数可能会带来一定的威胁。对消息m的签名协议如下:
(1)将用户的主机ID作为消息m,使用SHA算法生成ID的报文摘要g=SHA(m)。g的长度为160位。(2)产生随机数k,k
kmod p)mod q。(4)计算k
-1mod q。(5)计算s=(k
-1(H(m)+xr))mod q。(6)签名结果(m,r,s)中的(r,s)作为主机ID对应的注册码。
2.3 注册码的校验
将m和(r,s)作为
(1)获得主机ID,计算g=SHA(m)。(2)与
2.4 私钥/公钥对的生成
注册码的计算和校验分别使用一个DSA密钥对中的私钥和公钥。采用Java加密扩展库JCE的KeyPairGenerator即可生成512位的DSA密钥对[5]。其主要代码为:
KeyPairGenerator kpg=KeyPairGenerator.getInstance(″DSA″);
SecureRandom secrand=new SecureRandom( );//初始化随机产生器
keygen.initialize(512,secrand);//初始化密钥生成器
KeyPair kp=kpg.generateKeyPair( );//生成密钥对
PublicKey pubk=kp.getPublic( );//得到密钥对中的公钥
PrivateKey prvk=kp.getPrivate( );//得到密钥对中的私钥
2.5 模乘运算
在DSA签名算法中,需要计算x
c(mod n),其中指数c很大,如果直接进行c-1次乘法,计算量太大。这里采用“平方-和-乘法”方法,将计算r=x
c(mod n)的模乘法的数目缩小到2t次或更少,这里的t是指数c的二进制位数(指数c以二进制形式表示为c
t-1……c
2c
1c
0)。
r的初值为1。执行一个循环i从0到t-1,每次计算出
否则r不变。
3 主机ID的匹配
在理想状态下,主机ID对每一个计算机应是惟一的。当计算机的某些部件被更换或升级时,主机ID可能会改变。如果任何一个小的硬件变动都要求用户重新申请注册码,无疑会加重用户和软件开发商双方的负担。因此,主机ID的选取应该能容忍主机上的部分硬件变化。
如表1所示,主机ID共128位,包括了9种信息,如CPU、硬盘序列号、网卡MAC地址、BIOS出厂时间等。硬件部件的信息作为SHA-1或MD5等哈希算法的输入,取计算结果的最低若干位存放在主机ID中,例如硬盘型号的哈希值在识别码中占20位。
软件运行时,在取得主机ID后,与
4 结 论
本文介绍了一种使用DSA签名算法来计算和校验软件注册码的方法。利用DSA密钥对中的公钥,注册码可以被有效地检验,而用户和破解者从软件程序中不能获得计算注册码所需的私钥。在验证主机ID时,采用了多项硬件部件的组合,既使用户更换少部分硬件仍能保证其注册码的使用。另外,还可以采取其他方法保护校验模块,防止其被篡改或绕过。
参考文献
1 Cronin G.A Taxonomy of Methods for Software Piracy Prevention.http://www.croninsolutions.com/writing/piracytaxonomy.pdf,2002,6
2 Microsoft Corporation. Windows XP Product Activation.http://www.microsoft.com/windowsxp/pro/evaluation/overviews/activation.asp,2002,8
3 Nichol A.Windows Product Activation(WPA) on Windows XP.http://aumha.org/win5/a/wpa.php,2005,3
4 吴世忠,祝世雄,张文政.应用密码学:协议、算法与C源程序.北京:机械工业出版社,2000