Un filigrane invisible (blind watermark) est un message - generalement du texte ou une autre image - secreteement dissimule a l’interieur d’une photo “porteuse” de telle sorte que la photo reste visuellement identique a l’oeil nu. Le mot invisible (blind) signifie que l’image d’origine n’est pas necessaire pour retrouver le message : il suffit de donner la photo a l’extracteur et les donnees reviennent.
Si vous vous etes deja demande comment cela fonctionne, vous etes au bon endroit. L’astuce est l’une des idees les plus simples du traitement d’image, et vous pouvez l’essayer vous-meme en 30 secondes avec l’outil de filigrane invisible de Piick.
L’analogie de l’enveloppe et du timbre
Imaginez une carte postale. L’image au recto est la photo porteuse. Le message que vous voulez cacher est un petit mot que vous glissez sous le timbre - invisible jusqu’a ce que quelqu’un sache le soulever. Un filigrane invisible fait exactement la meme chose avec une photo numerique : il cache le mot sous une couche que votre oeil ne regarde jamais.
LSB : cacher un bit dans le bruit
Chaque pixel d’une photo en couleurs possede trois canaux - R, V, B - chacun stocke sous forme d’un nombre de 0 a 255. Ce nombre represente la luminosite de ce canal de couleur.
Voici l’idee cle : changer la valeur de ±1 est invisible pour l’oeil humain. 124 contre 125 en rouge ? Personne ne le voit. 200 contre 201 en vert ? Identique. Alors, si nous voulons glisser un 0 ou un 1 dans chaque canal, il suffit de remplacer le dernier bit du nombre par le bit que nous voulons envoyer. Ce dernier bit s’appelle le bit de poids faible, ou LSB (Least Significant Bit).
Un seul pixel nous donne 3 canaux x 1 bit = 3 bits secrets par pixel. Une modeste photo de 500x500 contient 250.000 pixels, donc 750.000 bits = environ 91 KB d’espace cache. Assez pour un paragraphe de texte. Pas assez pour une photo de 16 MB (plus d’explications ci-dessous).
Comment le message entre
L’encodeur transforme votre message en un flux de bits :
- Ecrit la longueur du message dans les 32 premiers bits (ainsi l’extracteur sait ou s’arreter).
- Ajoute les octets reels du message.
- Remplit le reste avec des bits aleatoires pour que l’espace inutilise ne revele pas ou finit le message.
- Parcourt les pixels dans un certain ordre (eventuellement melange par un mot de passe) et, pour chacun, remplace le LSB de R, puis V, puis B par le bit suivant du flux.
Pour retrouver le message, l’extracteur effectue le meme parcours en sens inverse, lit 32 bits pour connaitre la longueur, puis lit ce nombre d’octets.
Pourquoi le PNG est obligatoire
Si vous prenez une photo filigranes et que vous l’enregistrez en JPEG, le filigrane disparait. Pourquoi ?
Le JPEG est un format avec perte - il reduit la taille du fichier en supprimant des details que l’oeil ne remarquera probablement pas. Arrondit 124 a 123, arrondit 200 a 199, moyenne les pixels voisins… exactement le type de petites modifications du LSB que nous avons faites. Le JPEG est, en pratique, en train d’effacer notre message cache.
Le PNG, en revanche, est sans perte. Chaque octet qui entre ressort inchange. C’est pourquoi les outils de filigrane invisible produisent toujours du PNG et pourquoi vous devez re-exporter en PNG chaque fois que vous voulez conserver le filigrane.
Copier une carte postale -> reste lisible. Photocopier une carte postale -> le tampon de la poste se brouille. Le PNG est l’original ; le JPEG est la photocopie.
Pourquoi la couverture doit etre enorme
Le LSB nous offre 3 bits par pixel. Pour integrer un contenu de 1 MB il vous faut au moins 1.000.000 x 8 / 3 ≈ 2,7 millions de pixels - environ 1650x1650. Pour integrer 16 MB (un PNG 2048x2048 avec alpha) il vous faut environ 44 megapixels de couverture, c’est pourquoi une couverture 500x500 echoue immediatement : elle ne dispose que de 91 KB de capacite, soit trois ordres de grandeur de moins.
Lorsque vous televersez une image de couverture dans l’outil Piick, la carte chargee affiche la capacite de la couverture en temps reel, vous pouvez donc verifier avant de cliquer sur Cacher.
Un mot de passe n’est pas du chiffrement
Si vous cochez le champ mot de passe, Piick melange l’ordre des pixels a l’aide d’une sequence aleatoire deterministe derivee de votre mot de passe. Sans le mot de passe, les octets extraits ressemblent a du bruit - l’en-tete de longueur de 32 bits ne se parse pas, donc l’extracteur indique “aucun filigrane trouve”.
Il s’agit d’obfuscation, pas de chiffrement. Quiconque connait la technique peut toujours extraire les bits un par un et essayer chaque mot de passe possible hors ligne. Pour un partage detendu (conserver une note privee dans une image publique) c’est largement suffisant. Pour quoi que ce soit de sensible, utilisez un vrai chiffrement au prealable.
Essayez par vous-meme
La technique entiere tourne dans votre navigateur en quelques centaines de lignes de JavaScript. Ouvrez l’outil de filigrane invisible de Piick, deposez n’importe quel PNG, tapez une courte note et cliquez sur Cacher. Le PNG produit parait identique - mais ouvrez l’onglet d’extraction et la note revient intacte.
Vous preferez un guide pratique pas a pas ? Lisez le mode d’emploi.
Tout ce qui est decrit ci-dessus se deroule localement dans votre navigateur. Piick n’envoie jamais vos images.