一种基于颜色属性值变换的OOX格式文档的数字水印方法与流程

文档序号:18121301发布日期:2019-07-10 09:39阅读:150来源:国知局
一种基于颜色属性值变换的OOX格式文档的数字水印方法与流程

本发明属于计算机文本版权保护技术领域,尤指一种基于颜色属性值变换的oox格式文档的数字水印方法。



背景技术:

文本文档作为主要的多媒体方式之一,其内容的原始性更应该受到关注,以防止该作品在传播时受到攻击。文本数字水印技术作为解决文本文档版权问题的有效手段应运而生,该技术通过一定的算法将隐蔽信息嵌入原始作品,再使用相应的提取算法将嵌入的信息进行提取,进而判断作品的可靠性。officeopenxml(oox)格式是microsoft公司发布的office2007-2010产品所采用的新格式标准,它是互联网上最流行的文本格式之一。oox文档发布以来,它的使用范围和使用频率急速增加,很多企事业单位的重要机密文件资料都是以这种新文本文档格式保存的,并在互联网上进行传播。

文本是信息交流的一种重要手段,由于它可以承载水印的冗余信息非常有限,并且容易受到攻击,所以对文本水印的研究相对较少,且都没有研究如何保护oox格式文档的版权。我们提出了一种基于颜色属性值变换的oox格式文档的数字水印方法,通过改变oox文本文档包中有关部件的属性值来嵌入水印信息,可有效保护oox格式文档的版权。



技术实现要素:

本发明的目的在于针对现有技术存在的问题,提供一种基于颜色属性值变换的oox格式文档的数字水印方法,包括水印嵌入和水印提取两个过程,并分别包括如下步骤:

所述水印嵌入方法的具体步骤为:

a1.首先读取oox格式文档包中的主文档部件document.xml文件,并提取出所述document.xml文件中的所有<w:p>节点待处理;

a2.对于<w:p>节点下每一个含有字符的<w:r>节点,首先对其进行分裂操作,然后依次对它们的颜色属性值进行变换以进行水印嵌入操作,具体为:对<w:r>节点中颜色属性的rgb值的r通道值进行变换,使相邻两个<w:r>节点rgb值的r通道值彼此不同从而保持相互独立分离状态,对于rgb值的g和b通道值进行变换以进行水印嵌入;若该<w:p>节点不含<w:r>节点或<w:r>节点内无字符则跳过不予处理;

a3.重复步骤a2,直至嵌完所有含有字符的<w:r>节点,然后将document.xml文件重新写入到原oox文档包;

所述水印提取方法的步骤为:

b1.首先读取oox格式文档包中的主文档部件document.xml文件,并提取出所述document.xml文件中的所有<w:p>节点待处理;

b2.对于每一个<w:p>节点的子节点,按顺序获取其中所有含有字符的<w:r>节点或子节点中所有含有字符的<w:r>节点;

b3.从第二个元素开始遍历步骤b2中获取的<w:r>序列,获取当前<w:r>节点rgb值的g通道和b通道值vg1、vb1,以及上一个<w:r>节点rgb值的g通道和b通道值vg0,vb0,分别计算得到vg1与vg0之差的绝对值∆g,以及vb1与vb0之差的绝对值∆b,∆g和∆b的值为0、1或2,若为0或1则将该值添加到一个水印序列尾部,若为2则表明此为结束标记,也即下一个水印序列的开始标记;

b4.重复步骤b3,直至遍历完所有<w:r>序列内的元素。

进一步地,步骤a2中,水印嵌入的具体过程为:

将给定的水印信息转化为一个二进制水印串信息,并将该二进制水印串信息的每一位数值作为一个水印位,其中数值0和1作为水印信息,另外增加数值2作为水印结束标记信息;根据当前水印位的值对当前<w:r>节点rgb值的g通道和b通道值加以变换,每次首先查看水印串是否已经嵌完,若已嵌完,则令当前<w:r>节点与上一个<w:r>节点rgb值的g通道或b通道值之差的绝对值为2;

否则,按顺序从水印串信息中读取一位水印位,若其值为1,则令当前<w:r>节点与上一个<w:r>节点rgb值的g或b通道值之差的绝对值为1;若其值为0,对当前<w:r>节点rgb值的g或b通道值不予变换;当原<w:r>节点分裂出来的所有新<w:r>节点的颜色值变换完成后,删除原<w:r>节点;

若<w:r>中不含color属性,则为该<w:r>节点添加color属性并将其rgb值赋值为“000000”。

更具体地,步骤a2的过程为:

在进行<w:r>节点rgb值变换时,为<w:r>节点rgb值的三个通道值各设置一个累加变化量,将该累加变化量与前一个<w:r>节点的rgb值的通道值相累加,作为当前<w:r>节点的通道值,具体地:

(一)<w:r>节点分裂操作

对于rgb中的r通道,该累加变化量可使相邻两个<w:r>节点的r通道值之差的绝对值为1、2或3,从而利用前后相邻的两个<w:r>节点中rgb值的r通道值的不同使两个<w:r>节点保持独立分离状态;然后,对于每一个<w:r>节点,根据从水印串信息中按次序读取的水印位对其rgb值的g和b通道值依次分别进行变换,即在对每一个原始<w:r>节点进行分裂操作和对其通道值进行变换操作之前,首先判断该<w:r>节点的颜色属性值是否与上一个已变换完成的<w:r>节点的颜色属性值相似,若相似,则将上一个<w:r>节点的rgb值赋给当前<w:r>节点,若当前<w:r>节点rgb值的各通道值与上一个<w:r>节点对应通道的最大接受值相同,则将对应通道的累加变化量赋值为-1,并依次对该<w:r>节点rgb值的g和b通道值分别进行变换;若当前rgb各通道值与上一个rgb对应通道的最小接受值相等,则将对应通道的累加变化量赋值为1,并依次对该<w:r>节点rgb值的g和b通道值分别进行变换;若不相似,则将当前<w:r>节点与上一个<w:r>节点之间视为隔断,在该原始<w:r>节点被分裂后的第一个新<w:r>节点和上一个已完成变换操作的<w:r>节点之间不进行水印嵌入操作;对于第一个原始<w:r>节点或者从某隔断处开始的第一个<w:r>节点的rgb值各通道,若其值为255则将其值减1,若值为0则将其值加1;通过上述步骤将原<w:r>节点分裂为n个新的<w:r>节点,n为<w:r>节点包含的字符数,并按顺序为每个节点分配一个字符;

(二)<w:r>节点rgb值变换操作

在变换之前所有新的<w:r>节点拥有相同的属性和属性值;第一个<w:r>节点属性值保持不变,从第二个<w:r>节点开始对rgb各通道的值进行变换,其中,r通道的具体操作为:

将该通道对应的累加变化量值与上一个<w:r>节点的已经变换完成的rgb中r通道的值相加,并将结果作为当前<w:r>节点的rgb中r通道的值,将r通道的累加变化量置为其相反数,再进行下一<w:r>节点rgb值中r通道的变换;

g和b通道具体操作为:

g和b通道累加变化量初始值设定为1;依次对g通道值和b通道值进行变换,在进行g通道值变换时,首先,判断水印信息串中的水印是否被全部嵌入完毕,若已经嵌入完毕,则令当前<w:r>节点的g通道变化量值为2或者-2,然后将g通道变化量值与上一<w:r>节点的g通道值相加作为当前<w:r>节点的g通道值;然后修改g通道变化量值为1或-1,且针对以下情况做不同方式的处理:(1)若g通道变化量值修改前为1且当前值为2,则修改其值为-1;(2)若g通道变化量值修改前为-1且当前值为-2,则修改其值为1;若水印信息串中的水印尚未被全部嵌入,则:(1)若当前水印位为1,将g通道变化量值与上一<w:r>节点的g通道值相加作为当前<w:r>节点的g通道值,然后将g通道变化量置为相反数;(2)若当前水印位为0,不对g通道的值进行变换;

b通道的变换同g通道。

进一步地,步骤a2中,若当前<w:r>节点的rgb值各通道的值分别处于上一个<w:r>节点rgb值各通道值的最小接受值与最大接受值之间,则认为两个<w:r>节点的颜色属性值相似。

例如,对于以下各种rgb各通道值的情况,我们定义了其相似颜色值范围(假设当前通道值为col):(1)若col的范围为[2,254],则其相似颜色值范围为[col-2,col+1];(2)若col为0,则其相似颜色值范围为[col,col+3];(3)若col为1,则其相似颜色值范围为[col-1,col+2];(4)若col为255,则其相似颜色值范围为[col-3,col]。

本发明按顺序对<w:p>节点中每一个含有字符的<w:r>节点进行水印嵌入操作。首先定义“累加变化量”概念,对当前<w:r>节点的rgb中各通道的值进行变换是基于前一个<w:r>节点中的rgb对应的通道的值和一个变量,此变量即为累加变化量。为使原来处于同一<w:r>节点的各个字符在被分裂到新的<w:r>节点后颜色值保持相似,必须把各个新节点的颜色值与原始节点颜色值之差控制在一个很小的范围之内,累加变化量需要根据具体情况动态变化。

在判断两个<w:r>节点的颜色属性值是否相似时,我们为每个尚未变换的<w:r>节点的rgb各通道值分别定义了一个相似区间,当该<w:r>被分裂为n个(n由字符数决定)新<w:r>节点后它们的颜色各通道值都将在对应的区间之内。对下一个原始<w:r>节点(尚未分裂和变换的<w:r>节点)变换之前先看一下它和上一个<w:r>节点的颜色是否相似,若相似,当前<w:r>分裂后的第一个新<w:r>节点和上一个<w:r>节点分裂后的最后一个新<w:r>节点之间可以继续嵌入水印;否则他们被视为断开。

本发明通过对oox文档主文档部件属性定义中的<w:r>标签中<w:r>pr标签下的w:color标签中的颜色属性值即rgb值进行变化从而将每一个字符分配到一个独立的<w:r>标签中,同时嵌入水印信息。根据二进制水印信息和前一个<w:r>的字符颜色rgb值来改变当前<w:r>的字符颜色的rgb值。由于人眼难以感知到rgb值的微小变化,且每相邻的两个字符就可以嵌入2位水印信息,理论上,n个字符可以嵌入2n-2个水印位。该方法在保留了文档格式的同时又嵌入水印信息,提高了水印的鲁棒性和嵌入容量。

附图说明

图1为实例1的oox文档嵌入水印前的状态图;

图2为实例1的oox文档根据本发明方法嵌入水印后的状态图;

图3为实例2的oox文档嵌入水印前的状态图;

图4为实例2的的oox文档根据本发明方法嵌入水印后的状态图。

具体实施方式

下面通过具体实施方式对本发明方案进行进一步的说明。

一种基于颜色属性值变换的oox格式文档的数字水印方法,包括水印嵌入和水印提取两个过程,并分别包括如下步骤:

所述水印嵌入方法的具体步骤为:

a1.首先读取oox格式文档包中的主文档部件document.xml文件,并提取出所述document.xml文件中的所有<w:p>节点待处理;

a2.对于<w:p>节点下每一个含有字符的<w:r>节点,首先对其进行分裂操作,然后依次对它们的颜色属性值进行变换以进行水印嵌入操作,具体为:对<w:r>节点中颜色属性的rgb值的r通道值进行变换,使相邻两个<w:r>节点rgb值的r通道值彼此不同从而保持相互独立分离状态,对于rgb值的g和b通道值进行变换以进行水印嵌入;若该<w:p>节点不含<w:r>节点或<w:r>节点内无字符则跳过不予处理;

水印嵌入的具体过程为:

将给定的水印信息转化为一个二进制水印串信息,并将该二进制水印串信息的每一位数值作为一个水印位,其中数值0和1作为水印信息,另外增加数值2作为水印结束标记信息;根据当前水印位的值对当前<w:r>节点rgb值的g通道和b通道值加以变换,每次首先查看水印串是否已经嵌完,若已嵌完,则令当前<w:r>节点与上一个<w:r>节点rgb值的g通道或b通道值之差的绝对值为2;

否则,按顺序从水印串信息中读取一位水印位,若其值为1,则令当前<w:r>节点与上一个<w:r>节点rgb值的g或b通道值之差的绝对值为1;若其值为0,对当前<w:r>节点rgb值的g或b通道值不予变换;当原<w:r>节点分裂出来的所有新<w:r>节点的颜色值变换完成后,删除原<w:r>节点;

若<w:r>中不含color属性,则为该<w:r>节点添加color属性并将其rgb值赋值为“000000”;

a3.重复步骤a2,直至嵌完所有含有字符的<w:r>节点,然后将document.xml文件重新写入到原oox文档包;

所述水印提取方法的步骤为:

b1.首先读取oox格式文档包中的主文档部件document.xml文件,并提取出所述document.xml文件中的所有<w:p>节点待处理;

b2.对于每一个<w:p>节点的子节点,按顺序获取其中所有含有字符的<w:r>节点或子节点中所有含有字符的<w:r>节点;

b3.从第二个元素开始遍历步骤b2中获取的<w:r>序列,获取当前<w:r>节点rgb值的g通道和b通道值vg1、vb1,以及上一个<w:r>节点rgb值的g通道和b通道值vg0,vb0,分别计算得到vg1与vg0之差的绝对值∆g,以及vb1与vb0之差的绝对值∆b,∆g和∆b的值为0、1或2,若为0或1则将该值添加到一个水印序列尾部,若为2则表明此为结束标记,也即下一个水印序列的开始标记;

b4.重复步骤b3,直至遍历完所有<w:r>序列内的元素。

更具体地,步骤a2的过程为:

在进行<w:r>节点rgb值变换时,为<w:r>节点rgb值的三个通道值各设置一个累加变化量,将该累加变化量与前一个<w:r>节点的rgb值的通道值相累加,作为当前<w:r>节点的通道值,具体地:

(一)<w:r>节点分裂操作

对于rgb中的r通道,该累加变化量可使相邻两个<w:r>节点的r通道值之差的绝对值为1、2或3,从而利用前后相邻的两个<w:r>节点中rgb值的r通道值的不同使两个<w:r>节点保持独立分离状态;然后,对于每一个<w:r>节点,根据从水印串信息中按次序读取的水印位对其rgb值的g和b通道值依次分别进行变换,即在对每一个原始<w:r>节点进行分裂操作和对其通道值进行变换操作之前,首先判断该<w:r>节点的颜色属性值是否与上一个已变换完成的<w:r>节点的颜色属性值相似,若相似,则将上一个<w:r>节点的rgb值赋给当前<w:r>节点,若当前<w:r>节点rgb值的各通道值与上一个<w:r>节点对应通道的最大接受值相同,则将对应通道的累加变化量赋值为-1,并依次对该<w:r>节点rgb值的g和b通道值分别进行变换;若当前rgb各通道值与上一个rgb对应通道的最小接受值相等,则将对应通道的累加变化量赋值为1,并依次对该<w:r>节点rgb值的g和b通道值分别进行变换;若不相似,则将当前<w:r>节点与上一个<w:r>节点之间视为隔断,在该原始<w:r>节点被分裂后的第一个新<w:r>节点和上一个已完成变换操作的<w:r>节点之间不进行水印嵌入操作;对于第一个原始<w:r>节点或者从某隔断处开始的第一个<w:r>节点的rgb值各通道,若其值为255则将其值减1,若值为0则将其值加1;通过上述步骤将原<w:r>节点分裂为n个新的<w:r>节点,n为<w:r>节点包含的字符数,并按顺序为每个节点分配一个字符;

上述过程中,若当前<w:r>节点的rgb值各通道的值分别处于上一个<w:r>节点rgb值各通道值的最小接受值与最大接受值之间,则认为两个<w:r>节点的颜色属性值相似;

(二)<w:r>节点rgb值变换操作

在变换之前所有新的<w:r>节点拥有相同的属性和属性值;第一个<w:r>节点属性值保持不变,从第二个<w:r>节点开始对rgb各通道的值进行变换,其中,r通道的具体操作为:

将该通道对应的累加变化量值与上一个<w:r>节点的已经变换完成的rgb中r通道的值相加,并将结果作为当前<w:r>节点的rgb中r通道的值,将r通道的累加变化量置为其相反数,再进行下一<w:r>节点rgb值中r通道的变换;

g和b通道具体操作为:

g和b通道累加变化量初始值设定为1;依次对g通道值和b通道值进行变换,在进行g通道值变换时,首先,判断水印信息串中的水印是否被全部嵌入完毕,若已经嵌入完毕,则令当前<w:r>节点的g通道变化量值为2或者-2,然后将g通道变化量值与上一<w:r>节点的g通道值相加作为当前<w:r>节点的g通道值;然后修改g通道变化量值为1或-1,且针对以下情况做不同方式的处理:(1)若g通道变化量值修改前为1且当前值为2,则修改其值为-1;(2)若g通道变化量值修改前为-1且当前值为-2,则修改其值为1;若水印信息串中的水印尚未被全部嵌入,则:(1)若当前水印位为1,将g通道变化量值与上一<w:r>节点的g通道值相加作为当前<w:r>节点的g通道值,然后将g通道变化量置为相反数;(2)若当前水印位为0,不对g通道的值进行变换;

b通道的变换同g通道。

在进行g和b通道值变换操作时,若水印已经嵌入完毕,尝试将当前通道值加2或者减2以嵌入“水印结束”标记信息;加2和减2操作的结果值至少有一个会处于相似颜色值的范围之内,选择可使结果值处于相似颜色值范围之内的变化量作为该通道的累加变化量。

下面通过具体实例进行上述方法的进一步说明。

实例1

下面以图1所示<w:p>节点为例进行说明,图1所示<w:p>节点下有一个含有字符的<w:r>节点,该<w:r>节点的初始颜色属性值为ff0000(按十六进制),所包含的字符为“abcdefghijklmnopqrstuvwxyz”共26个字母。设定水印为字符“a”,通过ascii码转换为二进制数为01100001。则<w:r>节点可被分解为26个新<w:r>节点。此处以字符a到f的水印嵌入为例进行说明。

如图2所示,根据上述方法,设rgb颜色属性值的r通道变化量初始为-1,g通道和b通道变化量初始为1,字符“a”的颜色属性值保持不变,即为ff0000(按十六进制);字符“b”的颜色属性r通道值与字符“a”的相差为1,相减后为fe(变化量为-1);由于设定的前两位水印为01,所以可以看到字符“b”的颜色属性g通道值和b通道值00和01分别与字符“a”的颜色属性g通道值和b通道值的00和00相差0和1,即字符“b”的g通道值不变,b通道值加1(变化量为1);然后修改g通道变化量为1,b通道变化量为-1。

接着修改字符“c”的颜色属性值,取接下来的两位水印为10。先修改字符“c”颜色属性r通道值变为ff(字符“b”的r通道值fe加上r通道变化量当前值1即得);

修改字符“c”颜色属性g通道值变为01(因对应水印值为1,将字符“b”的g通道值00加上g通道变化量1得到);修改b通道值,发现水印为0,不做修改;

修改g通道变化量为-1,进行下一<w:r>节点的变换;

后面字符同理可得,其结果如图2所示。

实例2

如图3所示,文档内容为字符“abcdefghijk”,字符“abcde”有同种颜色ff0000,各通道相似颜色值范围分别是:[fc,ff],[00,03],[0,03]。字符“fghijk”有同种颜色00b0f0,各通道相似颜色值范围分别是:[0,3],[ae,b1],[ee,f1]。图4为嵌入水印后的情况,可以发现字符“abcde”的颜色各通道值都在指定相似值范围之内,而字符“e”和“f”之间为断开,因为“f”的颜色值和“e”所在原始<w:r>的颜色值不是相似的。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1