CN101866410A - 在Java软件中嵌入和提取水印的方法 - Google Patents
在Java软件中嵌入和提取水印的方法 Download PDFInfo
- Publication number
- CN101866410A CN101866410A CN201010161131A CN201010161131A CN101866410A CN 101866410 A CN101866410 A CN 101866410A CN 201010161131 A CN201010161131 A CN 201010161131A CN 201010161131 A CN201010161131 A CN 201010161131A CN 101866410 A CN101866410 A CN 101866410A
- Authority
- CN
- China
- Prior art keywords
- watermark
- ppct
- node
- tree
- digit
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Editing Of Facsimile Originals (AREA)
Abstract
本发明公开了一种在Java软件中嵌入和提取水印的方法。其中嵌入水印包括以下步骤:将水印数字按照Asmuth-Bloom体系分为子水印数字;将子水印数字转化为一组PPCT水印;将一组PPCT水印转化为一组建图指令并嵌入Java程序体中;在Java软件中提取水印包括以下步骤:从Java程序的堆栈中提取出t个PPCT水印;将t个PPCT水印转化为t个子水印数字;对t个子水印数字进行运算得到水印数字。本发明采用Java类库的LinkedList作为PPCT水印节点的载体,使得水印的建立指令隐藏在程序中普遍存在的链表应用指令之中,提高了水印的隐蔽性。
Description
技术领域
本发明涉及一种软件防伪方法,特别涉及一种在Java软件中嵌入和提取水印的方法。
背景技术
软件水印是一种新型的软件保护方式,通过在软件代码中嵌入某些特定的秘密信息以证明对软件的版权。根据软件水印的加载时机,软件水印通常被分成静态软件水印和动态软件水印两大类。其中,将水印存储在程序的执行状态中的动态软件水印具有良好的隐密性和鲁棒性。在公开号为“W09964973”,名为“Software Watermarking Techniques”的专利申请中介绍了PPCT水印结构,类似于程序中普遍存在的树形数据结构,因此选作为本方法中水印的载体。
PPCT水印结构由PPCT树演化而成,如图1所示,PPCT树是将所有顶点的叶子结点数量限制在0个或者2个的二叉树。参照图2,改进得到的PPCT水印结构利用了所有的空闲指针,并添加一个头结点201,其右指针指向PPCT树的根结点202,左指针指向PPCT树的右下结点204,原PPCT树的各个叶子结点的右指针均指向自身,左指针指向左下的叶子结点,如204指向205,最左的叶子结点指向头结点201。
嵌入程序中建立PPCT水印的指令流一般放置在函数中,因此程序在执行这一函数时需要耗费更多的时间,而且程序的体积也会增大。经过测试,简单的程序在嵌入了水印数字“123456789”和“987654321”的程序运行时间由嵌入前的266795纳秒提高到了426312纳秒。函数所在的class文件的大小也会显著增大,一个大小为1041字节的class文件在嵌入水印数字“123456789”之后大小会增大到3767字节,增幅已经超过2KB。因此,如果较大的字符和水印数字嵌入单个位置,会导致程序体中的一个模块出现体积庞大,运行缓慢的特征,即水印的隐蔽性较差。
此外,从上述对PPCT的结构描述看出,攻击者可以只要破坏PPCT树的任一指针,就能使得水印无法被提取,即水印的鲁棒性不高。
发明内容
为了解决现有PPCT水印存在的上述技术问题,本发明提供一种在Java软件中嵌入和提取水印的方法。
本发明解决上述技术问题的技术方案包括以下步骤:
嵌入水印包括以下步骤:
1)取一段隐秘字符信息的Unicode编码或两个大质数的乘积作为水印数字;
2)将水印数字按照Asmuth-Bloom体系分为一组子水印数字;
3)将一组子水印数字转化为一组PPCT水印;
4)将一组PPCT水印转化为一组建图指令并嵌入Java程序体中;
在Java软件中提取水印包括以下步骤:
5)从Java程序的堆栈中提取出t个PPCT水印,t由Asmuth-Bloom体系所选的参数所决定;
6)将t个PPCT水印转化为t个子水印数字;
7)对t个子水印数字进行运算得到水印数字。
本发明的技术效果在于:本发明采用了Java类库的LinkedList作为PPCT水印节点的载体,使得水印的建立指令隐藏在程序中普遍存在的链表应用指令之中,提高了水印的隐蔽性。通过Asmuth-Bloom体系分为一组子水印数字,分别嵌入在程序的不同函数之中,即使攻击定位了其中一个子水印并成功的实施了裁剪攻击,由于分解组合方法中的冗余特性,水印仍然能够根据其余的子水印恢复,因此,提高了水印的鲁棒性。
下面结合附图和具体实施例对本发明作进一步的说明。
附图说明
图1为现有PPCT树结构图。
图2为改进得到的PPCT水印结构图。
图3为本发明中嵌入水印的流程图。
图4为现有PPCT树的构造图。
图5为本发明中的LinkedList结构图。
图6为本发明中提取水印的流程图。
图7中上部为GraphList结构图,下部为其分析之后所得PPCT。
图8为本发明中检测头结点流程的流程图。
具体实施方式
参照图3,本发明在Java程序中嵌入动态软件水印的方法包括以下步骤:
1、如果需要嵌入隐秘字符信息,则首先获取字符Unicode二进制编码,将其连接在一起,最高位增加一位,取值1,将得到的二进制数字转化为十进制数字,就能得到隐秘字符信息所对应的水印数字。如果采用两个大质数的乘积声明版权,可以直接使用大质数乘积作为水印数字。
2、将水印数字按照Asmuth-Bloom体系分为一组子水印数字。令K为要分解的水印,选取p,d1,d2,...,dn,其中p>K,且满足如下条件:
(1)d1<d2<...<dn;
(2)对所有i,有gcd(p,di)=1;
(3)对于i≠j,有gcd(di,dj)=1;
(4)d1d2...dt>pdn-r+2dn-r+3...dn。
令N=d1d2,...,dt,随机选整数0≤r≤(N/p)-1,取k′=K+(r×p),可以得到n个子水印:k′=ki mod di,i=1,2,...,n。
3、将一组子水印数字转化为一组PPCT水印。
首先要将水印数字转化为PPCT树。如图4所示,节点数为3的简单PPCT水印1,0由601和602两种基本元素构造而成,复杂的PPCT水印都可以通过递归的方法由这两种基本元素构造。
用递归函数BuldPPCT(n,i)将水印数字转化为PPCT树的步骤为:
(1)如果结点数为n的PPCT无法表示i,返回空树,其中i为待编码的水印数字,n是编码后的PPCT所需的最少叶子节点数量,根据卡特朗数列我们可以由i确定n;
(2)如果n=1,i=0,即用1个叶子的PPCT表示整数0。返回只有一个根结点的树;
(3)如果上述条件皆不满足,拟定左子树节点更少的的PPCT树排列靠前,可以确定i在具有n个叶子节点的PPCT树群中的位置p。新建一个根结点,其左结点由BuldPPCT(p,(i-min_int(p,n-p))/min_int(n-p))提供;其右结点由BuldPPCT(n-p,(i-min_int(p,n-p))%min_int(n-p))提供;返回树。
此递归函数返回的树即为水印数字对应的PPCT树,为PPCT树添加一个头结点,其右指针指向PPCT树的根结点。通过树的后序遍历可以从左到右访问到PPCT树所有的叶子节点,叶子节点被访问的顺序将是从左到右,将这些叶子节点按从右到左的顺序收集到链表中,实施如下操作:(1)将节点的右指针由指向空改为指向自身;(2)将节点的左指针指向下一个节点;(3)链表的最后一个叶子节点的左指针指向头结点;(4)头节点的右指针指向链表的第一个叶子节点。按上述操作修改后的PPCT树即为PPCT水印。
4、将一组PPCT水印转化为一组建图指令并嵌入Java程序体中。
通过树的遍历能把所有的结点找到放在链表里。通过开源的类库BCEL(Byte Code Engineering Library)可以读取并修改Java的程序文件。根据链表里的结点信息,可以在程序中嵌入建立PPCT图的指令流。建立PPCT图需要的结点类采用了Java类库中的通用数据结构LinkedList<Object>。由于Object是一切类的基类,所以这样定义的LinkedList可以用来装载自身类型的节点,节点的位置图5所示,可以看到,树根与儿子节点之间要经由三层指针才能到达,这就加大了攻击者分析的难度;而LinkedList作为一种通用数据结构,广泛存在于Java程序中,水印的隐秘性也得到了增强。
参照图5,从运行中的Java程序中提取水印的方法,包括以下步骤:
1、从Java程序的堆栈中提取出t个PPCT水印,t由Asmuth-Bloom体系所选的参数所决定。JDK1.6类库中的JDI(Java Debugged Interface)提供了调试程序的方法,可以申请两类事件:ClassPrepareEvent和MethodExitEvent。ClassPrepareEvent事件的触发条件是类的建立,可以设置仅仅当LinkedList类型建立时才有效,在其对应的响应函数中可得到该对象的引用,以及根据图8所示结构找到的其儿子节点的引用,将这三个引用的特征值打包保存到链表中,为了方便起见,我们称此链表为GraphList。
MethodExitEvent事件的触发条件是函数执行完毕,可以设置只有当函数含有水印构造代码才有效,在响应函数中就可分析ClassPrepareEvent事件处理得到的链表GraphList。GraphList中包含了LinkedList类型节点的引用,一旦发现其符合PPCT中头节点的特征,就可以通过遍历获取整个水印图结构,进而解码出水印。头节点的检测流程如图5所示,找到头节点后,通过先根遍历就可以解码得到PPCT水印。
2、将t个PPCT水印转化为t个子水印数字。
用递归函数Int(PPCT)表示PPCT解码过程,其返回值就是PPCT解码所得的子水印数字,定义函数Min_Int(ln,rn)=∑1≤i<ln Catalan(ln-i)Catalan(rn+i)。其中ln是PPCT左子树的叶子数目,rn是PPCT右子树的叶子数目。Catalan(n)表示Catalan数列的第n个值。
Int(PPCT)具体定义:
如果PPCT的结点数为零,Int(PPCT)=0;
如果PPCT的结点数不为零,返回
Int(PPCT左子树)×Catalan(rn)+Int(PPCT右子树)+Min_Int(ln,rn)。
3、对t个子水印数字进行运算得到水印数字。
从子水印中任取t个组成同余方程组:k′=kij mod dij,1≤j≤t,ij∈(1,2,...,n),用中国剩余定理计算得到唯一解x,k′=x mod N,通过r,p可得水印数字K;
4、水印数字按Unicode解码为隐秘字符信息。
Claims (5)
1.一种在Java软件中嵌入和提取水印的方法,其中嵌入水印包括以下步骤:
1)取一段隐秘字符信息的Unicode编码或两个大质数的乘积作为水印数字;
2)将水印数字按照Asmuth-Bloom体系分为一组子水印数字;
3)将一组子水印数字转化为一组PPCT水印;
4)将一组PPCT水印转化为一组建图指令并嵌入Java程序体中;
在Java软件中提取水印包括以下步骤:
5)从Java程序的堆栈中提取出t个PPCT水印,t由Asmuth-Bloom体系所选的参数所决定;
6)将t个PPCT水印转化为t个子水印数字;
7)对t个子水印数字进行运算得到水印数字。
2.根据权利要求1所述的在Java软件中嵌入和提取水印的方法,所述步骤2)的具体步骤为:
设K为要分解的水印,选取p,d1,d2,...,dn,其中p>K,且满足如下条件:
(1)d1<d2<...<dn;
(2)对所有i,有gcd(p,di)=1;
(3)对于i≠j,有gcd(di,dj)=1;
(4)d1d2...dt>pdn-r+2dn-r+3...dn;
令N=d1d2,...,dt,随机选整数0≤r≤(N/p)-1,取k′=K+(r×p),可以得到n个子水印:k′=ki mod di,i=1,2,...,n。
3.根据权利要求1所述的在Java软件中嵌入和提取水印的方法,所述步骤3)的具体步骤为:
利用递归函数BuldPPCT(n,i)将水印数字转化为PPCT树;
为PPCT树添加一个头结点,其右指针指向PPCT树的根结点;
将节点的右指针由指向空改为指向自身;
将节点的左指针指向下一个节点;
链表的最后一个叶子节点的左指针指向头结点;
头节点的右指针指向链表的第一个叶子节点。
4.根据权利要求3所述的在Java软件中嵌入和提取水印的方法,所述用递归函数BuldPPCT(n,i)将水印数字转化为PPCT树的步骤为:
(1)如果结点数为n的PPCT无法表示i,返回空树;i为待编码的水印数字,n是编码后的PPCT所需的最少叶子节点数量,根据卡特朗数列我们可以由i确定n;
(2)如果n=1,i=0,即用1个叶子的PPCT表示整数0;返回只有一个根结点的树;
(3)如果上述条件皆不满足,拟定左子树节点更少的的PPCT树排列靠前,可以确定i在具有n个叶子节点的PPCT树群中的位置p;新建一个根结点,其左结点由BuldPPCT(p,(i-min_int(p,n-p))/min_int(n-p))提供;其右结点由BuldPPCT(n-p,(i-min_int(p,n-p))%min_int(n-p))提供;
(4)返回树。
5.根据权利要求1所述的在Java软件中嵌入和提取水印的方法,所述步骤4)的具体步骤为:
通过树的遍历能把所有的结点找到放在链表里,根据链表里的结点信息,在程序中嵌入建立PPCT图的指令流。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010161131A CN101866410A (zh) | 2010-04-30 | 2010-04-30 | 在Java软件中嵌入和提取水印的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010161131A CN101866410A (zh) | 2010-04-30 | 2010-04-30 | 在Java软件中嵌入和提取水印的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101866410A true CN101866410A (zh) | 2010-10-20 |
Family
ID=42958132
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010161131A Pending CN101866410A (zh) | 2010-04-30 | 2010-04-30 | 在Java软件中嵌入和提取水印的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101866410A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103530536A (zh) * | 2013-09-30 | 2014-01-22 | 南通大学 | 一种Java软件水印的嵌入方法 |
WO2014153679A1 (en) * | 2013-03-27 | 2014-10-02 | Irdeto B.V. | Watermarking executable files |
CN104199824A (zh) * | 2014-07-21 | 2014-12-10 | 武汉传神信息技术有限公司 | 一种树型数据上判定节点关系的方法 |
CN110457874A (zh) * | 2019-08-02 | 2019-11-15 | 中国工商银行股份有限公司 | 一种信息写入方法、信息读取方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101350055A (zh) * | 2008-09-05 | 2009-01-21 | 清华大学 | 一种在计算机程序中嵌入和提取水印的方法 |
CN101477610A (zh) * | 2008-12-25 | 2009-07-08 | 中国人民解放军信息工程大学 | 源码和目标码联合嵌入的软件水印方法 |
CN101630354A (zh) * | 2008-07-16 | 2010-01-20 | 中兴通讯股份有限公司 | 一种动态软件水印的编码方法 |
-
2010
- 2010-04-30 CN CN201010161131A patent/CN101866410A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101630354A (zh) * | 2008-07-16 | 2010-01-20 | 中兴通讯股份有限公司 | 一种动态软件水印的编码方法 |
CN101350055A (zh) * | 2008-09-05 | 2009-01-21 | 清华大学 | 一种在计算机程序中嵌入和提取水印的方法 |
CN101477610A (zh) * | 2008-12-25 | 2009-07-08 | 中国人民解放军信息工程大学 | 源码和目标码联合嵌入的软件水印方法 |
Non-Patent Citations (2)
Title |
---|
《中国优秀硕士学位论文全文数据库》 20071115 朱江涛 基于Asmuth-Bloom体系的软件水印技术研究 第15-42页 1-5 , 第5期 2 * |
《微电子学与计算机》 20090930 王春红等 基于字节码的Java软件水印的研究与实现 第146-149页 1-5 第26卷, 第9期 2 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2014153679A1 (en) * | 2013-03-27 | 2014-10-02 | Irdeto B.V. | Watermarking executable files |
CN103530536A (zh) * | 2013-09-30 | 2014-01-22 | 南通大学 | 一种Java软件水印的嵌入方法 |
CN103530536B (zh) * | 2013-09-30 | 2017-01-25 | 南通大学 | 一种Java软件水印的嵌入方法 |
CN104199824A (zh) * | 2014-07-21 | 2014-12-10 | 武汉传神信息技术有限公司 | 一种树型数据上判定节点关系的方法 |
CN110457874A (zh) * | 2019-08-02 | 2019-11-15 | 中国工商银行股份有限公司 | 一种信息写入方法、信息读取方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Collberg et al. | Dynamic path-based software watermarking | |
US10409966B2 (en) | Optimizing and protecting software | |
Collberg et al. | On the limits of software watermarking | |
Collberg et al. | Error-correcting graphs for software watermarking | |
Collberg et al. | More on graph theoretic software watermarks: Implementation, analysis, and attacks | |
Chroni et al. | An efficient graph codec system for software watermarking | |
US10637643B2 (en) | Methods and apparatuses of digital data processing | |
Chroni et al. | Encoding watermark integers as self-inverting permutations | |
WO1999064973A1 (en) | Software watermarking techniques | |
CN101477610A (zh) | 源码和目标码联合嵌入的软件水印方法 | |
Collberg et al. | Graph theoretic software watermarks: Implementation, analysis, and attacks | |
CN101866410A (zh) | 在Java软件中嵌入和提取水印的方法 | |
CN113366474A (zh) | 用于通过将计算机程序的控制流表示为数据来混淆计算机程序的系统、方法和存储介质 | |
Fu et al. | A watermark-aware trusted running environment for software clouds | |
Baawi et al. | Enhancement of text steganography technique using Lempel-Ziv-Welch Algorithm and two-letter word technique | |
Chroni et al. | Efficient encoding of watermark numbers as reducible permutation graphs | |
Chen et al. | Software watermarking for java program based on method name encoding | |
Awasthi et al. | Intellectual property right protection of browser based software through watermarking technique | |
Zeng et al. | LMDGW: a novel matrix based dynamic graph watermark | |
Zhu et al. | H Function based Tamper-proofing Software Watermarking Scheme. | |
CN103824006B (zh) | 一种手机应用软件自动生成水印的方法和系统 | |
Che et al. | A software watermarking based on PE file with tamper-proof function | |
Chen et al. | A dynamic graph watermark scheme of tamper resistance | |
CN105095698A (zh) | 基于最近执行的程序代码的程序代码模糊处理 | |
Luo et al. | Dynamic graph watermark algorithm based on the threshold scheme |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20101020 |