Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Good library for Digital watermarking

Can somebody help me, to find a library, or a detailed description of algorithm, that could embed a Digital watermark(invisible watermark, just a kind of steganography) to a jpeg/png file. But the quality of algorithm, should be great. It should be possible to extract this mark after rotation and expansion(if possible) of image.

Mark is just a key 32bytes.

I found a good site, but the algorithm are made for the NetPBM format, that is dead...

I know that there is a LSB method, but it is not stable to the expansion. Are there something better?

Changing metadata, is not suitable, because it is visible changes.

like image 367
briskly Avatar asked Feb 03 '12 11:02

briskly


2 Answers

Pistache is right in what he told you regarding the watermarking implementation algorithms. I will try to help you by showing one algorithm for the given requirements.

Before explaining you the algorithms first I guess that the distinction between the JPG and PNG formats should be done.

  1. JPEG is a lossy format, i.e, the images are susceptible to compression that could remove the watermark. When you open an image for manipulation purposes and you save it, upon the writing procedure, a compression is made by using DCT filtering that removes some important components of the image.
  2. On the other hand, PNG format is lossless, and that means that images are not susceptible to such kind of compression when stored after manipulation.

As a matter of fact, JPEG is used as a watermarking scheme attack due to its compressing characteristic that could remove the watermark if an attacker performed the compression.

Now that you know the difference between both formats, I can tell you a suitable algorithm resistant to the attacks that you mentioned.

Regarding methods to embed a watermark message for PNG files you can use the histogram embedding method. The histogram embedding method changes values on the histogram by changing the values of the neighbor bins. For example imagine that you have a PNG image in grayscale. Therefore, you'll have only one channel for embedding and that means that you have one histogram with 256 bins. By selecting the neighbor bins x and x+1, you change the values of x and x+1 by moving the pixels with the bright x to x+1 or the other way around, so that (x/(x+1))>T for embedding a '1' or ((x+1)/x)>T for embedding a '0'.

You can repeat the same procedure for the whole histogram length and therefore you can embed in the best case up to 128bits. However this payload is less than what you asked. Therefore I suggest you to split the image into parts, for example blocks, and if you split one image into 4 components you'd be able to embed in the best case up to 512 bits which means 64 bytes. This method although is very, susceptible to filtering and compression if applied straight in the space domain. Therefore, I suggest you to compute before the DWT of the image and use its low-frequency sub-band. This will provide you better transparency and robustness increased for the warping, resizing etc attacks and compression or filtering as well.

There are other approaches such as LPM (Log Polar Maps) but they are very complex to implement and I think for your case this approach would be fine.

I can suggest you two papers, the first is:

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

This paper will give you some basic notions of watermarking and explain more in detail the LSB algorithm. And the second paper is:

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

This paper will explain the algorithm that I just explained now.

Cheers,

like image 71
mustakarhu Avatar answered Oct 22 '22 19:10

mustakarhu


This maybe won't really be an answer, as I don't think it would be easy to give a magical, precise answer on this question.Watermarking is complex, and the best way to do it is by yourself : this will make things more hard for an attacker trying to reverse engineer your code. One could even read your question here, guess what library you used, and attack your system more easily.

Making Steganography resist to expansion in JPEG images is also very hard, because the JPEG compression is reapplied after the expansion. There are in fact a bunch of JPEG steganography algorithms. Which one you should use, depends on what exactly do you require :

  • Data confidentiality ?
  • Message presence confidentiality ?
  • Message coherence after JPEG changes ?
  • Resistance to "Known Cover" attacks (when attackers try to find the message, based on the steganographic system) ?
  • Resistance to "Known Message" attacks (when attackers try to find the steganographic system used, based on the message) ?

From what I know, usually, algorithm that resist to JPEG changes (picture recompression) are often really easier to attack, whereas algorithms that run the "encode" stage during the JPEG compression (after the DCT (lossy) transform, and before the Huffmann (non-lossy) transform) are more prone to resist.

Also, one key factor about steganography is scale : if you have only 32bytes of data to encode in a, say, 256*256px image, don't use an algo that can encode 512bytes of data in the same size. Either use a scalable algorithm, either use an algorithm at its efficient scale.

Also, the best way to do good steganography is to know its limitations,and to know how steganalyzers work. Try these tools, so you can understand what attackers will do to your picture.^

Now, I cannot tell you what steganographic system will be the best for you, but I can give you some indications :

  • jSteg - Quite old, I don't think it will resist to JPEG changes
  • OutGuess - Quite old too, but one of the best algorithms
  • F5 (and F3/F4) - More recent, good algorithm, scientifical research behind.
  • stegHide

I think all of these are LSB based : the encoding is done during the JPEG compression, after the DCT and Quantization. The only non LSB-based steganography system I heard of was mentionned in this research paper, however, I did not read it to the end yet, so I cannot tell if this will meet your needs.

However, I'm not sure there exists a real steganography algorithm resisting to JPEG compression, to JPEG resize and rotation, resisting to visual and statisticals attacks. Or I'm not aware of it.

Sorry for the lack of precise answer, I tried to give you what I know on the subject, as it's always better to be more informed. Sorry also for the lack of proper English, I'm French, nobody's perfect :)

like image 26
pistache Avatar answered Oct 22 '22 17:10

pistache