良好的数字水印库

时间:2012-02-03 11:31:31

标签: watermark steganography

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

Mark只是一个关键的32字节。

我找到了一个很好的site,但算法是针对NetPBM格式制作的,已经死了......

我知道有一个LSB​​方法,但它对扩展不稳定。还有更好的东西吗?

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

3 个答案:

答案 0 :(得分:8)

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

使隐形术无法在JPEG图像中进行扩展也非常困难,因为在扩展后重新应用JPEG压缩。实际上有一堆JPEG隐写算法。您应该使用哪一个,取决于您需要什么:

  • 数据机密性?
  • 消息存在机密性?
  • JPEG更改后的消息一致性?
  • 抵抗"已知封面"攻击(当攻击者试图根据隐写系统找到该消息时)?
  • 抵抗"已知消息"攻击(当攻击者试图根据消息找到使用的隐写系统时)?

据我所知,通常,抵抗JPEG更改(图片重新压缩)的算法通常更容易攻击,而运行"编码的算法#34;在 JPEG压缩期间(在DCT(有损)变换之后,以及在Huffmann(无损)变换之前)阶段更容易抵抗。

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

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

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

  • jSteg - 相当陈旧,我认为它不会影响JPEG更改
  • OutGuess - 相当老,但是最好的算法之一
  • F5 (and F3/F4) - 最新的,良好的算法,背后的科学研究。
  • stegHide

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

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

很抱歉由于缺乏准确答案,我试图向您提供我对此主题的了解,因为随时了解情况总是更好。对不起,因为缺乏正确的英语,我是法国人,没有人会完美:)

答案 1 :(得分:4)

对于水印实现算法,Pistache就是他告诉你的。我将尝试通过显示给定要求的一种算法来帮助您。

在首先向您解释算法之前,我想应该完成JPG和PNG格式之间的区别。

  1. JPEG是有损格式,,图像易受压缩影响,可能会删除水印。当您打开图像以进行操作并保存时,在写入过程中,使用DCT过滤进行压缩,从而删除图像的一些重要组件。
  2. 另一方面,PNG格式无损,这意味着图像在操作后存储时不易受到这种压缩的影响。
  3. 事实上,JPEG被用作水印方案攻击,因为它的压缩特性可以在攻击者执行压缩时删除水印。

    既然你知道两种格式之间的区别,我可以告诉你一个适合你所提到的攻击的算法。

    关于为PNG文件嵌入水印消息的方法,您可以使用直方图嵌入方法。直方图嵌入方法通过改变相邻区间的值来改变直方图上的值。例如,假设您有一个灰度的PNG图像。 因此,您只有一个嵌入通道,这意味着您有一个256个二进制位的直方图。通过选择邻居箱 x x + 1 ,您可以更改 x x + 1 的值将亮度为 x 的像素移动到 x + 1 或反过来,以便(x /(x + 1))> T嵌入'1 '或((x + 1)/ x)> T用于嵌入'0'。

    您可以对整个直方图长度重复相同的步骤,因此您可以嵌入最多128位的最佳情况。但是,此有效负载小于您的要求。因此,我建议您将图像拆分为多个部分,例如块,如果将一个图像拆分为4个组件,则可以将其嵌入到最佳情况中 512位,表示64字节。 如果在空间域中直接应用,该方法虽然非常容易过滤和压缩。因此,我建议你在图像的DWT之前计算并使用其低频子带。这将为您提供更好的透明度和稳健性,增加翘曲,调整大小等攻击以及压缩或过滤。

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

    我可以建议你两篇论文,第一篇是:

    Watermarking digital image and video data. A state-of-the-art overview

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

    Real-Time Compressed- Domain Video Watermarking Resistance to Geometric Distortions

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

    干杯,

答案 2 :(得分:0)

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

查看Wikipedia

上的JPEG文件结构

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