摘要:根据字符间距离的变化实现了Word文档中信息的隐藏,利用VBA语言编写Word宏实现。 关键词:信息隐藏 Word文档 Word宏 1 文本信息隐藏
文本信息隐藏是通过改变文件模式或改变文本的某些基本特征实现信息嵌入的方法,它使文档产生一定的变化,但是这种变化对人的视觉是不可见的。与图像和声音文件相比,在文本里面隐藏信息是比困难的。因为它几乎不包含任何冗余信息,因此在文本里面隐藏信息必须寻找那些不易引起视觉感知的方法。目前在文本中主要有以下三种编码方法[2]:
(1) 行移编码。该技术通过垂直移动文本行的位置实现,通常当一行被上移或下移时,与其相邻的两行或其中的一行保持不动,不动的相邻行被看作是解码过程中的参考位置。如可以规定行上移表示“0”,下移表示“1”。根据要嵌入文本中信息的二进制位内容,编码器将文本中若干个行上移或下移来隐藏信息。解码器同样根据文档中相邻行的行间距离的差别进行信息的提取。
(2) 字移编码。与行移编码类似,字移编码技术通过使文本行内字符发生平移,即利用字间距离的变化嵌入需要隐藏的信息。采用这种方式时,相邻字之间的距离各不相同。
(3) 特征编码。在特征编码方法中,观察文本文档并选择一些特征量,再根据要嵌入的数据修改这些特征。特征可以是字母如b、d、h、k等中的垂直线,其长度可稍作修改以使得一般人不易发觉。相对某种给定的字体可以改变其字符高度,总有一些字母特征未作改变以帮助解码。
本文结合字移编码技术在Word文档中利用VBA编程语言实现了信息的隐藏和提取,完成了一个编码器和一个解码器。 2 Word文档中信息隐藏与提取的实现
在Word文档中实现信息隐藏的方法是改变文档中字符的间距离。在一篇正常的文档中字符间距通常是标准形式,即字符间距离为0磅,也可以将某两个字符的间距设为0.1磅。例如,或需要隐藏一个二进制串01100101(即字符a),此时可以在Word文档中栽个位置开始的连续9个字符的文本串,将其中的两两字符间距分别设为0磅、0.1磅、0.1磅、0磅、0磅、0.1磅、0磅、0.1磅,这样实现信息的隐藏。提取过程与此相反,根据文档字符间的不同间距形成被隐藏的二进制串。
下面分析该方法的可行性。根据文献[2]所述,人眼无法辨认1/150英寸以内的间距变化,此间距为0.16993mm,而本文所采用的0.1磅间距变化为0.05405mm,此间距变化要小于文献[2]中所述的值。下面是利用该方法的实验结果。
下一行是Word文档中字符间距全为0磅的正常显示样式:
在在在在在在在在在在在在在在
下一行是在其中隐藏了01100101二进制串的文本显示样子:
在在在在在在在在在在在在在在
大量的实验结果也显示,这样的间距变化是人眼是几乎无法辨认的。
利用上述方法在Word中实现信息隐藏的关键是如何控制和提取文档中字符的间距。本文利用VBA语言实现了两个Word宏进行信息量的隐藏和提取。
VBA语言是针对微软Office文档进行操作的语言,它可以对Office文档的各种操作进行编程。下面给出该方法的VBA实现算法和程序的主要流程。
Sub Hide() ‘以下是实现信息隐藏的Word宏
Dim i As Integer
Dim ch As Byte
Dim ch1 As Byte
ch=Asc("a") ch‘变量中存放需要隐藏的字符
m=128
Selection.HomeKey Unit:=wdSroty *
‘将文档中的插入点移到文档首部
Selection.MoveDown Unit:=wdLine,Count:=2
Selection.MoveRight Unit:=wdCharacter,Count:=1
‘选择信息隐藏的位置,此处为文档的第三者‘
For i =1 To 8 ‘每次循环隐藏一位二进制位‘
Selection.MoveLeft Unit:=wdCharacter,Count:=1
Selection.MoveRight Unit:=wdCharacter,Count:=2
Selection.MoveRight Unit:=wdCharacter,Count:=2,
Extend:=wdExtend
在文档中选中两个相邻的字符
With Selection.Font
ch1 = ch And m
If ch1 = m Then
.spacing = 0.1
Else
.Spacing = 0
End If
m = m /2
Eid With
‘ch变量中的每一个二进制位利用位运算分别取出来,以设置文档中被选中的两个字符的间距
Next i
End Sub
上述Hide宏实现了在Word文档中隐藏一个8位的二进制串(即一个英文字符),若需要隐藏一个字符串,则只需重复上述过程。
下面是从Word文档中提取被隐藏信息的宏。
Sub Get()
Dim i As Integer
Dim ch As Byte
Dim m As Byte
Dim k As Byte
ch =0
Selection.HomeKey Unit:=wdStory
Selection.HomeDown Unit:=wdLine,Count:=2
Selection.HomeRight Unit:=wdCharacter,Count:=1
‘在文档中定位到被隐藏信息的位置
m = 128
k = 0
For i =1 To 8
‘每次循环提取出一个被隐藏的二进制位
Selection.HomeLeft Unit:=wdCharacter,Count:=1
Selection.HomeRight Unit:=wdCharacter,Count:=2
Selection.HomeRight Unit:=wdCharacter,Count:=2,Extend:=wdExtend
在文档中选中两个相邻的字符
With Selection.Font
If .Spacion = 0 Then
ch = ch And k
Else
ch=ch Or m
End If
k = k + m
m = m/2
End With
‘将提取出的一每个二进制位利用位运算形成一个8位二进制串(即一个字符)
Next i
MsgBox (CStrl(Chr(ch)))
‘利用对话框显示所提取的信息。
End Sub
上述算法给出在文档中确定位置的隐藏和提取,在实际应用也可以采用非确定的位置,如按照文件中某些特征确定隐藏位置,也可以将隐藏的位置分散到文档中的不同位置。该方法对于信息的隐藏量是比较高的,若一篇文档有5001个字符,则最多可隐藏5000个二进制位。另外,也可以采用间距变化分别为0磅、0.1磅、0.2磅与0.3磅实现四进制数位的隐藏,但这样会加大字符间距变化的幅度,可能会引起怀疑。该方法的缺点是在文档进行重新排版时,所隐藏的信息会丢失或产生错误;也正是由于这个特性,可以利用它实现Word文档中的数字水印,起到一定的产权保护作用。