APP下载

基于Easter EGG算法的软件水印实现

2018-01-06李天科

电脑知识与技术 2017年35期

李天科

摘要: 随着软件产业的迅速发展,软件版权的保护已成为亟待解决的问题。分析了软件版权保护的重要性和必要性,给出了软件水印模型,介绍了DM软件水印算法和Easter EGG软件水印算法,借鉴了DM软件水印算法中水印信息预处理方法,同时借鉴了Easter EGG软件水印算法,给出了一种软件水印实现的方法,并对实现的结果做了分析。

关键词: DM算法;Easter EGG算法;软件水印

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)35-0116-02

随着计算机软件技术的发展,计算机软件已经成为国家的基础性、战略性产业。计算机软件在促进国民经济和社会发展、转变经济增长方式、提高经济运行效率、推进信息化与工业化融合等方面具有重要的地位和作用。同时,随着计算机网络的普遍应用,计算机网络为软件产品的传播带来了极大的便利,普通用户可以随时通过网络下载、复制、分发软件。

然而,在网络环境下,软件产品的非授权复制和分发现象越来越多,软件的盗版、篡改日趋泛滥。这不仅给软件产品的开发企业、分销商和服务商带来极大的经济损失,同时,这也不利于软件产业的持续发展,容易引发诸多的计算机安全问题。因此,软件产品的版权保护技术是软件产业界和学术界长期研究的主要问题。

软件水印是20世纪90年代出现的一种源于数字水印技术的软件版权保护技术,受到国内外许多学者的重视,出现了不少研究成果。但是这些研究主要集中在完善软件水印理论以及构造新的或者改进原有的软件水印算法,很少涉及到软件水印的具体实现。本文基于Davidson-Myhrvold水印算法和Easter EGG水印算法,对软件水印的具体实现做了简单的尝试。

1 软件水印的概念、模型

1.1 概念

软件水印是指不被感知地嵌入在软件中的一段有标识意义的信息[1],有标识意义的信息既水印信息,可以是用来标识作者、发行者、所有者、使用者身份的信息,也可以是其它能用来标识版权的信息,如数字、字符串、图片等;这里的软件通常是指可执行的应用程序,

如java应用程序经过编译之后生成的class文件、或者是有多个class文件经打包后生成的jar文件、或者是Windows系统中可执行的PE文件等,它们是软件水印的载体。将水印信息嵌入到软件中,需要验证软件版权的时候可以从载体软件中提取出来,以证明该载体软件所有者的版权,并且在保持载体软件的功能和语义不变的情况下难以去除所嵌入的水印消息,以达到软件版权保护的目的。

1.2 模型

软件水印的模型如图1所示,主要包括:软件水印信息的预处理、软件水印信息的嵌入和软件水印信息的提取。软件水印信息的预处理是将代表软件版权的水印信息或标识有用户身份的水印信息(w),应用某算法进行处理,如使用Knuth算法将整数水印信息转换成长度为t的排列,使用Graph-Theoretic算法将整数信息编码成为图等等,通过这样的预处理能提高水印信息的隐蔽性。水印信息的嵌入是应用嵌入算法将预处理后的水印信息(w)嵌入到软件P中,形成携带有特殊水印信息的目标软件(Pw)。水印信息的提取是嵌入部分的逆過程,应用相应的提取算法从受保护的软件(Pw)中提取出水印 信息(w'),再经过反预处理得到解密后的水印信息(w),或者应用相应的验证算法验证水印信息(w)是否存在于受保护的软件(Pw)中,这两种提取方法都可以证明软件的版权。

2 软件水印算法

2.1 DM软件水印算法

DM软件水印算法是Davidson和Myhrvold于1996年提出的是最早的软件水印算法,该算法通过对程序流程图中的基本块进行重排嵌入水印信息。其基本思想是将水印信息转换成一个唯一的序列,在程序中选取指定个数的基本块,选取的基本块的个数不小于序列的长度,按照序列的顺序对基本块在程序流程中的位置进行重排,然后在基本块中加入分支指令,保持基本块原始的执行顺序,从而确保程序的功能不变。

DM算法的缺点是提取水印信息需要提供原始程序,将原始程序的流程图与嵌入了水印信息程序的流程图进行比较。同时还需要知道水印信息序列的长度或水印信息的值才能正确的提取。

2.2 Easter Egg软件水印算法

Easter Egg软件水印算法的基本思想是将水印信息隐藏在源程序中,水印信息可以是一个字符串、一幅图像、一段动画或者是一段视频。验证软件版权的时候,需要运行该应用程序,并输入一个特定的序列,激活与水印相关的代码,水印信息就会呈现在屏幕上。

Easter EGG水印信息在应用程序设计阶段或者实现阶段嵌入,水印信息提取的实现代码也封装在应用程序中,水印信息的提取需要特定的输入并在程序运行过程中实现,因此,Easter Egg水印算法属于动态软件水印算法。Easter EGG水印的优点是不容易受到扭曲攻击,缺点是水印容易被定位,一旦特定的输入序列被发现,采用标准的调试技术就可以跟踪可执行代码中水印的位置,然后可以将其移除或者使其失效。

3 软件水印实现

3.1 软件水印实现思想

借鉴DM算法中水印信息的处理方法,选取一个数字做水印信息,在应用程序中将该水印数字转换成对应的序列,保存在数组中。需要验证应用程序版权的时候,启动该应用程序启动,在登录界面的用户名栏输入水印信息,在密码栏输入包含有水印序列数字和其他字符组成的密码,应用程序从输入的密码中提取数字序列,与水印数字转换成的序列进行对比,若相同则输出验证成功的提示信息。

3.2 软件水印实现过程

1) 水印信息的预处理

利用permute算法将水印信息转换成一个唯一的序列,其实现的核心代码如下:

private static int[] permute(int i, int array[]) {

// i表示水印信息;array[]存放转换后的序列;t表示水印序列的长度。

int s;

for (int a = 2; a < t; a++) {

s = i % a;

i = i / a;

int j = array[a - 1];

array[a - 1] = array[s];

array[s] = j; }

return array; }

2) 水印信息的嵌入与提取

借鉴Easter EGG算法,将水印信息处理方法、密码处理方法,提示信息的输出方法分散在应用程序源代码中的不同位置。需要验证版权时,输入水印信息和密码,从密码中采用正则表达式提取水印数字序列,然后与调用permute()方法转换的序列进行比较,两者相同则输出提示信息。核心代码如下:

private static String toNumString(String str){

//str输入的密码字符串

String a=str;

String regEx="[^0-9]";

Pattern p = Pattern.compile(regEx);

Matcher m = p.matcher(a);

String s = m.replaceAll("").trim();

return s; }//s水印数字序列字符串

4 结果分析

1) DM算法中提取水印信息,需要将嵌入了水印的程序与原始程序进行比对,找出重排的基本块,同时还要知道重排的基本块的个数,因为重排的基本快個数不同表示的水印信息也不同。DM算法实现困难,无法抵抗扭曲攻击。本文借鉴了DM算法中水印信息的预处理方法,实现简单。由于没有基本块的重排,所以能抵抗扭曲攻击。

2) 借鉴了Easter Egg算法,通过一个特殊的输入激活水印信息的输出,如在应用程序运行的登录界面用户名栏输入数字7,密码栏输入:re3j4cx12k5zZ6p7m。生成的水印序列与密码中提取的序列相同,屏幕上输出提示信息。Easter EGG算法实现简单,但是容易受去除攻击,本文将水印信息处理方法、密码处理方法、提示信息输出方法分布在源程序的不同位置,对抵抗去除攻击有所改善。

3) 对水印序列与密码中提取的数字序列匹配成功后,输出的提示信息进行变换,如输出一幅特定的图像或者演示一段动画,可以用这个特定的图像或者动画表示该应用程序的版权信息。

参考文献:

[1] 王建明,王朝坤,余志伟.软件保护技术[M].北京:清华大学出版社,2013.

[2] 王叶茂,车生兵.软件水印及其研究现状概述[J].计算机应用与软件,2015,32(4):6-10.

[3] 杨建龙,王建民,李德毅.软件水印技术及其新进展[J]. 计算机工程,2007,33(17):168-175.

[4] 张立和,杨义先,钮心忻.软件水印综述[J]. 软件学报,2003,14(2):268-277.

[5] 罗养霞,房鼎益. 多水印技术在软件版权管理中的应用研究[J].计算机科学,2011, 38 (10):103-109.