孙颖颖,陈震海,张瀚匀
(1.广西师范大学计算机科学与信息工程学院,桂林541004;2.广西师范大学图书馆,桂林541006)
随着计算机网络的快速发展,信息隐藏技术已经成为信息安全领域的一个重要分支。该技术类似于生物学中的保护色,通过将秘密信息加密隐藏至外部载体中,以达到保护秘密信息的效果。一般来说,载体图像会因为秘密信息的嵌入发生一定程度的失真,在例如医学、军事、艺术品保护等领域,载体图像的失真可能造成用户的误读和错判,从而带来巨大的损失。新兴的无损图像信息隐藏技术[1-3]恰好解决了这一问题。这一技术实现了在不破坏载体图像的前提下完成信息的传递,这种独特的优势吸引着越来越多的研究人员将目光集中在无损图像信息隐藏技术上。目前常见的可逆信息隐藏算法[4]主要有以下5 大类:①基于无损压缩的可逆信息隐藏算法[5],该类算法通过压缩数据的冗余信息腾出空间来嵌入秘密信息。②基于差值扩展的可逆信息隐藏算法[6],该类算法通过扩展两个像素之间的差异来嵌入秘密信息。③基于直方图平移的可逆信息隐藏算法[7],该类算法通过修改图像的最值信息获取冗余空间来嵌入秘密信息。④基于预测误差扩展的可逆信息隐藏算法[8],该类算法使用预测误差扩展来嵌入数据。⑤基于整数变换的可逆信息隐藏算法[9],该类算法使用可逆对比映射的整数变换技术来构建。
因为现有实现信息隐藏技术的工具较少,故本文使用直方图平移技术设计并实现了基于直方图平移的无损图像信息隐藏软件。该软件不仅可以实现秘密信息在载体图像上的嵌入与提取,同时可以保证在信息提取之后,可以无差别地将载体图像恢复至秘密信息嵌入之前的状态。实验结果表明,该软件可以有效实现秘密信息的嵌入和提取,并且能无损恢复载体图像。接下来将介绍该软件核心算法、设计与实现、软件测试这三部分。
本文利用Ni 等人在文献[7]提出的基于直方图平移的可逆信息隐藏算法实现,基本原理是计算出载体图像的像素直方图,修改直方图中的最值使图像产生冗余空间,并向冗余空间中嵌入秘密信息。下面将详细介绍信息嵌入、信息提取和图像恢复的具体方法。
嵌入秘密信息需先平移直方图产生冗余空间,再将秘密信息嵌入该空间。通过计算找到相应直方图的最大值P 和最小值Z。之后对图像进行整体扫描,使图像在P 到Z 的开区间内的像素值进行加一或者减一操作。设Mij表示载体图像像素,M'ij表示直方图平移后的图像像素,则产生冗余空间的公式可定义为:
随后将秘密信息嵌入到图像中。本软件使用OpenCV 图像处理库中Mat 类的at()函数,读取图像像素值,当载体图像中像素值等于最大值P 时,如果对应的嵌入信息为“1”,那么该像素值进行加一操作,反之该像素值不变。设Sl表示秘密信息,M''ij表示嵌入秘密信息后的图像像素,可以通过如下公式表示该嵌入过程。
实际就是信息嵌入模块的逆向操作。为保证软件的安全性,首先要进行安全检验,使用提取出的密钥与用户所输入的密钥进行对比,两者相同即可进行以下信息提取操作。对该载体图像进行整体扫描,若遇到像素值为P+1,则对应提取信息为“1”。反之,若遇到像素值为最大值P,那么对应提取信息为“0”。将提取出的二进制序列与密钥进行异或操作即可得到解密后的秘密信息。设b 为提取的信息,则可用以下公式表示信息提取过程。
显然这部分是将载体图像的像素值进行还原,以实现载体图像无失真的恢复。具体操作为:先将在最大值P 和最小值Z 的开区域间的像素值进行加一(或减一)操作即进行直方图平移操作,再将提取出的开销信息整合到载体图像中。设Aij表示移位后的新像素,则可用以下公式表示图像恢复模块的直方图平移过程。
设Aij表示无损恢复后的像素,(m,n)表示零值点的位置信息,可以通过如下公式将开销信息整合到载体图像以实现图像的无损恢复。
该软件将文本信息或数据文件嵌入到BMP 格式的载体图像中[10],并且可以将该信息提取出来,最后完全恢复图像。接下来对该软件设计以及实现部分进行介绍。
根据上述功能需求,该软件的功能结构如图1 所示,其功能模块介绍如下。①文本信息嵌入模块:选择载体图像,手动输入信息和密钥,将文本信息嵌入载体图像中。②数据文件嵌入模块:选择载体图像和数据文件,输入密钥,将数据文件嵌入载体图像中。③文本信息提取模块:选择载体图像,输入提取密钥,获取并显示秘密信息。④数据文件提取模块:选择载体图像,输入提取密钥,将数据文件提取出来并显示其路径。⑤查看恢复图像模块:选择载体图像,输入恢复密钥,密钥正确会显示该图像路径,通过路径可查看恢复后的图像。
图1 软件功能结构图
软件信息嵌入过程(a)和提取过程(b)如图2 所示。用户A 选取一张载体图像和需要嵌入的秘密信息,并且输入密钥,该软件将秘密信息预处理后,通过嵌入算法将其嵌入载体图像中,生成载密图像。用户B 得到载密图像,使用该软件,通过提取密钥从载密图像中获得秘密信息和无损的原图像。
为保证秘密信息的安全性,需要对它进行预处理。该软件采用MD5 加密技术将密钥转为32 位随机字符串,再将其转为比特流,通过与秘密信息进行异或运算,达到对秘密信息的加密处理。设表示密钥,表示秘密信息,表示加密后的秘密信息,加密公式(异或运算)可定义为:
图2 软件信息嵌入和提取过程图
因信息提取过程需要借助最值信息,故需将其构造为附加信息嵌入图像。先把第一对最值信息写入图像的前两个像素,并将这两个像素、最值对数和剩余最值信息一起转为比特序列构成附加信息。另外,附加信息的长度是由所需字节+信息长度(比特序列)组成,其中使用两位比特数表示其所需字节。若信息长度为0~255,则需要一个字节存储;若为256~65535,则需两个字节存储;若长度大于65535,则需四个字节存储。本文设定“00”表示一个字节,“01”表示两个字节,“10”表示三个字节。加密后的秘密信息长度组成方式与附加信息相同。
另外,若零值点(频率最小值点)不为0,则需记录下这些零值点的位置信息,以便图像恢复时使用。所以需将其作为开销信息嵌入图像中。预处理后秘密信息结构如图3 所示。
图3 预处理后秘密信息结构
本文软件是在Windows 7 系统环境下,使用C++语言在Microsoft Visual C++2013 平台进行开发。其中使用的图像处理库为OpenCV3,故在软件开发前期,需对该平台进行OpenCV 环境配置。软件界面利用MFC进行设计,功能界面设计较为简洁。界面整体设计采用菜单与子菜单的形式,实现用户运行软件后出现含有“信息嵌入”与“信息提取”两个菜单项的主界面,点击菜单项可以选择子菜单。每个子菜单项分别对应一个功能模块,其中每个模块的界面都有菜单、按钮、编辑框、复选框等控件。
软件使用面向对象和模块化的思想,将每个功能模块作为一个类进行代码实现。其中设计TextHide 类实现文本信息嵌入模块、FileHide 类实现数据文件嵌入模块、TextExtract 类实现文本信息提取模块、FileExtract类实现数据文件提取模块、PicExtract 类实现图像恢复模块。因为本软件处理的是BMP 格式,所以在读取和保存图像文件时,使用Windows.h 头文件中的BIT⁃MAPEFILE 和BITMAPINFOHEADER 来读取或者构造BMP 文件。在图像信息处理部分,软件通过OpenCV图像处理库中calcHist()函数计算图像直方图,Mat 类的at()函数读取图像像素值。软件设计了char_array_2_binary_str()函数实现信息嵌入之前秘密信息从字符流转为字节流以及信息提取之后将秘密信息从字节流转换成字符流。设计HistShift()函数实现信息嵌入功能,InfoExtr()函数实现信息提取功能,RecoverPic()函数实现图像恢复功能。
为测试该软件的功能,选取如图4 所示彩色图(a)以及灰度图(b)作为测试图像用例,使用“在我尘世岁月的狭窄河流上……”为文本测试用例,“G://newOut⁃put.txt”为数据文件测试用例。
图4 载体图像测试用例
在软件界面中选择“信息隐藏”菜单中的“文本信息隐藏”或者“数据文件隐藏”子菜单,随后选取图像并输入秘密信息和密钥,点击“隐藏”按钮,如图5 所示。
图5 文本信息隐藏与数据文件隐藏功能测试界面图
在“信息提取”菜单中选择“文本信息提取”、“数据文件提取”或者“查看恢复图像”子菜单,随后选取图像并输入密钥,点击“提取”或者“恢复”按钮,如图6 所示。经测试,该软件达到无损图像的信息隐藏效果。
本文利用直方图平移技术设计并实现了一个图像无损信息隐藏软件。它包含文本信息隐藏、文本信息提取、数据文件隐藏、数据文件提取和查看恢复图像五大功能。软件界面简洁大方,易于操作。经测试,它能有效实现秘密信息的嵌入和提取,并且能无损恢复载体图像。
图6 数据文件提取以及查看恢复图像功能测试界面图