发明名称 一种在计算机程序中嵌入和提取水印的方法
摘要 本发明涉及一种在计算机程序中嵌入和提取水印的方法,属于软件版权保护技术领域。本发明方法中,嵌入水印的过程为:将水印和密钥分别转化为大整数w和k,并将w和k分别转换成具有n个元素的单调非递减的整数数组W[]和K[],在W[]和K[]的每一对相应的元素之间建立m个映射关系,然后从计算机程序中选择待嵌入水印的方法,创建映射关系代码并分别嵌入到与选定的待嵌入水印的方法控制流图的割点处;提取水印的过程为:依次读入计算机程序中的每一个方法控制流图中的割点并进行判断,若满足提取条件,则从该割点处提取出映射关系代码,根据提取出来的所有映射关系代码创建一个提取辅助类,读入提取密钥,运行提取辅助类,显示提取结果。
申请公布号 CN100557618C 申请公布日期 2009.11.04
申请号 CN200810119358.0 申请日期 2008.09.05
申请人 清华大学 发明人 王建民;张长江;王朝坤;李德毅
分类号 G06F21/22(2006.01)I 主分类号 G06F21/22(2006.01)I
代理机构 北京清亦华知识产权代理事务所(普通合伙) 代理人 罗文群
主权项 1、一种在计算机程序中嵌入和提取水印的方法,其特征在于该方法包括以下步骤:嵌入水印的过程为:(1)将计算机程序版权人的版权信息和密钥信息分别转化为一个整型数字字符串,分别记为w和k,w和k是大整数;(2)将上述w和k分别转换成具有n个元素的单调非递减的整数数组W[]和K[],n是水印嵌入者设定的整数,1≤i≤n-1,具体的转换过程为:(2-1)任意设定一个大于1的整数q,求出满足不等式<maths num="0001"><![CDATA[<math><mrow><mi>w</mi><mo>&le;</mo><mrow><mo>(</mo><msup><mi>q</mi><mi>l</mi></msup><mo>-</mo><mn>1</mn><mo>)</mo></mrow><msubsup><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>n</mi><mo>-</mo><mn>2</mn></mrow></msubsup><msup><mi>q</mi><mi>jl</mi></msup></mrow></math>]]></maths>的整数l,以及满足不等式<maths num="0002"><![CDATA[<math><mrow><mi>k</mi><mo>&le;</mo><mrow><mo>(</mo><msup><mi>q</mi><mi>p</mi></msup><mo>-</mo><mn>1</mn><mo>)</mo></mrow><msubsup><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>n</mi><mo>-</mo><mn>2</mn></mrow></msubsup><msup><mi>q</mi><mi>jp</mi></msup></mrow></math>]]></maths>的整数p;(2-2)根据等式<maths num="0003"><![CDATA[<math><mrow><mi>w</mi><mo>=</mo><msubsup><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>n</mi><mo>-</mo><mn>2</mn></mrow></msubsup><msub><mi>v</mi><mi>j</mi></msub><msup><mi>q</mi><mi>jl</mi></msup><mo>,</mo></mrow></math>]]></maths><maths num="0004"><![CDATA[<math><mrow><mi>k</mi><mo>=</mo><msubsup><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>n</mi><mo>-</mo><mn>1</mn></mrow></msubsup><msub><mi>u</mi><mi>j</mi></msub><msup><mi>q</mi><mi>jp</mi></msup></mrow></math>]]></maths>分别求出系数v<sub>0</sub>,v<sub>1</sub>,...,v<sub>n-2</sub>和u<sub>0</sub>,u<sub>1</sub>,...,u<sub>n-2</sub>,其中,对于0≤j≤n-2,系数v<sub>j</sub>为整数且满足:0≤v<sub>j</sub><q<sup>l</sup>,系数u<sub>j</sub>为整数且满足:0≤u<sub>j</sub><q<sup>p</sup>;(2-3)令W[0]=l-1,K[0]=p-1,对1≤i≤n-1,得到W[i]=W[i-1]+v<sub>i-1</sub>,K[i]=K[i-1]+u<sub>i-1</sub>;(3)在上述转换得到的版权信息整数数组W[]与密钥信息整数数组K[]的每一对相对应的元素之间建立m个映射关系,m是水印嵌入者设定的另一整数,得到一个具有m×n个映射关系的集合;(4)从计算机程序中选择待嵌入水印的方法,其过程为:(4-1)建立一个待嵌入水印的方法集合,从计算机程序中读入一个方法;(4-1-1)根据读入的方法的控制流构建该读入的方法的控制流图,并得到控制流图的基本图,求出该基本图中所有割点的集合;(4-1-2)对割点集合进行判断,若为空集,则转入步骤(4-1-5),若不为空集,则读取上述割点集合中的一个割点;(4-1-3)对读取的割点进行判断,若符合:与该读取的割点对应的控制流图中的基本块能被拆分成两个基本块,且在两个基本块之间插入一个新的基本块之后,两个基本块在新的控制流图中成为相邻割点,则该读取的割点为可嵌入水印的割点,记录与该可嵌入水印的割点相对应的基本块的入口位置,并将上述读入的方法加入到待嵌入水印的方法集合中,转入步骤(4-1-5),若不符合,转入步骤(4-1-4);(4-1-4)对上述割点集合进行判断,若该割点集合的所有割点遍历结束,则转入步骤(4-1-5),否则,读取该割点集合中的下一个割点,转入步骤(4-1-3);(4-1-5)若计算机程序中的所有方法遍历结束,则转入步骤(4-2),否则,读入计算机程序中的下一方法,重复步骤(4-1-1)至步骤(4-1-4),直至遍历计算机程序中的所有方法;(4-2)判断可嵌入水印的割点个数,若少于m×n,则从计算机程序中任意选择一个不在待嵌入水印的方法集合中的方法,在与所选择的方法相对应的控制流图中添加新的分支,使得添加了新的分支的控制流图含有可嵌入水印的割点,记录与由于添加了新的分支而含有的可嵌入水印的割点相对应的基本块的入口位置,并将修改后的该所选择的方法加入到上述待嵌入水印的方法集合中,重复本步骤中以上部分直至遍历计算机程序中所有不在待嵌入水印的方法集合中的方法;(4-3)判断可嵌入水印的割点个数,若仍然少于m×n,则从上述待嵌入水印的方法集合中随机选择一个方法,按照上述步骤(4-1)中的过程读入另一割点,找到一个可嵌入水印的割点,并记录与找到的可嵌入水印的割点相对应的基本块的入口位置,若没有找到可嵌入水印的割点,则在随机选择的方法体中添加改变该随机选择的方法的控制流的辅助代码,使得该随机选择的方法的控制流图中含有新的可嵌入水印的割点,并记录与该新的可嵌入水印的割点相对应的基本块的入口位置,重复本步骤中以上部分,直至可嵌入水印的割点个数达到m×n;(5)将映射关系嵌入到选定的待嵌入水印的方法中,其过程为:(5-1)从映射关系集合中选择一个映射关系,从上述待嵌入水印的方法集合中选择一个待嵌入水印的方法,并读取待嵌入水印的方法中的一个可嵌入水印的割点;(5-2)为待嵌入水印的方法增加多个整型局部变量,使新增加的局部变量中编号最小的局部变量对应于映射关系中的自变量,编号最大的局部变量对应于映射关系中的因变量,创建局部变量初始化指令以及与映射关系相关的操作指令,并将操作指令与局部变量相关联,得到映射关系代码;(5-3)将与从待嵌入水印的方法中读取的割点相对应的基本块拆分成两个基本块b<sub>1</sub>、b<sub>2</sub>,并将构建的映射关系代码以一个基本块b<sub>3</sub>插入到b<sub>1</sub>和b<sub>2</sub>之间,使得基本块b<sub>1</sub>、b<sub>2</sub>、b<sub>3</sub>满足:基本块b<sub>1</sub>跳向基本块b<sub>2</sub>和b<sub>3</sub>,基本块b<sub>3</sub>跳向基本块b<sub>2</sub>;(5-4)读取下一个映射关系,判断待嵌入水印的方法中是否有新的可嵌入水印的割点,若有,则读取待嵌入水印的方法中下一个可嵌入水印的割点,并重复步骤(5-2)和步骤(5-3),完成映射关系代码的嵌入;若没有,则读取下一个待嵌入水印的方法,读取该下一个待嵌入水印的方法中一个可嵌入水印的割点,并重复以上步骤(5-2)和(5-3),完成映射关系代码的嵌入;(5-5)重复步骤(5-4),直至所有映射关系代码嵌入到计算机程序中;提取水印的过程为:(6)建立一个待提取水印的方法集合;(7)读取计算机程序中的一个方法,根据读取的方法的控制流构建与该读取的方法相对应的控制流图,得到相应的基本图,求出基本图的所有割点,得到一个割点集合,依次读取割点集合中的割点并进行判断,若与读取割点相对应的控制流图中的基本块b<sub>4</sub>满足:b<sub>4</sub>的跳转目标为两个基本块b<sub>5</sub>和b<sub>6</sub>,且基本块b<sub>5</sub>也为割点而b<sub>6</sub>不为割点,同时基本块b<sub>5</sub>为基本块b<sub>6</sub>的跳转目标,或基本块b<sub>6</sub>也为割点而b<sub>5</sub>不为割点,同时基本块b<sub>6</sub>为基本块b<sub>5</sub>的跳转目标,则对不为割点基本块作进一步判断,若满足:该不为割点基本块中含有的局部变量个数和类型与构建的映射关系代码中局部变量个数和类型相一致,则从计算机程序中提取该不为割点基本块中包含的操作指令以及所有局部变量的初始值,并根据操作指令和局部变量的初始值构建一个新的方法,具体构建过程如下:对按大小次序编号的上述不为割点基本块中的局部变量重新从0开始编号,使编号最小的局部变量为新方法的输入参数,编号最大的局部变量的值为新方法的返回值,使提取的操作指令作为新方法的操作指令;(8)将上述新方法加入到上述待提取水印的方法集合中;(9)重复上述步骤(7)和(8),直至计算机程序中的所有方法遍历结束;(10)根据上述待提取水印的方法集合,创建提取辅助类,提取密钥,并解析出版权信息;(11)使用与上述步骤(1)和(2)相同的方法,将用户的密钥信息转换成具有n个元素的单调非递减的整数数组g[];(12)依次读取上述整数数组g[]中的每个整数,并分别将读取的整数作为上述提取辅助类中每个方法的输入,获得提取辅助类中每一个方法运行的返回值,若相同返回值的个数小于m,则提取密钥有误,提取失败,若相同返回值的个数大于或等于m,则将该相同返回值加入到整数数组h[]中;(13)判断整数数组h[]是否为单调非递减,若不是,则显示提取失败,若是,则令上述l=h[0]+1,对0≤j≤n-2,令v<sub>j</sub>=h[j+1]-h[j],根据公式<maths num="0005"><![CDATA[<math><mrow><mi>w</mi><mo>=</mo><msubsup><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>n</mi><mo>-</mo><mn>2</mn></mrow></msubsup><msub><mi>v</mi><mi>j</mi></msub><msup><mi>q</mi><mrow><mi>j</mi><mn>1</mn></mrow></msup></mrow></math>]]></maths>得到一个大整数w,将大整数w作为一个整型数字字符串,还原成原始的字符串,显示版权信息并提示提取成功。
地址 100084北京市海淀区清华园