通过 LSB 替换方法理解图像隐写术
Understanding image steganography by LSB substitution method
我很难理解 LSB based steganography method given in Section 2. The examples in the internet are very confusing and unclear. I am following the Matlab implementation https://www.mathworks.com/matlabcentral/fileexchange/41326-steganography-using-lsb-substitution 和题为“使用 LSB 替换的图像隐写术调查”的论文
技巧 " 下载 link (https://irjet.net/archives/V4/i5/IRJET-V4I566.pdf)
本文第 5 节给出了基于 LSB 的方法的示例。假设 P1 = [10011011], P2 = [01101010], P3 = [11001100]
是要嵌入消息 M = [011]
的封面图像的 3 个字节。嵌入的结果是P1 = [10011010], P2 = [01101011],
P3 = [11001101]
。
我不知道这个答案是怎么来的。有人可以帮忙给出 steps/working 示例来阐明这个概念吗?
根据我对Matlab代码的理解,
Stego = uint8(round(bitor(bitand(x, bitcmp(2^n - 1, 8)) , bitshift(y, n - 8))));
如果n
是要替换的位数,则n
位组通过对n
位组进行补码/比较来替换封面图像(x
变量)和消息的 n
位(y
变量)。如果位相同,则不进行替换,否则交换位。不知道我的理解对不对
你的困惑源于你正在查看的所有 3 个来源都在谈论不同的东西。
论文 2,第 5 部分
这描述了 LSB 像素替换隐写术的最基本形式。每个像素由 8 位描述。对于每个像素,我们清除 LSB 并将其替换为一位秘密消息。例如,
pixels = [xxxxxxxa, xxxxxxxb]
message = [c, d]
stego_pixels = [xxxxxxxc, xxxxxxxd]
其中 x
、a
、b
、c
和 d
是位,我们不关心 x
是什么.
论文 1,第 2 部分
这是 LSB 像素替换隐写术的一般形式。您不是将秘密嵌入 LSB,而是将其嵌入 k-most LSB。如果 k = 1
,那么我们就有上面描述的简单形式。本节的数学方程式含义如下:
- 我们有一张大小为 MxN 的图像,每个像素的值都在 0 到 255(8 位)之间。
- 我们有一个 n-bit 消息,每个位为 0 或 1。例如,对于 12 位,它将是
m = [a, b, c, d, e, f, g, h, i, j, k, l]
.
- 由于我们将在每个像素中嵌入 k 位,因此我们将消息位分组为 k 组。假设
k = 3
,那么,m' = [abc, def, ghi, jkl]
。显然,每个组可以有一个介于 0 和 2^k - 1 之间的值。此外,m'
中的组数不能超过我们图像的大小,否则我们将无法嵌入整个消息。
- 我们清除每个像素的最后 k 位,并用一组
m'
替换它们。当你用 2^k 取模时,你得到的余数是原始数字的最后 k 位。所以通过减去它们,我们清除了最后 k 位。
- 与上一步类似,如果我们想要提取消息,我们将每个像素与 2^k 取模以获得最后 k 位,我们在其中嵌入了我们的消息。拼接这些位组并获得原始消息是微不足道的,
m
,back.
Matlab代码
此代码将大小为 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。让我们调用 cleared_pixels = bitand(x, mask)
.
bitshift(y, 8 - k)
只保留秘密的 k 个最高有效位。例如,对于 k = 3,我们实现 abcxxxxx -> 00000abc
。这是通过将数字 5 位置向右移动来完成的。这是一个logical shift operation。我们将此结果称为 secret = bitshift(y, 8 - k)
.
最后,bitor(cleared_pixels, secret)
简单地将两者结合在一起。被清除的像素最后 k 位被清除,秘密最多为 k 位,因此两部分不相互作用;我们得到一个纯组合。
我很难理解 LSB based steganography method given in Section 2. The examples in the internet are very confusing and unclear. I am following the Matlab implementation https://www.mathworks.com/matlabcentral/fileexchange/41326-steganography-using-lsb-substitution 和题为“使用 LSB 替换的图像隐写术调查”的论文 技巧 " 下载 link (https://irjet.net/archives/V4/i5/IRJET-V4I566.pdf)
本文第 5 节给出了基于 LSB 的方法的示例。假设 P1 = [10011011], P2 = [01101010], P3 = [11001100]
是要嵌入消息 M = [011]
的封面图像的 3 个字节。嵌入的结果是P1 = [10011010], P2 = [01101011],
P3 = [11001101]
。
我不知道这个答案是怎么来的。有人可以帮忙给出 steps/working 示例来阐明这个概念吗?
根据我对Matlab代码的理解,
Stego = uint8(round(bitor(bitand(x, bitcmp(2^n - 1, 8)) , bitshift(y, n - 8))));
如果n
是要替换的位数,则n
位组通过对n
位组进行补码/比较来替换封面图像(x
变量)和消息的 n
位(y
变量)。如果位相同,则不进行替换,否则交换位。不知道我的理解对不对
你的困惑源于你正在查看的所有 3 个来源都在谈论不同的东西。
论文 2,第 5 部分
这描述了 LSB 像素替换隐写术的最基本形式。每个像素由 8 位描述。对于每个像素,我们清除 LSB 并将其替换为一位秘密消息。例如,
pixels = [xxxxxxxa, xxxxxxxb]
message = [c, d]
stego_pixels = [xxxxxxxc, xxxxxxxd]
其中 x
、a
、b
、c
和 d
是位,我们不关心 x
是什么.
论文 1,第 2 部分
这是 LSB 像素替换隐写术的一般形式。您不是将秘密嵌入 LSB,而是将其嵌入 k-most LSB。如果 k = 1
,那么我们就有上面描述的简单形式。本节的数学方程式含义如下:
- 我们有一张大小为 MxN 的图像,每个像素的值都在 0 到 255(8 位)之间。
- 我们有一个 n-bit 消息,每个位为 0 或 1。例如,对于 12 位,它将是
m = [a, b, c, d, e, f, g, h, i, j, k, l]
. - 由于我们将在每个像素中嵌入 k 位,因此我们将消息位分组为 k 组。假设
k = 3
,那么,m' = [abc, def, ghi, jkl]
。显然,每个组可以有一个介于 0 和 2^k - 1 之间的值。此外,m'
中的组数不能超过我们图像的大小,否则我们将无法嵌入整个消息。 - 我们清除每个像素的最后 k 位,并用一组
m'
替换它们。当你用 2^k 取模时,你得到的余数是原始数字的最后 k 位。所以通过减去它们,我们清除了最后 k 位。 - 与上一步类似,如果我们想要提取消息,我们将每个像素与 2^k 取模以获得最后 k 位,我们在其中嵌入了我们的消息。拼接这些位组并获得原始消息是微不足道的,
m
,back.
Matlab代码
此代码将大小为 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。让我们调用 cleared_pixels = bitand(x, mask)
.
bitshift(y, 8 - k)
只保留秘密的 k 个最高有效位。例如,对于 k = 3,我们实现 abcxxxxx -> 00000abc
。这是通过将数字 5 位置向右移动来完成的。这是一个logical shift operation。我们将此结果称为 secret = bitshift(y, 8 - k)
.
最后,bitor(cleared_pixels, secret)
简单地将两者结合在一起。被清除的像素最后 k 位被清除,秘密最多为 k 位,因此两部分不相互作用;我们得到一个纯组合。