我很难理解第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
变量)。如果位相同,则不进行替换,否则交换位。我不知道我的理解是否正确。
答案 0 :(得分:2)
你的困惑源于这样一个事实:你所看到的所有三个来源都在谈论不同的事情。
这描述了LSB像素替换隐写术的最基本形式。每个像素由8位描述。对于每个像素,我们清除LSB并用一位秘密消息替换它。例如,
pixels = [xxxxxxxa, xxxxxxxb]
message = [c, d]
stego_pixels = [xxxxxxxc, xxxxxxxd]
x
,a
,b
,c
和d
都是位,我们不关心x
是什么
这是LSB像素替换隐写术的一般形式。不是将秘密嵌入LSB中,而是将其嵌入到k-most LSB中。如果k = 1
,那么我们就有上面描述的简单形式。数学方程式本节的意思如下:
m = [a, b, c, d, e, f, g, h, i, j, k, l]
。k = 3
,然后m' = [abc, def, ghi, jkl]
。显然,每个组的值可以在0到2 ^ k - 1之间。此外,m'
中的组数不能超过我们图像的大小,否则我们无法嵌入整个组消息。m'
替换它们。当你用2 ^ k取一个数的模数时,你得到的余数是原始数的最后k位。因此,通过减去它们,我们清除了最后的k位。m
,这是微不足道的。此代码将大小为MxN的图像隐藏到相同大小的封面图像。这里的想法是MSB拥有关于图像和LSB最少的信息。例如,这是this image的位平面分解。
如果我们决定隐藏秘密图像中的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位,因此这两个部分不会相互作用;我们得到了一个纯粹的组合。