12

有人可以帮我找到一个库或算法的详细描述,它可以将数字水印(不可见的水印,只是一种隐写术)嵌入到 jpeg/png 文件中。但是算法的质量,应该很棒。应该可以在图像旋转和扩展(如果可能)后提取此标记。

Mark 只是一个 32bytes 的密钥。

我找到了一个不错的网站,但是该算法是为 NetPBM 格式制作的,那已经死了……

我知道有一种LSB方法,但是它对扩展不稳定。有更好的吗?

更改元数据,是不合适的,因为它是可见的更改。

4

3 回答 3

9

这可能不是一个真正的答案,因为我认为在这个问题上给出一个神奇而准确的答案并不容易。水印很复杂,最好的方法是自己做:这会让事情变得对于试图对您的代码进行逆向工程的攻击者来说,难度更大。甚至可以在这里阅读您的问题,猜测您使用的库,并更轻松地攻击您的系统。

使隐写术抵抗 JPEG 图像的扩展也非常困难,因为 JPEG 压缩是在扩展后重新应用的。实际上有一堆 JPEG 隐写算法。你应该使用哪一个,取决于你到底需要什么:

  • 数据保密 ?
  • 消息存在保密性 ?
  • JPEG 更改后的消息一致性?
  • 抵抗“Known Cover”攻击(当攻击者试图找到消息时,基于隐写系统)?
  • 抵抗“已知消息”攻击(当攻击者试图根据消息找到使用的隐写系统时)?

据我所知,通常情况下,抵抗 JPEG 更改(图片重新压缩)的算法通常更容易受到攻击,而在 JPEG 压缩期间(DCT(有损)变换之后和 Huffmann 之前)运行“编码”阶段的算法(无损)变换)更容易抵抗。

此外,关于隐写术的一个关键因素是规模:如果您只有 32 字节的数据要编码到例如 256*256 像素的图像中,请不要使用可以以相同大小编码 512 字节数据的算法。要么使用可扩展的算法,要么使用有效规模的算法。

此外,做好隐写术的最佳方法是了解其局限性,并了解隐写分析器的工作原理。试试这些工具,这样你就可以了解攻击者会对你的图片做什么。^

现在,我不能告诉你哪种隐写系统最适合你,但我可以给你一些指示:

  • jSteg - 相当老了,我认为它不会抵抗 JPEG 的变化
  • OutGuess - 也很老了,但是最好的算法之一
  • F5(和 F3/F4) ——更新的、好的算法,背后有科学研究。
  • 隐藏

我认为所有这些都是基于 LSB 的:编码是JPEG 压缩期间完成的,在 DCT 和量化之后。在这篇研究论文中提到了我听说的唯一一个非基于 LSB 的隐写系统,但是我还没有读到最后,所以我不知道这是否能满足你的需求。

但是,我不确定是否存在一种真正的隐写算法来抵抗 JPEG 压缩、JPEG 调整大小和旋转、抵抗视觉和统计攻击。或者我不知道。

抱歉,没有准确的答案,我试图告诉你我对这个主题的了解,因为了解更多信息总是更好。也很抱歉缺乏适当的英语,我是法国人,没有人是完美的:)

于 2012-10-23T08:02:15.057 回答
5

Pistache 告诉您有关水印实现算法的内容是正确的。我将尝试通过针对给定要求展示一种算法来帮助您。

在首先向您解释算法之前,我想应该区分 JPG 和 PNG 格式。

  1. JPEG 是一种有损格式,图像容易受到可能去除水印的压缩。当您出于操作目的打开图像并保存它时,在写入过程中,会通过使用 DCT 过滤进行压缩,该过滤会删除图像的一些重要组成部分。
  2. 另一方面,PNG 格式是无损的,这意味着图像在处理后存储时不易受到这种压缩的影响。

事实上,JPEG 被用作水印方案攻击,因为它的压缩特性可以在攻击者执行压缩时去除水印。

既然您知道这两种格式之间的区别,我可以告诉您一种合适的算法来抵抗您提到的攻击。

关于为 PNG 文件嵌入水印消息的方法,您可以使用直方图嵌入方法。直方图嵌入方法通过更改相邻 bin 的值来更改直方图上的值。例如,假设您有一个灰度 PNG 图像。因此,您将只有一个用于嵌入的通道,这意味着您有一个包含 256 个 bin 的直方图。通过选择相邻的 bin xx+1,您可以通过将具有明亮x的像素移动到x+1或相反的方式来更改xx+1的值,这样 (x/(x+1)) >T 用于嵌入“1”或 ((x+1)/x)>T 用于嵌入“0”。

您可以对整个直方图长度重复相同的过程,因此您可以在最好的情况下嵌入最多 128 位。但是,此有效负载比您要求的要少。因此,我建议您将图像拆分为多个部分,例如块,如果您将一个图像拆分为 4 个组件,您可以在最好的情况下嵌入最多 512 位,这意味着 64 个字节。如果直接在空间域中应用,这种方法虽然非常容易受到过滤和压缩的影响。因此,我建议您在图像的 DWT 之前进行计算,并使用其低频子带。这将为您提供更好的透明度和鲁棒性,增加扭曲、调整大小等攻击以及压缩或过滤。

还有其他方法,例如 LPM(Log Polar Maps),但它们实施起来非常复杂,我认为对于您的情况,这种方法会很好。

我可以给你推荐两篇论文,第一篇是:

水印数字图像和视频数据。最先进的概述

本文将为您提供水印的一些基本概念,并更详细地解释 LSB 算法。第二篇论文是:

实时压缩域视频水印抗几何失真

本文将解释我刚才解释的算法。

干杯,

于 2013-02-07T14:59:32.260 回答
0

我不知道您是否正在考虑与隐写术不同的方法。您可以在 JPEG 文件中创建一个新数据块并存储加密数据,而不是存储隐藏在像素数据中的数据。

看看维基百科上的 JPEG 文件结构

您可以使用标记 0xFF 0xEn 创建应用程序特定的数据块。这样做,图像像素的任何变化都不会改变图像中存储的信息。此外,许多图像编辑软件尊重自定义数据块,即使在图像处理后也会保留它们。

于 2013-09-29T15:43:06.410 回答