什么是基本和最简单的隐写算法和方法?
我的意思是应用于图像的隐写术。
将数据隐藏到图像的简单程序如何工作?使用的主要技术是什么?程序如何在没有源图像的情况下识别图像中的加密消息?
什么是基本和最简单的隐写算法和方法?
我的意思是应用于图像的隐写术。
将数据隐藏到图像的简单程序如何工作?使用的主要技术是什么?程序如何在没有源图像的情况下识别图像中的加密消息?
什么是基本和最简单的隐写算法和方法?我的意思是应用于图像的隐写术。
很久以前我为此编写了一个库,所以我可以描述这个过程。
基本上,如果您有文件格式,比如说 24 位 BMP 格式。首先,您需要一种将像素读取和写入该文件格式的方法。了解文件格式后,您可以使用库或编写自己的库。
可以将图像视为一系列像素。考虑一个 4x4 像素的图像:
xxxx
xxxx
xxxx
xxxx
将这些像素编号为 1 到 16:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 16
上面编号的每个像素都有一个红色分量、一个绿色分量和一个蓝色分量。这些组件中的每一个都是 1 个字节,因此每个组件都可以视为 0 到 255 的值。(24 位 = 红色 8 位,绿色 8 位,蓝色 8 位)。所以上面的每个数字都有 3 组从 0 到 255 的值。
因此,在上面的 4x4 图像示例中,图像中共有 16pixels*3color_components = 48 字节的数据。通常你会做的是只使用每个颜色分量的最低有效位来编码你的图像。在这种情况下,您将有 48 位可用的数据位 = 6 字节可供您用于编码您想要的任何 6 字节消息。
为了使这更容易,让我们看一下将简单的 3 位消息编码为单个像素。假设我们每个颜色分量只使用 1 位。假设我们要对 3 位消息进行编码:111
这是对数据进行编码之前上面像素 1的值的示例:
R: 10101011
G: 11111010
B: 00011010
您所做的只是将最低有效位更改为新数据:
R:1010101 1
G:1111101 1
B:0001101 1
像素在人眼看来是一样的,但现在您使用的是最低有效位来表示您想要编码的数据。
如果您想将超过 3 位的数据编码到单个像素中,您也可以这样做。发生的情况是,您将编码的不仅仅是最低有效位,您可以使用最低 2 个有效位,或至少 3 个等。您使用的位越多,您将开始注意到在画面质量。不过,您最多可以使用 7 位,并且您的图像看起来仍然可以识别。
通常,您将拥有超过 3 位要编码的数据。您要编码的数据越多,您就必须拥有更多的像素,或者每个像素使用更多的位来对数据进行编码。假设您要编码 9 位数据,如果您只使用最低有效位,那么您需要 3 个像素来编码该信息。如果您只想使用 1 个像素,您可以通过使用每个颜色分量的 3 个最低有效位来编码该数据来做到这一点。
要进行此类工作,您可能需要创建一些函数来轻松处理数据位,从而抽象出不断处理位运算符的复杂性。
该技术会因不同的文件格式而有所不同,但概念是相同的。隐写术也可以仅指将数据隐藏在例如 GIF 扩展块中。通常,您可以通过改变图像的像素来隐藏它,或者在某些文件格式中通过颜色查找表来隐藏它。
一些图像在标题中有一个颜色查找表,然后像素是这些颜色查找表的索引。您可以做的是重新排序颜色查找表,以便最相似的颜色靠近在一起,然后您可以将数据编码到颜色查找表本身和像素的索引中。因为索引是否略有变化并不重要,因为查找表是根据相似排序的。
不过,您确实需要了解文件格式才能完成此类工作。或者至少使用可以为您处理文件格式和文件数据的库。如果你真的对这个主题感兴趣,我建议从一个简单的文件格式开始,比如 BMP 并学习它。您始终可以在www.wotsit.org等网站上找到文件格式规范。
程序如何在没有源图像的情况下识别图像中的加密消息?
你是对的。解码信息的程序不需要源图像。它的工作原理是它只是反过来,程序需要知道你使用了多少位数据编码并使用它来解码。它将简单地遍历每个像素并将这些位组合成字节并将这些字节写入文件。
修改位图像素的最低有效位。
有关不错的概述,请参阅此页面
从字面上看,隐藏图像中信息的方法有无数种。
一种简单的方法是注意更改每个 RGB 值的最低有效位不会产生明显的差异,因此设置图像中每个字节的最低有效位为我们提供(#-bits-in-image / 8)
了存储隐藏数据的位。