论文信息
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的可能产生情况。