JPEG隐写术之F5、-F5和nsF5

2019-06-27
3分钟阅读时长
Featured Image

论文信息

Title Authors
Statistically Undetectable JPEG Steganography: Dead Ends, Challenges, and Opportunities Fridrich, Jessica, Tomáš Pevný, and Jan Kodovský

F5算法介绍

F5算法包含两个重要的设计原则,嵌入的特点和矩阵编码。

嵌入特点

F5算法的嵌入特点,是只会将DCT系数的绝对值减少1。

F5只嵌入到非零AC系数中。嵌入之后存在某非零系数变成0的情况,叫做收缩(shrinkage)现象。这种现象只会发生在原始系数值为正负1的系数身上。

因为解码器只从非零系数中读取秘密信息,如果修改成0之后,接收端无法确认当前读取的0是原始的零系数还是修改之后的零系数。因此嵌入之后如果生成新的0系数,可想而知,这个新的0系数所代表的秘密信息就无法提取出来。换句话说,其代表的特殊含义就泯然众人矣。

这时,需要跳过当前系数,重新将秘密数据嵌入到下个系数中。

矩阵编码

矩阵编码可以使得在一个嵌入修改中嵌入更多的比特,从而增加嵌入效率。

下面举例说明矩阵编码的概念。

用$x$表示7个DCT系数的LSB(最低有效位),以列向量表示,即$x_{7\times1}$。

用$$m$$表示3比特秘密信息,也以列向量表示。

首先生成一个$3\times7$的二元矩阵$H$,其中每一列都是长度为3的非零向量:

$$H= \left( \begin{matrix} 1 & 0 & 0 & 1 & 1 & 0 & 1\ 0 & 1 & 0 & 1 & 0 & 1 & 1 \ 0 & 0 & 1 & 0 & 1 & 1 & 1 \end{matrix} \right) $$

嵌入时,首先检查$Hx=m$是否成立。如果等式成立,那么不需要进行任何嵌入修改就可以实现秘密信息嵌入(即$x=y$,$y$即stego矩阵中对应位置的系数的LSB列向量)。秘密信息$$m$$可以通过下式提取:

$$m=Hy$$

如果等式不成立,首先要找到$Hx$与$m$中不一致的列,比如第$j$列。然后通过改变$x$中第$j$个比特来嵌如秘密信息$m$。最终生成修改后的系数的LSB列向量,也就是$y$。

接收者可以通过使用相同的矩阵乘法来正确地从stego图像中提取出秘密信息:

$$m=Hy$$

因此,在这个例子中,通过矩阵编码,可以只造成平均$$1-1/2^3$$次修改就可以将3比特信息嵌入到7个DCT系数中。这里的$$1/2^3$$是因为当$$Hx=m$$时,不需要进行修改就可以嵌入数据,而等式成立的概率正好是1/8。

矩阵编码方法可以推广到更一般的形式:

通过造成至多1嵌入修改或者平均$$1-2^{-p}$$次修改,来将p比特数据嵌入到$$2^{p}-1$$个DCT系数中。

但事实上,F5的嵌入效率是达不到理想的嵌入效率的。这是因为

  • 收缩现象的存在需要进行额外的嵌入修改。
  • 收缩现象增加了嵌入操作对DCT系数直方图造成的影响。

收缩造成的负面效果可以通过几种方式消除,下面介绍的-F5和nsF5就是针对收缩现象而指定的解决方法。

-F5算法

上文提到,F5的第一个设计原则,是将DCT系数的绝对值减1,这会导致收缩现象的产生。而-F5算法做的就是将减1改为加1,这样收缩现象就能避免,也就可以达到理想中的嵌入效率。

(-F5的缺点暂时不考虑)

nsF5算法

另一种解决方法是使用湿纸编码(Wet paper code)来减弱收缩造成的负面效果。

湿纸编码的思想是假设载体像一张湿了的纸一样,存在干点(dry point)和湿点(wet point)。湿点区域无法进行任何嵌入修改操作。

nsF5算法首先将置乱后的DCT系数进行分段之后,将零系数作为湿点,将非零系数作为干点进行湿纸编码。这样接收者只需要用共享的编码矩阵提取信息,而无需关心0的可能产生情况。

Avatar
杜洋 我欲因之梦吴越,一夜飞渡镜湖月。