如何在JPG或GIF照片中隐藏信息?

25

如何在jpg或gif等图片文件内写入信息,而不破坏图片,并且不在图片上显示该信息?当然,整个想法是为了将信息以不被任何人察觉的方式发送到图片文件中(以在某种程度上提供安全性/隐私保护)!


2
请不要标记复合词。仅使用“信息”作为此问题的标签是完全无用的;而这个技术术语是“隐写术”。请不要删除它。http://en.wikipedia.org/wiki/Steganography - Mehrdad Afshari
1
谢谢你的提示,我之前不知道!:) - M. A. Kishawy
1
将信息存储在EXIF数据中。 - geoff
8个回答

48

你可以将一张 gif 图片和一个 zip 文件(你想要隐藏的信息)合并成一个文件。Gif 图片从文件开头开始读取,而 zip 文件从文件结尾开始读取。

在 Linux 中创建这样的文件:

$ cat file1.gif >> outfile.gif
$ cat file2.zip >> outfile.gif

生成的文件应该与file1.gif和file2.zip的大小相加,并且可以被任何GIF查看器和ZIP文件处理程序打开。


可能是隐藏信息最简单的方法 :) 但是如何检索它呢? - Burkhard
2
就像我之前所说的,您可以使用任何能够处理zip文件并提取信息的标准压缩软件打开生成的文件(outfile)。 - Maik
哎呀,我只读了前面的部分。稍后我会尝试压缩部分。 - Burkhard
这是UNIX特定的。我有一个Windows解决方案。 - Santosh Kumar
11
我也有一个Windows解决方案,但与@SantoshKumar不同,我想与您分享;-) copy /b“file1.gif”+“file2.zip”“outfile.gif” - mgr326639
你能不能只用 cat file1.gif file2.zip > outfile.gif 做这件事呢? - asdf3.14159

32
我确定有许多方法。这是其中一种:
在一张照片中,颜色的微小变化常常会被肉眼忽略,即使被注意到,也可能轻易地被误认为是图片质量的缺陷。
因此,以一个简单的例子为例,假设您有一张灰度GIF图像,其中调色板从白色到黑色排列,并具有平滑的灰度范围。我不确定您对图形文件格式了解多少,但在GIF中,每个像素有一个字节,每个可能的字节值映射到某个特定的颜色。因此,在这种情况下,我们可以说调色板#0=RGB(0,0,0),调色板#1=RGB(1,1,1),...调色板#255=RGB(255,255,255)。
然后,您拍一张普通的真实照片。将您的秘密消息分成单个位。将每个调色板索引号的最后一位设置为您消息的连续位。
例如,假设原始照片的前8个像素是01 00 C9 FF FF C8 42 43。您的消息以字母"C"开头,ASCII代码为0110 0111。因此,更改第一个字节的最后一位为0,将该字节从01更改为00。更改第二个字节的最后一位为1,将该字节从00更改为01。将第三个字节的最后一位更改为1。它已经是1了,所以没有变化。等等。您最终得到的编码8个字节为00 01 C9 FE FF C9 43 43。
颜色的变化是如此微妙,以至于看图片的人不太可能注意到。即使他们注意到了,除非他们有理由怀疑,否则他们很可能只会认为图片质量不完美。
当然,并不意味着您必须在秘密消息中每个字节使用1位。根据您认为可以逃避多少质量退化,您可以使用2位每字节,或仅在每隔一个字节中更改1位等。

当然,相同的技术也可以用于彩色照片:更改每个RGB分量中的最后一位以编码每个像素的3个比特,等等。


11

嗨,这种方法被称为隐写术。通过它我们不仅可以将信息隐藏在图像中,还可以在音频、视频和其他格式中隐藏。

这里有一个名为steganotool的开源隐写术软件。该项目是一款开源的隐写术工具,可用于将文本隐藏到/从位图图像中提取文本。

关于隐写媒介

图像中的隐写术

这种隐写术非常有效,可以实现各种目的,包括身份认证、消息隐藏和加密密钥传输。对于这种隐写术来说,最有效的方法通常是最低有效位方法。这意味着隐藏消息将改变图片字节的最后一位。通过改变那个最后一位,载体图像内的像素颜色几乎没有变化。这样就可以避免轻易地检测到消息。最适合隐藏信息的图像文件类型是24位位图。这是由于其大文件大小和高质量。

音频中的隐写术

在音频文件中,最常见的隐藏信息的方法是低位编码法。低位编码法与图像文件中使用的最不显著位方法有些相似。秘密信息附加在文件末尾。低位编码的问题之一是它可能会被人耳察觉到。如果有人试图隐藏信息,这可能很危险,因为它很容易被检测到。扩频技术是另一种在音频文件中使用的隐藏信息的方法。这种方法将随机噪声添加到音频广播中。该方法使信息能够在频谱上分散,并在随机噪声下保持隐藏状态。音频隐写术中最后一种方法是回声隐藏数据。这种方法通过使用声音文件自然产生的回声来隐藏信息。然后,可以向这些回声中添加额外的声音,额外的声音就是隐藏的消息。这是一种足够有效的隐藏信息的方式,特别是在某些情况下甚至可以改善原始音频文件的声音。

视频隐写术

视频隐写术基本上是将信息隐藏在每个视频帧中。只有少量信息被隐藏在视频中,通常完全不可见,但隐藏的信息越多,它将变得越明显。这种方法也是有效的,但必须正确执行,否则可能会揭示更多信息而不是隐藏。

文档隐写术

这基本上是在文档行的末尾添加空格和制表符。这种类型的隐写术非常有效,因为在大多数文本/文档编辑器中,使用空格和制表符是对人眼不可见的。

您还可以参考这个开源项目

这篇文章也可能很有用。


4
你可以将一些信息存储在图像元数据中。实际上,这就是许多数码相机“标记”照片的方式(例如相机型号、日期和时间、GPS坐标等)。
这种数据格式称为EXIF(可交换图像文件格式)。有很多编程语言使用它的示例。这里是Java的一个示例。
如果你想防止用户读取这些数据,可以对它们进行加密,但他们总是可以从你的图片中删除它(例如通过在Photoshop中打开并使用“另存为”功能)。

1
我认为Photoshop会用自己的数据重写这些数据。我认为有很多EXIF编辑器,例如我发现了免费软件Quick EXIF Editor http://www.photo-freeware.net/quick-exif-editor.php。 - RaYell
1
这个答案(虽然是好的)与问题无关。 Exif不会隐藏信息。 Exif是元数据,而不是隐写术。 - Guillaume
1
是的,如果你想在一张照片中隐藏数据,请查看有关隐写术的答案。前两个答案(目前)非常好。 - Guillaume
这并不真正“隐藏”信息。它以明文形式存储在文件中。许多图形程序都可以读取和显示它。 - Jay
EXIF数据最大的问题就是它可能会丢失。你有没有上传过照片到Facebook?这真的不应该是回答这个问题的答案。 - Santosh Kumar
显示剩余2条评论

2

如果您想要隐藏数据(文本、另一张图片等)在jpeg文件中,可以将其简单地附加到文件末尾。当查看图像时,您只会看到原始图像,添加的数据将被忽略。

虽然不是最好的隐藏数据方法,但这是一个很好的方法来隐藏另一个jpeg文件,因为如果有人在记事本或十六进制编辑器中打开文件,他们可能不会注意到有两个jpeg文件而不是一个,因为第二个图像的结尾看起来与第一个相同。


1
在gif文件中,压缩数据以可变大小的块为单位。每个块都以一个长度字节开头。通常这些块是255字节的数据(并且长度字节为255),除了最后两个块(最后一个块为0)。
但是你可以使用拼写消息的块重新编码gif,例如使用ASCII文本或字节1 2 3 4表示00 01 10 11二进制数据,
对gif进行字节频率分析会显示少于预期的255个字节。尺寸比原始尺寸大,但图像外观完全相同。

1
在Windows中,您可以使用简单的命令将存档隐藏在图像中:copy /b cat.jpg + Documents.rar cat_new.jpg。然后,例如使用winrar从图像中提取数据,就像从存档中一样。
但更好的方法是使用隐写术。
适用于Linux和Windows的简单程序:http://linux01.gwdg.de/~alatham/stego.html
使用此程序,您将使用密码短语,没有它,甚至没有人会知道您在图片中隐藏了一些数据))

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接