简介
Steganography,这词在本文中被解释为速记式加密算法, 或者称之为隐写术, Steganography 最早来源于希腊单词 Steganós(覆盖)和 Graptos(写入)两个单词的复合。这个单词的意思就是把信息隐藏到文件中去,该文件可以是文本文件、音频文件、视频文件,甚至是操作系统的某些特殊文件都可以。从最开始出现到现在,速记式加密算法都是用在军事或者信息的保密等方面的。速记式加密算法和密码学都是用来保护信息的安全的。一般的加密算法或者是设置密码等这些虽然能够保存大部分互联网信息的安全,但是这些加密算法都能被人为的恶意破解。 对于加密算法人们都知道数据被加密或者是设置密码,并且如果是能力比较强的人会很快的就知道该信息是被何种手段加密或者设置的密码大概在什么范围之类, 因此想破解它也就不是非常的难。但是如果使用速记式加密算法的话,如果用户不被告知该信息被用速记式加密算法加密之后,用户是无法知道该信息是否被加密,如果用户直接打开文件可能就看到的是另外一些不重要的文件或者是乱码, 如果用户能够通过正确的途径解码,则能读出该文件中隐藏的重要信息。这样连用户都不知道是否加密,那么该用户就不会试图去破解该信息,可以说这样就从根本上解决了信息安全的问题。 但是在本文中,速记式加密算法则不是用来对数据进行加密的,而是通过稍微的改变一下,让它的用途不是那么的单一,对于速记式加密算法的原理,稍后进行解释。即刚好可以利用速记式加密算法的特性,把系统所需要的多视点图像的深度信息隐藏到视频文件的作为基本视频文件的每一帧信息中,然后在解码端解码出来,然后重新生成多视点视频文件,即可解决在多视点编解码视频中遇到的编解码非常复杂以及很容易出错,并且编解码后数据流本身依旧会非常大的缺点1。
在 H.264 的编码过程中,除了熵编码可以完全恢复到原始样子之外,其他的例如变换系数、量化、帧内预测、帧间预测都会丢失数据,但是深度图像信息需要的非常准确,所以不能在每帧开始编码以前就插入深度信息,只能在每帧做熵编码操作之前插入深度信息,而且由于每帧所能插入的信息是有限的,所以需要解决每帧图像可以携带的深度信息量做好计算。速记式加密算法能够带来的最大的优点在于,当把深度信息隐藏到基本视频以后,并没有给视频带来任何明显的变化,而且视频的数据量的大小也不会被改变。因此使用这种方法具有明显的优势。对速记式加密算法的研究在国际上是非常的流行,例如: 根据构造三角形来嵌入敏感信息; 根据最低有效位来嵌入敏感信息; 或者把一幅图像的所有每个字节的相应的每一位用来构成一个位平面 (BPCS),然后在每个位平面上通过计算一定大小块的noise-like 的比例值 u, 然后把敏感信息嵌入到 u 符合的位置块上。
算法LSB 算法最低位平面算法(least significant bits,LSB ),基本原理则是利用图像数据的每个字节的最低一位来携带数据加密信息。当把 LSB 算法使用到本文中的时候,则是把深度信息帧的每一位数据植入到视频数据中的每一个字节的最低一位。该算法首先具有非常简单的可操作性的优点。 但是该算法也有不可避免的缺点, 既是 LSB 算法的容量太小,由于只是利用每个字节的最低位来保存机密数据,所以就需要机密数据大小的八倍的载体来承载机密数据。
BPCS 算法位平面复杂度分割速记式加密算法(Bit-Plane Complexity SegmentationSteganography, BPCS) 是一种具有大容量的嵌入式算法。本节所用的速记式加密算法会用到数据嵌入时图像的复杂度,Kawaguchi 通过分析与图片相关的复杂度问题后,先后提出了大致三种有关计算复杂度的方式。本节中利用图像的黑白边界交替的频繁度来表示图像的复杂度。本方法主要是从图像的二进制数据中去讨论的图像的复杂度,二进制中只有 1 和 0 两种数值,所以可以用黑来表示 1,用白来表示 0。那么黑白相间的问题实际上就是 1 和 0 相间的问题。利用黑白边界交替的频繁度来表示二进制图像的复杂度是一种相对简单但是效果很好的表示方法。如果该平缓度的越大,则表示图像越复杂,反之则越小。黑白边界交替的最大值等于所有行和列相邻两位颜色变化的数量总和。例如一个黑色的块被上下左右四个白色的块包围着,那么黑白边界交替的值就为 4.利用 来表示图像的黑白边界交替的频繁度,因此可以得出以下的公式。
在公式中, k 表示在图像中实际的黑白边界交替值的大小,因此α的范围为 0≤α≤1。 α是通过整个图像区域来进行计算的,所以α是表示的整个图像的复杂度。当然α也可以被用于计算某一个局部区域的复杂度。然后再来讨论一下二进制图像的共轭性。用 P 来表示二进制 N*N 的白色背景以及黑色前景色的黑白图像。 W 和 B 表示全白和全黑的模式。 Wc 表示左上角第一个格子为白色的棋盘模式, Bc 表示左上角第一个格子为黑色的棋盘模式。 P*则表示与 P 共轭的图像。可参见下图所示。
B 模式是前景模式, W 模式是背景模式,现在定义 P*模式,如图 (f)所示,P*需满足以下三个条件:
第一, P*的前景模式的形状和 P 的是一样的。
第二, P*的前景模式是 Bc 的模式。
第三, P*的背景模式是 Wc 的模式。
只有 P*在同时满足上述三个条件的时候,才能称 P*是 P 的共轭图像。所以 P和 P*具有一一对应的关系,也就是说每个图像 P 都能找到它所对应的共轭图像 P*,反之也成立。所以它们也就满足以下几个特性:
(a) P*=P^Wc
(b) P =(P*)*
(c) P≠P*
(d)α(P*)=α(1-P). α(P)表示图像 P 的复杂度。这也是几个特性中最重要的一个。例如 P 的复杂度为 0.65,则 P*的复杂度则为 0.35。
就像根据位平面的复杂度来取代彩色图像的二进制数据对人眼是不可见的,可以尽可能的去隐藏深度信息数据。由于前面提到计算复杂度虽然是计算的一帧图像的全局复杂度,但也可以根据不同的情况实现对区域块的复杂度进行计算,并且为了结合 H.264 中宏块的大小,所以在本文中并没有一个固定的块的大小,按照 H.264 中宏块为单位进行嵌入的,当然最好的划分方式则是 8*8、 16*16、 4*4为单位进行划分块。嵌入的顺序也是先嵌入色度块,然后嵌入到亮度块中。对于作为秘密信息的深度信息,则把它固定为每个大小为 8Byte 的数据块。这样刚好如果是 16*16 的亮度块,则可以在一个亮度块里面放入四个深度数据平面块。如果是 8*8 的亮度块,则刚好一一对应, 如果是 4*4 的色度或亮度块时,则需要四个视频帧块来保存一个深度数据平面块。对于 8Byte 的数据平面的划分,则是按照对应权重位上面的所有的数据划分为到一个平面上面,不同的权重则划分到不同的平面上,在此只是以普通的二进制位为例做说明,如图,实际的程序设计过程中按照格雷码的格式进行平面的划分。
先后分别用十六进制和二进制表示出来,因为是十六进制容易被读取,看起来更加的直观,二进制表示法是为了更加清楚的表示位平面的划分过程。从上图可以看出以每列八个字节与每八行的八个字节的矩形形状构成一个块,总用 64 个字节。每一行每个字节的相同权重位上的二进制数据,按照原有的顺序组成新的八个字节,所构成的新的字节在行上面的排列顺序也不改变。 每个字节从高位到低位都是由相同位置的二进制位按照字节的顺序重新组合成一个新的字节,也即是新的平面,通过计算这个平面的复杂度来决定是否在该平面嵌入深度信息数据。