在 jpeg 文件中隐藏文件是如何工作的
Posted
技术标签:
【中文标题】在 jpeg 文件中隐藏文件是如何工作的【英文标题】:How does hiding files in jpeg file works 【发布时间】:2015-06-20 08:25:50 【问题描述】:我正在阅读一篇解释How to Hide Files in JPEG Pictures的文章。
我想知道一个文件怎么可能同时包含 jpeg 数据和 rar 文件而对图像或压缩文件没有任何可见的失真。
我的猜测是它与压缩文件或 jpeg 文件如何以二进制形式表示有关,但我不知道这是如何工作的。
有人可以详细说明吗?
【问题讨论】:
【参考方案1】:所做的只是将存档添加到 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 流)。
【讨论】:
还有,archieve 程序怎么会跳过 jpeg 数据进入 arhieve。它如何知道 jpeg 的结束位置和归档数据的开始位置? 它必须在数据流中寻找自己的签名。大概这个技巧适用于大多数二进制文件类型。所以它可能没有扫描 JPEG 并寻找 EOI 标记。【参考方案2】:此答案并未解决您提供的链接中的确切情况,但它提供了另一种隐藏数据的方式:
理论上也可以将文件隐藏在 JPEG 图片本身中,但您需要一个复杂的程序来写入编码数据,然后再次读取它。
基本上,JPEG 照片包含大量信息,如果这些信息发生变化,人眼将无法察觉。想象一下,你有一张穿着蓝色衬衫的人的照片。如果你放大那件衬衫,你会发现它不是一种均匀的蓝色,而是由许多颜色的斑点组成,其中大部分是蓝色调(但也有一些可能是其他颜色)。您可以轻松地将其中一些斑点更改为稍微不同的色调,并且不会对图片产生明显的明显差异。
一个聪明的程序可以通过巧妙地将像素更改为代表数据的模式,在照片中嵌入代码。一个非常简单的例子:如果“色调”(即色调)由 0 到 255 之间的数字表示,偶数色调的像素可以表示“0”位,奇数色调的像素可以表示“1”位。人眼很难检测到图片中的这种差异。
这是一个古老的想法,本文讨论了这种方式可以隐藏多少数据:High capacity data hiding in JPEG-compressed images (2004)
【讨论】:
【参考方案3】:有一个简单的算法,我用 matlab 实现了它。如果您将图像划分为 8 位。最高位具有最有价值的信息,您可以删除位 0 和位 1,而不会对原始图像进行任何更改。所以你可以把你的文件而不是位 0 和 1。我在 anil.k.jain 书中看到了这个算法。
【讨论】:
【参考方案4】:一般来说,将一个文件隐藏在另一个文件中是一种称为Steganography 的做法。您提供的链接中描述的方法只是使用+
运算符将.rar
连接到.jpg
的末尾,利用每种文件类型的不同标头。 @user3344003 很好地解释了为什么这在 his/her answer 中有效。这不会扭曲图像,因为图像数据保持不变。
在图像中隐藏文件的另一种常用方法是使用每个字节的最低有效位 (LSB)。执行此操作的方法是将图像比特流中的每 8 位替换为您希望隐藏的文件的下一位。这是可行的,因为图像的颜色可能会略微失真,而人眼不易察觉。在这种方法中,磁盘上的图像大小不会像链接中的方法那样增长。这使得隐藏文件的证据更难检测。有关此方法和其他隐写方法的详细信息,请参阅this paper by Bret Dunbar。
【讨论】:
以上是关于在 jpeg 文件中隐藏文件是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章
我的训练数据集中的隐藏文件使 tensorflow 返回“未知的图像文件格式。需要 JPEG、PNG、GIF、BMP 之一。”