通过LSB替换方法

时间:2018-04-03 20:28:18

标签: algorithm matlab image-processing steganography

我很难理解第2节中给出的LSB based steganography方法。互联网上的例子非常令人困惑和不清楚。我正在遵循Matlab实现https://www.mathworks.com/matlabcentral/fileexchange/41326-steganography-using-lsb-substitution和题为“#34;使用LSB替换的图像规划的调查”的论文 技术"下载链接(https://irjet.net/archives/V4/i5/IRJET-V4I566.pdf

本文第5部分给出了基于LSB的方法的示例。假设P1 = [10011011], P2 = [01101010], P3 = [11001100]是封面图像的3个字节,消息M = [011]将嵌入其中。嵌入的结果是P1 = [10011010], P2 = [01101011], P3 = [11001101]

我无能为力地回答这个问题。有人可以帮助提供步骤/工作示例来清除这个概念吗?

基于我对Matlab代码的理解, Stego = uint8(round(bitor(bitand(x, bitcmp(2^n - 1, 8)) , bitshift(y, n - 8))));

如果n是要替换的位数,则通过对封面图像的n位组进行补码/比较来替换n位组(x变量)和消息的n位(y变量)。如果位相同,则不进行替换,否则交换位。我不知道我的理解是否正确。

1 个答案:

答案 0 :(得分:2)

你的困惑源于这样一个事实:你所看到的所有三个来源都在谈论不同的事情。

文件2,第5节

这描述了LSB像素替换隐写术的最基本形式。每个像素由8位描述。对于每个像素,我们清除LSB并用一位秘密消息替换它。例如,

pixels = [xxxxxxxa, xxxxxxxb]
message = [c, d]
stego_pixels = [xxxxxxxc, xxxxxxxd]

xabcd都是位,我们不关心x是什么

文件1,第2节

这是LSB像素替换隐写术的一般形式。不是将秘密嵌入LSB中,而是将其嵌入到k-most LSB中。如果k = 1,那么我们就有上面描述的简单形式。数学方程式本节的意思如下:

  1. 我们有一个大小为MxN的图像,每个像素的值介于0到255(8位)之间。
  2. 我们有一个n位消息,每个位都是0或1.例如,对于12位,它是m = [a, b, c, d, e, f, g, h, i, j, k, l]
  3. 由于我们将每个像素嵌入k个比特,因此我们将消息比特分组为k个。假设k = 3,然后m' = [abc, def, ghi, jkl]。显然,每个组的值可以在0到2 ^ k - 1之间。此外,m'中的组数不能超过我们图像的大小,否则我们无法嵌入整个组消息。
  4. 我们清除每个像素的最后k位,然后用一组m'替换它们。当你用2 ^ k取一个数的模数时,你得到的余数是原始数的最后k位。因此,通过减去它们,我们清除了最后的k位。
  5. 与上一步类似,如果我们想要提取消息,我们将每个像素的模数用2 ^ k得到最后的k位,我们已经嵌入了消息。将这些位组拼接起来并获得原始消息m,这是微不足道的。
  6. Matlab代码

    此代码将大小为MxN的图像隐藏到相同大小的封面图像。这里的想法是MSB拥有关于图像和LSB最少的信息。例如,这是this image的位平面分解。

    Bit plane decomposition

    如果我们决定隐藏秘密图像中的k位,我们希望那些是k个最重要的位。类似地,我们可以将它们隐藏在封面图像的k个最低有效位中。 k值越大,你就越隐藏这些秘密,以便进行更忠实的重建,但是你将更多的失真引入封面。

    让我们分解代码中的嵌套函数,看看它们的作用。我将使用k代替n来保持与上述部分的一致性。

    bitcmp(2^k - 1, 8)为8位创建2 ^ k - 1的补码。例如,如果k = 3,则2 ^ k - 1就像具有位00000111,并且显然其补码是11111000。我们将使用此数字作为掩码,因此mask = bitcmp(2^k - 1, 8)

    bitand(x, mask)将封面图像的最后k位x清零。这是bitwise AND operation,我们称第二部分为掩码的原因是因为我们有一个1,我们保留原始位,我们得到一个0,我们得到一个0.让我们调用{ {1}}。

    cleared_pixels = bitand(x, mask)仅保留秘密的k个最重要位。例如,对于k = 3,我们实现bitshift(y, 8 - k)。这是通过将数字5位置向右移动来完成的。这是logical shift operation。我们会将此结果称为abcxxxxx -> 00000abc

    最后,secret = bitshift(y, 8 - k)只是将两者结合在一起。清除的像素清除了最后的k位,秘密最多为k位,因此这两个部分不会相互作用;我们得到了一个纯粹的组合。