如何在jpeg文件中隐藏文件

16
我正在阅读一篇关于如何在JPEG图片中隐藏文件的文章(How to Hide Files in JPEG Pictures)
我想知道,一个文件如何同时包含JPEG数据和RAR文件,而且既不会对图像产生可见的扭曲,也不会对压缩文件产生影响。
我的猜测是这可能与压缩文件或JPEG文件在二进制形式下的表示方式有关,但我不知道这是如何实现的。
能否有人详细说明一下?
4个回答

12

这只是在JPEG流的末尾添加一个归档文件。你希望JPEG解码器不会读取超过EOI标记,在那里找到数据并报错。

JPEG图像是以SOI标记开头,以EOI标记结尾的一系列字节流。

ZIP和RAR是字节流。ZIP流以50 4B开头。RAR流以52 61 72 21 1A 07开头。

上面链接中描述的方法将(多个)JPEG流的二进制副本与ZIP或RAR流附加在一起。

RAR/ZIP解码器会扫描流,直到找到RAR或ZIP的签名(忽略JPEG流)。


档案程序如何跳过JPEG数据以进入存档?它如何知道JPEG何时结束并开始存档数据? - yasar
它必须在数据流中寻找自己的标识。这个技巧可能适用于大多数二进制文件类型。因此,它可能不会扫描JPEG并寻找EOI标记。 - user3344003

3
这个答案并不针对你提供的链接中的确切情况,但它提供了另一种隐藏数据的方法:
理论上也可以将文件隐藏在JPEG图片本身中,但您需要一个复杂的程序来编写和读取编码数据。
基本上,JPEG照片包含大量信息,如果更改这些信息,人眼是无法察觉到的。想象一下,你有一张穿着蓝色衬衫的人的照片。如果你放大衬衫部分,你会发现它不是均匀的蓝色,而是由许多颗粒状的颜色组成,其中大多数是蓝色调(但有些可能是其他颜色)。你可以轻松地将其中一些颗粒换成稍微不同的颜色,这对图片来说没有明显的可见差异。
聪明的程序可以通过微调像素以表示数据的模式,在照片中嵌入代码。一个非常简单的例子:如果“色调”(即颜色调)用介于0和255之间的数字表示,则偶数色调的像素可以表示为“0”位,奇数色调的像素可以表示为“1”位。这对人眼来说很难检测到图片中的差异。
这是一个古老的想法,这篇文章讨论了可以用这种方式隐藏多少数据:High capacity data hiding in JPEG-compressed images (2004)

1
一般来说,将一个文件隐藏在另一个文件中是一种被称为隐写术的做法。你提供的链接描述的方法仅仅是使用+操作符将.rar连接到.jpg的末尾,利用每个文件类型的不同头部。@user3344003在他/她的回答中出色地解释了为什么这样做有效。这并不会扭曲图像,因为图像数据保持不变。

在图像中隐藏文件的另一种常见方法是使用每个字节的最低有效位(LSB)。这种方法是将图像的比特流中的每第8位替换为您希望隐藏的文件的下一位。这种方法的原理是,图像的颜色可以略微扭曲而不容易被人眼察觉。在这种方法中,图像在磁盘上的大小不会像您链接中的方法那样增加。这使得隐藏文件的证据更难被检测到。有关此方法和其他隐写术方法的详细信息,请参见Bret Dunbar的本文


0

有一个简单的算法,我用matlab实现了它。如果你将图像分成8位,最高有效位包含最有价值的信息,你可以删除位0和位1而不会对原始图像造成任何改变。因此,你可以将你的文件放在位0和1的位置。我在anil.k.jain的书中看到了这个算法。


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