《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 业界动态 > 一种基于Word文档的信息隐藏方法

一种基于Word文档的信息隐藏方法

2008-09-09
作者:刘显德,唐国维,富 宇,刘雪梅

  摘 要: 根据字符间距的变化实现了Word文档中信息的隐藏,利用VBA语言编写Word宏实现。
  关键词: 信息隐藏" title="信息隐藏">信息隐藏 Word文档 Word宏


1 文本信息隐藏
  文本信息隐藏是通过改变文本模式或改变文本的某些基本特征实现信息嵌入的方法,它使文档产生一定的变化,但是这种变化对人的视觉是不可见的。与图像和声音文件相比,在文本里面隐藏信息是比较困难的。因为它几乎不包含任何冗余信息,因此在文本里面隐藏信息必须寻找那些不易引起视觉感知的方法。目前在文本中主要有以下三种编码方法[2]:
  (1)行移编码。该技术通过垂直移动文本行的位置实现,通常当一行被上移或下移时,与其相邻的两行或其中的一行保持不动,不动的相邻行被看作是解码过程中的参考位置。如可以规定行上移表示“0”,下移表示“1”。根据要嵌入文本中信息的二进制位内容,编码器将文本中若干个行上移或下移来隐藏信息。解码器同样根据文档中相邻行的行间距的差别进行信息的提取。
  (2)字移编码。与行移编码类似,字移编码技术" title="编码技术">编码技术通过使文本行内字符发生平移,即利用字间距的变化嵌入需要隐藏的信息。采用这种方式时,相邻字之间的距离各不相同。  (3)特征编码。在特征编码方法中,观察文本文档并选择一些特征量,再根据要嵌入的数据修改这些特征。特征可以是字母如b、d、h、k等中的垂直线,其长度可稍作修改以使得一般人不易发觉。相对某种给定的字体可以改变其字符高度,总有一些字母特征未作改变以帮助解码。
  本文结合字移编码技术在Word文档中利用VBA编程语言" title="编程语言">编程语言实现了信息的隐藏和提取,完成了一个编码器和一个解码器。
2 Word文档中信息隐藏与提取的实现
  在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:=wdStory ′将文档中的插入点移到文档首部
    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
    End 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.MoveDown Unit:=wdLine, Count:=2
  Selection.MoveRight Unit:=wdCharacter, Count:=1
     ′在文档中定位到被隐藏信息的位置
  m = 128
  k = 0
  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
  If .Spacing = 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 (CStr(Chr(ch)))
     ′利用对话框" title="对话框">对话框显示所提取的信息。
    End Sub
  上述算法给出在文档中确定位置的隐藏和提取,在实际应用中也可以采用非确定的位置,如按照文档中某些特征确定隐藏位置,也可以将隐藏的位置分散到文档中的不同位置。该方法对于信息的隐藏量是比较高的,若一篇文档有5001个字符,则最多可隐藏5000个二进制位。另外,也可以采用间距变化分别为0磅、0.1磅、0.2磅与0.3磅实现四进制数位的隐藏,但这样会加大字符间距变化的幅度,可能会引起怀疑。该方法的缺点是在文档进行重新排版时,所隐藏的信息会丢失或产生错误;也正是由于这个特性,可以利用它实现Word文档中的数字水印,起到一定的产权保护作用。
参考文献
1 钮心 ,杨义先.文本伪装算法研究.电子学报,2003;(3)402~405
2 曹卫兵,戴冠中.基于文本的信息隐藏技术.计算机应用" title="计算机应用">计算机应用研究,2003;(10):39~41

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。