董腾林,李欣然,姚 恒,秦 川
上海理工大学光电信息与计算工程学院,上海200093
目前信息隐藏算法已经成为信息安全的研究热点之一。信息隐藏是将秘密信息以不可见的方式隐藏在一个宿主信号中,以达到隐蔽通信和版权保护等目的[1-2]。数字图像含有较大的冗余空间,因此很多信息隐藏算法将数字图像作为宿主信号。基于图像的信息隐藏方法可以分为空间域和变换域两种。常见空间域信息隐藏方法之一是替换图像最低有效位(least significant bit,LSB)法[3],但该方法所隐藏的秘密信息容量十分有限。为了提高隐藏容量以及秘密信息的安全性,提出了采用自适应LSB 隐藏方法[4]。另外,基于图像空间域嵌入的信息隐藏方法还包括修改载体图像其他的固有特征,如平移直方图[5]、模运算[6]等,以此达到隐藏信息的目的。变换域的信息隐藏方法通常包括离散余弦变换法(discrete cosine transform,DCT)[7-8]、离散傅里叶变换法(discrete Fourier transform,DFT)[9-10]、离散小波变换法(discrete wavelet transform,DWT)[11-13]。为了将秘密信息嵌入到载体图像上,空间域和变换域的隐藏方法对信息隐藏载体都进行了一些修改,于是在图像上会留下修改痕迹,而攻击者正是利用这些痕迹通过信息隐写分析算法就可以检测出载体图像中隐藏的秘密信息,从而造成秘密信息的泄露。
为了解决上述问题,Fridrich 于2009年率先提出了无嵌入图像隐写的概念,中国则在2015年由全国信息隐藏研讨会专家委员会正式提出并确定无载体信息隐藏这一概念。无载体信息隐藏技术主要是通过秘密信息直接选择载体或生成含密载体,利用公共信道传递含密载体,以完成秘密信息的传输。在秘密信息隐藏过程中对直接选择或生成的含密载体未进行过任何修改,因此不具有因修改载体留下的痕迹会被第三方检测出来的风险。目前可将无载体信息隐藏分成基于载体选择和基于载体构造两大类。
基于载体选择的无载体信息隐藏的算法包括以下两种:1)基于数字图像的无载体信息隐藏算法,该算法通过提取数字图像固有的一些特征,如平均像素值、颜色特征、纹理特征等,然后将这些特征与秘密信息建立一定的映射关系,从图像数据库中检索与秘密信息相关联的自然图像[14-16],从而实现秘密信息隐藏。文献[14]通过比较相邻图像块的平均像素值大小,生成一定长度的哈希序列,然后利用该序列与秘密信息的映射关系,从图像库中检索到符合要求的载体图像,并将载体图像发送给接收方,从而完成秘密信息隐藏。2)基于文本信息的无载体信息隐藏算法,该算法通过构建特定的文本特征,如藏头诗或者通过中文数学公式将文本映射成二进制哈希值等,从而获取与秘密信息相关的特定文本信息,最后通过公共信道将含密的文本信息传递给接收方,完成信息隐藏过程。
基于载体构造的无载体信息隐藏通常以秘密信息为驱动,生成多为纹理图像的含密载体。文献[17-18]最先提出将数据嵌入到纹理生成过程中,但是该方法能够嵌入的秘密信息相对较小,且鲁棒性较弱。文献[19]提出一种基于纹理图像合成的无载体信息隐藏算法,该方法能够将给定的秘密信息生成相应的纹理图像,通过调整参数实现对任意数据的大容量隐写,但是其抵抗外界干扰能力弱。文献[20]提出一种基于纹理分类与合成的鲁棒无载体信息隐藏算法,该方法的隐藏容量较大,且能够抵抗一定的攻击。
显然,基于载体选择的无载体信息隐藏通常有含密图像间关联性差、隐藏数据量较低的问题,而基于载体构造的无载体信息隐藏通常存在鲁棒性弱、无法抵抗噪声攻击等问题。为了解决上述问题,本文提出了基于图像分类与尺度不变特征变换(scale-invariant feature transform,SIFT)进行特征提取的无载体信息隐藏算法。首先通过快速区域卷积神经网络(Faster R-CNN)[21]对原始图像库进行分类,然后提取每类图像的SIFT 特征,构建新的哈希算法,计算得到图像的二进制哈希值,从而生成新的子图像库。当需要隐藏秘密信息时,只需将秘密信息转化为一定长度的二进制哈希值,在图像库中搜索到相同哈希值的图像,即可完成信息隐藏。
本文提出的基于图像分类的鲁棒无载体信息隐藏方法主要可分为以下3 部分:
1)构建图像库。为了提高无载体信息隐藏的隐藏容量以及隐藏信息的安全性,本文首先对下载的VOCdevkit2007 图像库用图像目标识别Faster R-CNN 算法进行分类处理,根据图像的种类不同生成多个子图像库,以确保传输的含密图像之间的相关性,从而提高算法的安全性。然后构建映射字典,将子图像库中的图像种类映射成二进制哈希值,完成图像库的构建。
2)多级索引。基于图像载体选择的无载体信息隐藏算法通常需要建立大规模的图像库,因此想要从大规模的图像库中搜索出与给定的秘密信息相匹配的含密载体图像,通常非常耗时[22]。为了能够快速地搜索出符合要求的含密载体图像,本文根据子图像库的类别、子图像块的哈希值和图像列表,建立了多级索引结构,能够从图像库中快速搜索出符合要求的含密载体图像。
3)秘密信息的隐藏和提取。在秘密信息隐藏之前,发送方和接收方需要提前约定好信息隐藏过程中映射字典的构建方式,以及对图像SIFT 特征进行二值化的哈希函数,同时需要将这些信息严格保密。本文在进行信息隐藏时,需要先对给定的秘密信息进行分段处理,得到大小相同的信息片段。然后通过设计的哈希函数,将所有的秘密信息片段转化成对应的二进制哈希值;接着根据秘密信息片段的二进制哈希值,从构建的图像库中检索出含有秘密信息的图像;最后把这些含密的图像发送给接收方即可完成秘密信息隐藏过程。接收方在提取秘密信息时,首先需要按照规定的方式对含密载体图像进行分块处理,然后通过之前双方约定的哈希函数将含密载体图像块生成对应的二进制哈希值,即可从含密载体中提取出完整的秘密信息。本文方法的流程图如图1所示。
图1 本文方法流程图Figure 1 Flowchart of the proposed method
本文研究的是基于载体选择的无载体信息隐藏,在进行信息隐藏过程中不会修改含密载体图像内容,因此可以抵抗相关的隐写分析算法的检测。若随机选择载体图像发送给特定的接收者,依然会引起第三方的猜测和怀疑,从而会对传送的含密载体图像进行篡改或者拦截,增加了秘密信息成功传递的难度。为了尽可能降低第三方机构的猜测和怀疑,首先通过图像分类方法对下载的原始图像库进行分类处理。Faster R-CNN 算法能够快速且准确地识别图像中的物体,因此本文利用Faster R-CNN 算法将下载的VOCdevkit2007 图像库按照图像类别分成N个子图像库,并且根据图像类别建立一个映射字典,如表1所示。本文实验将VOCdevkit2007 图像库分成了16 个不同类别的子图像库,在秘密信息隐藏过程中根据表1的映射关系,选取不同类别子图像库中的载体图像。由于每个子图像库中的图像类别相同,因此每次传递的含密载体图像有很强的关联性,可从视觉上降低第三方机构的猜测和怀疑的可能,提高了含密载体图像在传输过程中的安全性。
表1 构建映射字典Table 1 Mapping dictionary construction
含密载体图像在公共信道传输的过程中,可能会受到外部的各种攻击,例如JPEG 压缩、噪声、图像缩放等。为了使接收方能够从含密载体中正确地提取出秘密信息,需要选择能够抵抗这些攻击的图像哈希算法。SIFT 算子是Lowe 教授于1999年提出的一种点特征提取算子[23],SIFT 特征具有尺度不变性和旋转不变性,对图像的亮度变化以及噪声等攻击具有良好的鲁棒性。为了满足无载体信息隐藏过程中含密载体传输所需的要求,保证秘密信息的传递精确度,本文实验设计了一种基于图像SIFT 特征提取的哈希算法。SIFT 特征提取是通过计算图像中的兴趣点、尺度和方向来获取图像特征,其算法原理如下:首先是尺度空间极值检测,尺度空间定义为B(x,y,σ),它是高斯函数G(x,y,σ) 与图像I(x,y) 卷积计算结果,计算公式为
式中:*表示卷积操作;σ为尺度空间因子,决定图像平滑程度或图像的尺度空间的大小;G(x,y,σ) 的计算公式为
SIFT 特征提取算法为了获取不同尺度空间下均存在的特征点,引入了高斯差分(difference of Gaussian,DoG)尺度空间。为了找到尺度空间的极值点,将每个采样点与相邻点进行比较,当采样点的值为该层及相邻层的DoG 尺度空间的极值点时,该点被视为图像的特征点。DoG尺度空间方程为
式中:D(x,y,σ) 表示DoG 尺度空间,k表示相邻DoG 尺度空间倍数。
通过上述步骤已经确定了图像中的特征点,每个特征点的梯度值B(x,y) 和梯度方向θ(x,y) 的计算公式为
最后根据以上计算结果进行直方图统计,该直方图的横轴为角度,纵轴为梯度方向对应模值的累加,选取直方图的峰值作为特征点的主方向。经过以上计算即可得到图像中每个特征点的坐标、尺度和方向。本文利用所得到的特征点的方向,设计了一种较为鲁棒的哈希算法。图2为本文设计的哈希算法的流程图,具体包括以下2 个步骤:
步骤1将图像转化为灰度图,同时将图像的尺寸归一化为M ×M大小;然后对图像进行分块处理,本文的图像被分成3×3 个图像块;最后通过SIFT 算法提取图像特征。由于SIFT 算法通常在一些纹理丰富的图像块中会产生大量的极值点,可能远超出本文所要的需求。因此为了得到更加稳定的特征点,通过调整SIFT 特征点计算的尺度值,放弃一些稳定性差的特征点,从中筛选出最稳定的特征点,如图2(a) 中每个图像块的绿色圆圈所示,特征点的主方向用红色线段表示。
步骤2统计每个图像块中这些特征点主方向所在象限的频率,并将极值点主方向所在的象限最大频率记为v={v1,v2,···,vn},其中n为图像分块后子图像块数,如图2(b)所示。如果图像块中特征点的主方向频率v介于0°~90°之间,则该图像块的哈希值映射为00;如果极值点的主方向频率v介于90°~180°之间,则该图像块的哈希值映射为01;依此类推,分别将图像块的哈希值映射为10 以及11。需要特别注意的是,如果图像块上没有SIFT 特征的极值点,该图像块的哈希值也映射为00。通过上述步骤得到每个图像块的哈希值,最后按照“Z”字形顺序将每个图像块的哈希值连接,得到完整的图像哈希值为100001000001101001,如图2(c)所示。
图2 图像哈希方案Figure 2 Image hashing scheme
本文算法将秘密信息分割成多个信息片段,然后从构建的子图像库中检索出符合要求的载体图像,最后通过公共信道发送给指定的接收者,完成信息隐藏过程。在建立的大规模图像库中检索特定的图像会消耗很长时间,为了解决这一问题,本文采用图3所示的多级索引的方法。
图3 多级索引结构Figure 3 Multi-level index structure
第1 层索引为通过Faster R-CNN 神经网络分类后的子图像库类别,利用特定秘密信息前4 位与不同子图像库的类别构建特定的映射关系,即可缩小图像检索的范围。第2 层索引为子图像块的二进制哈希值,根据本文的哈希算法可得每幅图像的哈希值为18 比特,因此本文实验中共设置了9 层。按照秘密信息的二进制哈希值进行检索,即可得到符合要求的载体图像。最后一层索引为图像列表层,理论上每种顺序的二进制哈希值只需一幅图像即可,为防止秘密信息出现重复顺序而导致含密图像重复传输的问题,最后一层有多幅相同序列的不同图像,能增加信息传递过程中的安全性。
本文提出的算法主要包括秘密信息隐藏和秘密信息提取,其中秘密信息隐藏的过程如图4所示,具体步骤描述如下:
图4 秘密信息隐藏过程Figure 4 Procedure of secret data hiding
步骤1发送方首先将需要隐藏的秘密信息S分割成两段,表示为C和S′。其中C为所需隐藏的秘密信息S的前4 位,用于确定秘密信息检索的子图像库;S′为秘密信息剩余片段。本文方法中每幅图像最多表示18 位二进制哈希值,因此将秘密信息片段S′按照18 位分割成K个秘密信息片段,分割后的秘密信息表示为S′={S1,S2,···,SK}。其中秘密信息片段S′的长度l、与秘密信息被分割的个数K满足下面的关系:
由式(6) 可知,在对秘密信息S′进行分割时,如果最后一段秘密信息片段不足18 位,则需要在后面添加若干个0,让该秘密信息片段保持18 位长度。
步骤2根据步骤1 可以将秘密信息S分割成K+1 个信息片段,根据第1 个信息片段可以确定所要检索的子图像库,剩下的K个信息片段代表需要从该子图像库中检索出K幅图像作为载体。判断图像的二进制哈希值与秘密信息片段的二进制哈希值是否相等后,利用多级索引结构从子图像库中检索出相应的图像。如果出现重复的信息片段,可以从图像列表中选择不同的图像作为载体,避免含密载体的重复,提高含密载体传递的安全性。
步骤3如果秘密信息的最后一个信息片段不足18 位,则根据步骤1 需要在后面添加0使其达到18 位,此时需要统计添加0 的个数,将其转化为二进制哈希值。根据上述的步骤1和2,即可从子图像库中检索出符合要求的含密载体图像。最后通过公共信道向接收者发送K+1 幅图像,即可完成信息隐藏过程。
无载体信息隐藏过程的另一个重要步骤是秘密信息提取,在本文方法中接收方在进行含密载体传输前需与发送方约定好秘密信息与载体图像间的映射方式,然后在接收完发送方传送的所有含密图像后,才能完全提取出秘密信息。本文方法的信息提取过程如图5所示,具体步骤如下:
图5 秘密信息提取过程Figure 5 Procedure of secret data extraction
步骤1接收方将接收到的含密载体图像P按照与发送方相同的方式进行分块处理,此时把P分割成9 块,记为P={P1,P2,···,P9};然后接收方分别提取每个含密载体图像块Pi的SIFT 特征,其中i是介于1~9 之间的整数。最后根据1.2 节的图像哈希算法得到18位的二进制哈希值。
步骤2根据最后一幅含密载体图像的哈希值,可以得到在最后的秘密信息片段中补0的个数,然后从第K幅得到的18 位二进制哈希值的末尾删除同等个数的0。
步骤3将第1 幅图像通过Faster R-CNN 网络,识别出图像所在的子图像库的类别,根据表1的映射关系得到4 位二进制哈希值。最后将得到的所有二进制哈希值块组合起来,便可完整提取出含密载体图像里的秘密信息。
本文实验是在操作系统为Windows 10 下使用仿真软件Matlab 2016、编程软件Python 3.5 和深度学习框架Tensorflow-gpu v1.10 完成的。图像库分类算法采用的是Faster R-CNN 神经网络算法,实验中使用的图像取自VOCdevkit2007 和百度图像网站,图像尺寸大小是255×255,隐藏的秘密信息为随机生成的二进制哈希值。
为了验证提出的无载体信息隐藏算法,实验首先根据图像类别将原始图像库分成了16 个不同的子图像库,每个子图像库中有1 000 幅不同图像,共有16 000 幅图像。实验通过构建的图像哈希算法,将每个子图像库中的图像映射成相应的二进制哈希值。最后根据秘密信息从子图像库中检索出符合要求的含密载体图像,完成信息隐藏。假设在图像库中图像数量足够多的情况下,将对本文算法在传递含密载体图像的实验结果、每幅含密载体图像隐藏容量、含密载体图像传输过程中被攻击后能否正确提取秘密信息进行实验与分析。
本文基于载体选择的无载体信息隐藏算法,即通过发送未经修改的自然图像完成秘密信息隐藏,相较于传统的加密和信息隐藏方法,能够抵抗现有的隐写分析算法的检测,更加隐秘地进行秘密信息的传输。由于图像哈希值的长度限制了基于载体选择的无载体信息隐藏方法的容量,目前这类方法无法将完整的秘密信息隐藏到单幅载体图像中,所以需要对秘密信息进行分割,从而将秘密信息片段隐藏到多幅载体图像中,完成秘密信息隐藏。但是大多数基于载体选择的无载信息隐藏算法都是随机选择载体图像,因此在发送过程中易引起第三方检测机构的怀疑,增加了秘密信息泄露的风险。
针对上述问题,本文首先将原始图像库进行了分类处理,增加了含密载体间的关联性,大大提高了含密载体在发送过程中的安全性。为了验证该方案的效果,用本文方法和文献[24]的方法对一组随机产生的秘密信息进行信息隐藏,图6所示是文献[24]进行无载体信息隐藏的结果,图7所示是本文进行无载体信息隐藏的结果。
图6 文献[24]的含密图像Figure 6 Stego-images of reference [24]
图7 本文方法的含密图像Figure 7 Stego-images of the proposed method
对比图6和7 发现:在隐藏相同秘密信息时,文献[24]随机选择符合要求的含密载体图像,载体图像间关联性弱;而本文方法选择的载体图像是同一类别的子图像库中的图像,含密载体图像间的关联性强。当这些图像作为载体图像在公共信道进行传输时,图6中的载体图像容易从视觉角度引起第三方检测机构的怀疑,图7中的载体图像则很难从视觉角度发现异常,因此本文的方法能够大大提高无载体信息隐藏的安全性。
基于载体选择的无载体信息隐藏算法是通过图像特征序列映射到秘密信息完成隐藏过程,因此无载体信息算法的隐藏容量与单幅图像特征序列的长度呈正相关。为了增加无载体信息隐藏算法的安全性,需要减少算法在隐藏秘密信息过程中发送的含密载体图像的数量,因此单幅图像的隐藏容量是一个关键性的性能指标。本文主要通过提取图像块的SIFT 特征,将其量化为一定长度的二进制哈希值;文献[14]首次提出了无载体信息隐藏的概念,通过构建图像平均像素与文本的映射关系完成信息隐藏过程;文献[16,24]都是通过提取图像SIFT 特征构建哈希函数,得到相应长度的哈希序列,完成信息隐藏过程。而本文与文献[14,16,24]算法的隐藏容量与二进制哈希值的长度有关,实验比较了本文算法与文献[14,16,24]算法的隐藏容量,结果如表2所示。由表2可知,本文算法比文献[14,16]单幅图像的最大隐藏量大一倍多;本文算法与文献[24]算法的隐藏容量相差不大,但是本文算法选择的含密图像载体的关联性较强,在含密载体发送过程中其安全性比文献[24]算法的高。
表2 不同方法的隐藏容量比较Table 2 Comparison of hiding capacity of different methods bits
实验采用了一系列的攻击来验证本文算法的鲁棒性,具体攻击种类和对应参数如表3所示。
表3 鲁棒性攻击及其对应参数Table 3 Robustness attacks and corresponding parameters
采用提取信息的误码率(bit error rate,BER)来衡量本文算法的鲁棒性,定义如下:
式中:E为提取信息错误的码长,L为整个秘密信息的长度。实验结果如表4所示,可以看到本文算法对上述几种常见的攻击具有一定的鲁棒性。当对含密载体进行JPEG 压缩、缩放、添加高斯噪声以及椒盐噪声时,能够正确提取秘密信息的正确率大都在90% 以上,其中对于抵抗JPEG 压缩和缩放攻击提取秘密信息的正确率最高。对比本文方法和文献[15]的结果可知,在图像受到JPEG 压缩、中值滤波攻击时,两种方法的误码率相差不大;在图像受到高斯噪声、椒盐噪声攻击时,本文方法的误码率低于文献[15]方法的误码率,显示出本文方法的鲁棒性更好;在含密载体受到缩放、均值滤波攻击时,本文方法的误码率略大于文献[15]的误码率。
表4 鲁棒性实验结果与比较Table 4 Experimental results and comparisons of robustness performance
另外需要说明的是,由于本文算法需要先对图像分块,然后通过提取图像块的SIFT 特征将含密载体与秘密信息建立一定的映射关系,因此对于能够让图像内容缺失或者让图像变形的攻击,如裁剪、旋转等,本文算法并不能得到有效抵抗。
本文提出的基于图像分类的鲁棒无载体信息隐藏方法主要分为3 部分,分别是图像库的构建、多级索引结构的建立以及秘密信息的隐藏和提取。该方法主要通过Faster R-CNN 算法对原始图像库进行重新构建,然后利用设计的哈希函数计算图像的二进制哈希值,将子图像库中所有图像映射成相应的二进制哈希值,最后根据秘密信息从子图像库中检索出符合要求的含密载体,完成无载体信息隐藏的过程。通过实验和理论分析可知,本文所提方法从视觉上可以有效降低第三方检测机构怀疑的可能,不仅可以抵抗现有隐写分析算法的检测,还可以抵抗高斯噪声、JPEG 压缩、图像缩放等常见图像的攻击。在将来的工作中,可以着重考虑如何在一定大小的图像库下进一步增加图像的隐藏量,同时可以考虑构建图像深度特征与秘密信息的映射关系,进而提高算法的鲁棒性。