随着信息技术的高速发展,软件在计算机领域扮演者越来越重要的角色在软件开发过程中,常常耗费大量的人力,物力,与财力所以软件是非常宝贵的知识产权必须受到保护,如今科技的发展,盗版软件的猖獗导致软件研发公司亏损巨大,安卓苹果APP抄袭现象较为普遍,为了保护软件公司开发的软件其免遭未授权用户的使用,以确保维持和增加软件公司的现有收入本文采用密码技术和代码混淆及软件水印技术设计一套软件保护方案,今天小编就来聊一聊关于软件版权保护期限多少年?接下来我们就一起去研究一下吧!

软件版权保护期限多少年(软件版权保护到底该怎么做)

软件版权保护期限多少年

1. 研究背景

随着信息技术的高速发展,软件在计算机领域扮演者越来越重要的角色。在软件开发过程中,常常耗费大量的人力,物力,与财力。所以软件是非常宝贵的知识产权必须受到保护,如今科技的发展,盗版软件的猖獗导致软件研发公司亏损巨大,安卓苹果APP抄袭现象较为普遍,为了保护软件公司开发的软件其免遭未授权用户的使用,以确保维持和增加软件公司的现有收入。本文采用密码技术和代码混淆及软件水印技术设计一套软件保护方案。

2. 方案描述

通过添加软件水印与序列号的方式达到对软件的保护,实现了软件的身份验证,正版验证,以及软件的唯一性使用,实现了对市面上的共享软件的版权保护,使之不被非法使用。

2.1 实现原理

2.1.1软件水印

软件水印技术是用来标识作者、发行者、所有者、使用者,并携带有版权保护信息和身份认证信息,可以鉴别出非法复制和盗用的软件产品,是为了保护软件产品,向软件程序中嵌入版权信息的一种软件保护技术。它属于一种事后验证的版权保护技术。一般都是通过软件水印技术可以把包含有版权保护的信息隐藏在程序数据区、代码区,以及程序的执行过程中,在需要的时候从软件中提取出来,用来证明软件的作者、发行者等。

① 水印生成

将代表软件版权方面的水印信息,通过一定的加密算法进行处理,提高水印信息的安全性。本系统也利用了基于广义中国剩余定理的数据分割算法来分割原始水印数据,将代表版权信息的水印分割成多个小的子数据,水印数据分割后的每个子数据的大小都小于原始的水印数据。这种小的水印数据更便于隐藏在程序中,并且不易被攻击者分析和发现。同时可将水印数据分割成多个子水印数据达到提高软件水印的鲁棒性与隐蔽性的目的。

② 水印嵌入

开始嵌入水印之前,首先把程序代码转换为一个标准状态。其次处理水印信息,通过加密算法和散列分块处理对要插入的水印信息进行加工处理实现了水印信息的加密隐藏,然后通过标准化程序转换实现了的水印信息转化为可执行的代码,并将此特征代码通过特定的算法嵌入到源程序中,形成标识有特殊水印的目标程序。从而实现了对目标程序的水印嵌入功能。

③ 提取水印

在水印提取时,通过反汇编技术对目标程序进行反汇编,得到目标程序的源代码,再利用解密和散列逆过程找到水印子数据,然后利用解密和分割算法,恢复处理后的子水印数据,得到原始水印数据。

3. 主要技术

3.1 代码混淆技术

代码混淆技术是用来对代码进行混淆变换,以产生等价的混淆代码的一种技术。系统运行的是变换后的混淆代码。一种有效的代码混淆技术至少通过两方面的努力来增加程序分析的难度。 第一,向混淆代码中加入一些降低分析精确度和增加分析复杂度的程序结构; 第二,要让从混淆代码到原代码的逆变换复杂度很大,使得程序分析只能对混淆代码进行。因此,代码混淆技术能够有效地阻碍有目的的篡改。

代码混淆是在发布软件之前对软件进行一种功能保持的变换,变换后的程序拥有和原始程序相同的功能,但更难于被静态分析和逆向工程。如给定一个程序 P、策略 K,经过混淆变换后得到程序 P',使得 P'完成 P 的功能,且更难以被攻击者作逆向工程的攻击。其代码混淆模型如下图 2-1所示。

图5 代码混淆模型

本系统中的代码混淆的方式主要是四个方面:删除注释:将代码中的注释全部去掉,包括//和/* */这两类注释;删除空格:删除代码中多余的空格,减少Java文件大小;删除换行:删除代码中所有换行符号,降低可读性,减少文件大小;删除tab :与删除空格相同以及更改变量名:将Java代码中,所有不在白名单中的变量名替换成形如a, b, c...的名称。

根据混淆原理和混淆变换所设计的对象不同,我们可以将代码混淆技术分为:外形(layout)混淆、控制(control)流混淆、数据(data)混淆、类(class结构混淆以及预防性(preventive)混淆这五种类型。以及对程序作混淆变换后的效果如何,通常从力量(potency)、弹性(resilience)、执行代价(cost)、隐蔽性(stealth)等方面来评估。

3.2 数字签名技术

数字签名(Digital Signature)由公钥密码发展而来。数字签名主要用于对数字消息进行签名,以防消息的冒名伪造或篡改。在这里,数字签名主要用于身份鉴别。数字签名应具有以下性质:

(1)能够验证签字产生者的身份;

(2)能用于证实被签消息的内容;

(3)可由第三方验证,从而能够解决通信双方的争议。

由此可见,数字签名具有认证功能。

公钥密码可以用来设计数字签名方案,一般思路如下:

(1)A用其保密的解密密钥对消息m加密,密文s就A对消息的签名;

(2)A将签名的的消息(m, s)传递给B;

(3)B用A的公开密钥对s能进行解密,得到m’。如果m’=m,则确认s是消息m的有效签名。

在此基于公钥密码的一般数字签名方案中,A使用公钥密码的解密变换来对消息进行签名。由于解密变换是保密的,只有A自己知道,所以只有A能对任意消息进行正确签名。另一方面,由于加密变换是公开的,所以任何人都可以验证签名的有效性。由此可得到一个通用的数字签名协议:

从上面的握手过程可以看出,数字签名的核心属性为:被签名的消息可以明确地追踪到他的发起人,因为只有唯一的签名者的私钥才能计算出有效的签名。只有签名者自己才能生成一个签名,因此可以证明,签名方的确生成了这个消息。

基于RSA公钥密码体制的数字签名方案通常称为RSA数字签名方案。RSA数字签名方案描述如下:

(1)选取两个保密的大素数p和q(“大”指其长度要足够长,目前推荐长度为至少1024比特);

(2)计算乘积,其中为n的欧拉函数,n公开,保密;

(3)随机选取整数e (1<e<)作为公钥,要求满足gcd(e, )=1,即e与互素;

(4)计算私钥d,以满足,即e和n是公钥,可公开d是私钥,要保密;

(5)签名生成:对于消息m,;

(6)签名验证:对于(m, s),如果,则确认s为消息m的有效签名。

协议的基本模型如下:

从此协议可以看出,A使用他的私钥kpr对消息x进行RSA加密,进而得到消息x的签名s。由于A是唯一可以使用kpr的人,所以kpr的所有权证明了A是消息的签名者。A将消息x的签名追加到消息x后,并将这两部分一起发给B。B接收到被签名的消息,并使用A的公钥kpub对签名s进行RSA解密,就可以得到x。如果x与x’匹配上,则B可以确定两件事:第一,消息的作者拥有A的私钥,并且如果只有A拥有此密钥的访问权限,则说明的确是A对该消息进行了签名。第二,此消息在传输过程中未被篡改,保证了消息的完整性。

RSA数字签名方案是目前比较普遍使用的一种数字签名方案,其安全性主要基于大整数分解的难解性。针对RSA数字签名方案的攻击有算法攻击、存在性伪造和RSA填充技术等。第一类攻击就是视图通过计算私钥d来破解RSA方案,此类攻击的常规做法是试图将n分解为两个素数p和q,如果攻击者可以成功将n分解,就可以从e中计算出私钥d。因此,在实际运用中,素数推荐长度为至少2048比特。

4. 方案设计

(1)软件水印的嵌入实现,首先将嵌入的水印信息进行处理,然后将嵌入水印的代码进行标准化处理,并将经过预处理的软件信息转化为标准化的程序。最后将转化过的含有水印信息的标准化程序插入到源程序中,重新编译生成可执行文件从而实现了嵌入水印的功能。

(2)序列号生成的实现。首先,将软件本身的信息通过软件水印技术嵌入程序中,然后在生成软件信息时,先获取本机的硬件指纹信息,提取软件的软件信息,获取用户的用户信息,再通过数字签名算法计算出上述信息的签名值,然后计算签名值的hash值,最终通过散列函数对hash值进行进一步的处理生成序列号并返回。并将序列号作为水印信息嵌入程序中。

(3)软件水印的提取实现。首先将将要提取水印信息的可执行程序执行反汇编获取程序的源代码,然后对源代码执行标准化操作,使之实现代码语言的标准化。在标准化的语言中对所嵌入的水印信息进行提取。

(4)带有序列号保护的可执行文件的生成 ,获取含有软件信息的带水印的可执行文件,将序列号验证程序嵌入其中,并将嵌入的之后的代码执行标准化操作使之所含的水印信息不被破坏。重新编译生成新的可执行文件,进而产生带有序列号保护的可执行文件。

5. 应用前景

本方案是基于数字签名算法的序列号保护系统,数字签名算法实现了抗抵赖,在软件水印中实现了对软件信息的隐藏。序列号的生成算法能确保软件使用的唯一性,唯一用户,唯一机器。因此本系统主要应用于以下领域:

(1)保护软件产品的知识产权,确保共享软件在授权的情况下才能正常使用,在非授权的情况下不能正常的使用。

(2)确保了软件的使用的唯一性,将用户信息与本机硬件信息结合确保了单一用户的使用,以及单一机器的使用。

(3)隐藏软件的基本信息,将软件的防伪信息通过软件水印技术嵌入到程序中达到防伪的效果。

(4)通过软件水印技术,将软件的唯一性标识嵌入程序中,保护软件不受盗用。

(5)采用代码混淆技术, 可以为DRM 技术所采用的一些关键数据提供保护。

(6) 采用代码混淆技术,对需要保护的算法代码进行保护,降低代码的可读性,从而达到算法保护的目的。

如需要源码,请联系作者!

,