基本且最简单的隐写算法和方法是什么?我的意思是应用于图像的隐写术。
我很久以前就为此编写了一个库,所以我可以描述这个过程。
基本上,如果您有一种文件格式,可以说是 24 位 BMP 格式。首先,您需要一种将像素读取和写入该文件格式的方法。一旦您了解了文件格式是什么,您就可以使用库或编写自己的库。
图像可以被视为一系列像素。考虑 4x4 像素图像:
x x x x
x x x x
x x x x
x x x x
将这些像素编号为 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
这是值的示例pixel 1上面是在对数据进行编码之前:
电话:10101011
电话:11111010
乙:00011010
您所做的只是更改新数据的最低有效位:
电话:10101011
电话:11111011
乙:00011011
像素在人眼看来是一样的,但现在您使用最低有效位来表示您想要编码的数据。
如果您想将 3 位以上的数据编码为单个像素,您也可以这样做。发生的情况是,您将编码的不仅仅是最低有效位,您可以使用至少 2 个有效位,或至少 3 个等。您使用的位越多,您将开始注意到画面质量。不过,您最多可以使用 7 位,并且您的图像看起来仍然可以识别。
通常,您想要编码的数据会多于 3 位。您想要编码的数据越多,您就必须拥有更多的像素,或者每个像素使用更多的位数来编码数据。假设您想要编码 9 位数据,如果您只使用最低有效位,那么您需要 3 个像素来编码该信息。如果您只想使用 1 个像素,则可以通过使用每个颜色分量的 3 个最低有效位来编码该数据来实现。
要完成此类工作,您可能需要创建一些函数来轻松处理数据位,从而抽象化不断处理按位运算符的复杂性。
对于不同的文件格式,该技术会有所不同,但概念是相同的。隐写术也可以指隐藏数据,例如隐藏在 GIF 扩展块中。通常,您可以通过改变图像的像素来隐藏它,或者在某些文件格式中通过颜色查找表来隐藏它。
有些图像在标题中具有颜色查找表,然后像素是这些颜色查找表的索引。您可以做的是重新排序颜色查找表,使最相似的颜色靠近在一起,然后您可以将数据编码到颜色查找表本身和像素的索引中。因为即使索引稍微改变也没关系,因为查找表是根据相似性排序的。
不过,您确实需要了解文件格式才能完成此类工作。或者至少使用可以为您操作文件格式和文件数据的库。如果您确实对这个主题感兴趣,我建议您从 BMP 等简单的文件格式开始并学习它。您始终可以在以下网站上找到文件格式规范www.wotsit.org http://www.wotsit.org.
程序如何在没有源图像的情况下识别图像中的加密消息?
你是对的。解码信息的程序不需要源图像。
它的工作原理是,它只是执行相反的操作,程序需要知道您使用了多少位数据并使用相同的数据进行解码。它将简单地迭代每个像素并将这些位组合成字节并将这些字节写入文件。