kaiyun官方注册
您所在的位置: 首页> 通信与网络> 业界动态> 基于DSA算法的软件注册码保护

基于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提供给软件开发商后,得到一个 二元组。该二元组就作为对该计算机的授权。
二元组的计算在软件开发商的计算机上完成,而该二元组的验证在用户的计算机上完成。计算模块和校验模块分别用于产生和验证 二元组。因此这两个模块之间必须共享一些信息。计算模块是秘密的,而校验模块(包括校验过程使用的算法及参数)对破解者是没有任何秘密可言的。通过分析校验算法,可以获得注册码的计算过程,但不能允许从校验过程直接推导出计算过程的参数。一些使用注册码方式加密的软件中,其校验模块暴露了太多的信息,以至于破解者可以开发出注册机,为任何主机ID生成注册码。
1.2 数字签名在注册码加密的应用
软件开发商选定一个加密算法和一个私钥/ 公钥对来实现注册码加密。私钥用来为ID产生数字签名,此签名作为软件的注册码。公钥存在于软件程序中,校验模块得到计算机的ID后,利用公钥验证数字签名(注册码)的正确性。
使用基于公开密码体制的数字签名算法来计算和校验注册码,在软件程序中包含了公钥和签名的验证过程,而注册码计算所需要的私钥则是秘密的。破解者通过分析、跟踪等方法可以获得注册码的校验过程和公钥,从而推导出注册码的计算方法,但他不能得到计算过程中所需要的私钥,因此不能计算出注册码。当密钥的位数足够长时,使用暴力穷举法或其他攻击方法也不能在有效时间范围内根据已获得的公钥计算出私钥。
如图1所示,注册码加密包括了密钥生成、主机ID生成、注册码计算、注册码校验四个主要模块。


密钥生成模块和注册码计算模块由软件开发商掌握,主机ID生成模块和注册码校验模块在软件中运行。
(1)密钥生成模块计算出具有一定长度的 <公钥,私钥> 对。公钥由注册码校验模块使用,而私钥由注册码计算模块使用。(2)主机ID生成模块按照主机的硬件信息计算出一个固定长度的ID。软件用户将主机ID交给软件开发商。(3)注册码计算模块根据主机ID计算出对应的注册码,注册码就是主机ID的数字签名,使用密钥生成模块提供的私钥进行签名。软件开发将 二元组交给用户。(4)在运行软件程序时,注册码校验模块首先确认ID的合法性。如果本机的ID与二元组中的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 ((p-1)/q)mod p>1;
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)与 中的ID相比较,不匹配时验证失败。(3)验证0 -1mod q。(5)计算uv=wg mod q,v=rw mod q。(6)计算v=((g u×y v)mod p) mod q。(7)若v=r,则认为签名有效,证实(r,s)是m的正确数字签名,即可确认用户输入的注册码是由软件开发商签发的。
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后,与 中的ID相比较。如果二者之间只有3项(或更少)有变化,则认为是正常的硬件升级或维修,匹配成功。
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

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306116;邮箱:aet@chinaaet.com。
Baidu
map