Nous allons ici parler d'un autre sujet que je juge assez proche de la cryptographie sur certains plans. Il s'agit de la dissimulation de données dans des documents. Le but premier de ces techniques est de permettre la signature de documents (pour pouvoir y mettre des copyright) mais on peut l'utiliser pour d'autres choses (plus ou moins légales). Le plan que nous allons adopter va nous permettre de passer en revue les différents supports numériques utilisés pour dissimuler des données: le texte, l'image, le son, la 3D . Pour ceux qui sont interessés je propose un bref historique de la stéganographie.
Vous trouverez aussi une bibliographie des publications traitant des attaques et du marquage du texte, de l'audio, de la 3D et du code : Biblio (Zip), Biblio (Doc).
Vous pouvez aussi télécharger un document proposant une introduction au watermarking ( .doc ou .rtf )
J'ai réservé une page pour tous les liens traitant du sujet White Links.

Rem: Tout au long des différents articles, je vais parler très librement de Stéganographie (en anglais: steganography ou data hiding) et de watermarking (ou tatouage). Je fais ici, une erreur qui peut entrainer des confusions chez le lecteur. Je m'en excuse et je tacherai de lever le doute dès que possible. Ces deux techniques sont très proches l'une de l'autre, mais n'ont pas les mêmes objectifs, ni les mêmes contraintes.
En fait, on peut considérer que le watermarking est une sous-partie de la stéganographie. Dans le cas du Data Hiding, on cherche à dissimuler une quantité très importante de données (par exemple une image dans une autre image).
Dans le cas du watermarking, on cherche juste à marquer une image (on se limite souvent à la dissimulation d'un bit: marqée/pas marquée). Le but du watermaking est de dissimuler une information qui à pour but de démontrer l'intégrité du document ou encore de protéger les droits d'auteurs.
Une autre différence très importante entre la stéganographie et le watermarking se situe au niveau des attaques qui peuvent avoir lieu contre ces techniques. En stéganographie, le pirate va chercher à lire les données dissimulées dans le document, tandis que dans le cas d'un document "watermarké" va chercher à "laver" le document de toute signature possible (ou alors il peut essayer d'usurper l'identité de l'auteur).

Le Texte

La dissimulation de données dans du texte est une chose bien particulière, et comme nous allons le voir elle n'a pas grand chose à voir avec l'image ou le son. Et ceci pour plusieurs raisons: on ne travaille pas avec le texte dans "l'a peu près". Je m'explique, dans une image on peut considerer qu'"endommager" celle ci avec un filtre passe-haut suffisamment "léger" ne change quasiment rien à la perception que nous allons avoir de celle-ci. Par contre avec un texte, soit le texte est comme l'original soit il ne l'est pas. Celui ci ne permet quasiment aucune modification. Une des exigences de la dissimulation de données est d'endommager le moins possible le texte original. Pour cela nous allons utiliser la méthode dite des "espaces".

Méthodes des "espaces" (en fin de phrases)

Alors la, c'est une méthode qui va peut être vous sembler bourrine mais bon dans le cas du texte il n'y pas beaucoup de choix comme vous allez le voir. Il y a encore ici 2 méthodes différentes quoi que reposant sur le même principe. La première méthode consiste à mettre des espaces en fin de ligne. On se définit un code à suivre et l'on commence:

0 espace en fin de ligne correspond à 0.
1 espace en fin de ligne correspond à 1.

Ca y est nous avons la base pour coder un message. Ex: ( ici les espaces sont remplacés par des "_" pour plus de lisibilité ).

bonjour ceci est un message caché. A vous de le lire._ Je pense que vous commencez_ à comprendre le principe. Malheureusement tout n'est pas_ rose. Mais bon, nous arrivons quand meme à_ dissimuler un octet._

Comme vous pouvez le voir dans notre exemple nous avons codé:
0 espace; 1 espace; 1 espace; 0 espace; 1 espace 0 espace; 1 espace; 1 espace.
<=> 01101011

Bravo voici un octet de dissimulé. Je vous avais prévenu c'est assez nul comme méthode mais on fait avec. Alors les problèmes liés à la méthode:
- Il faut énormement de lignes pour coder peu de texte. En effet, il faut 8 lignes pour coder 1 octet. Donc imaginons que l'on veuille coder une phrase de 20 mots (chaque mot faisant environ 4 caractères) et que l'on code chaque caractères sur 7 bits (on optimise comme on peut), il va nous falloir environ 560 lignes.... pas terrible comme rentabilité.
- Super visible par une personne extérieure qui s'y attend un peu. Et donc facilement manipulable.

Les avantages:
- Très facile et donc très simple à implémenter. Et puis ça peut marcher avec de nombreuses personnes. Bon je vois déjà des petits malins qui se disent qu'il suffit de rajouter des espaces pour coder plus de caractères sur moins de texte (vous me suivez ?). Et bien oui, mais bon alors la ça se voit comme le nez au milieu de la figure. Pour ceux qui ne comprennent pas je réexplique : En utilisant 3 espaces:
- 0 espace <=> 00
- 1 espace <=> 01
- 2 espace <=> 10
- 3 espace <=> 11
Il faut alors 4 lignes pour coder 1 octet (au lieu de 8).

Méthodes des "espaces" (entre les mots)

Cette méthode est basée sur le même principe, mais cette fois-ci nous allons coder notre texte dans le nombre d'espaces entre chaque mots. C'est encore plus visible que la méthode précedente, mais le rapport texte codé sur texte hôte est beaucoup plus important.
On se met d'abord d'accord sur une convention :
- un espace entre 2 mots suivit de deux espaces entre les 2 mots suivants <=> 0
- deux espaces entre 2 mots suivit d'un espace entre les 2 mots suivants <=> 1

Pour mieux comprendre voici un exemple avec le texte suivant:

Ceci_est__essai__de_texte__caché_dans__un_texte_hôte. Vous__devez__avouer que_ce__n'est_pas_très__subtil.
_ __ : 0
__ _ : 1
__ _ : 1
__ _ : 1
_ __ : 0
__ _ : 1
__ _ : 1
_ __ : 0

=> 01110110

Et ça y est vous avez codé un octet. Voici le texte tel qu'il va réellement apparaitre, à vous de jugez si cela vous convient:
Ceci est essai de texte caché dans un texte hôte. Vous devez avouez que ce n'est pas très subtil. Voyons un peu le rapport texte à coder sur texte hôte. Il vous faut 2 mots pour un bit, donc pour une phrase de 20 mots (20*7=240 bits), il faut un texte hôte de 480 mots, en comptant 10 mots par ligne on arrive à environ 50 lignes. On gagne un rapport de 10 comparé à la méthode des espaces en fin de ligne. Pas mal !! à vous de juger. Si vous pensiez que ces méthodes étaient étranges, attendez de voir les suivantes.

Méthode des synonymes

Alors là votre texte ne va pas être désorganisé mais il risque d'en prendre un coup au niveau sémantique. Encore une méthode simplissime à comprendre..... Il suffit de créer une table des synonymes du genre:


0 1
gros obèse
petit minuscule
riche fortuné
beau joli
nourriture aliment
bateau navire
femme épouse
tranquille calme


Et ensuite il vous reste à écrire votre texte:

Au loin je vois mon gros navire sur la mer tranquille. Oui je suis fortuné, j'ai une belle épouse et je mange de très bons aliments, et ma voiture est loin d'etre minuscule.

Dans ce texte qui a l'air innocent nous avons masqué 1 octet:
gros : 0
navire : 1
tranquille: 0
fortuné : 1
belle : 0
épouse : 1
aliments: 1
minuscule: 1
<=> 01010111

Cette méthode est bien sympa, mais alors bonjour la galère à implémenter, et surtout il faut quand meme s'autoriser une petite verification du texte après. En effet, notre belle langue ne permet pas tout les délires. Par exemple: je vois passer dans la rue une superbe femme et je vois passer dans la rue une superbe épouse peut preter à confusion. Bon passons à la méthode suivante:

Méthode syntaxique

Juste un rapide coup d'oeil sur une méthode relativement peu utilisable. En effet cette méthode peut altérer le sens d'une phrase, demande enormément de texte pour en coder peu. On part du principe que certaines règles de grammaire sont un peu litigieuses et donc modifiables, sans pour autant choquer le commun des mortels (je m'excuse par avance auprès des experts en langue française du massacre que je vais commetre). Voici l'esprit de la méthode.
Voici deux phrases quasiment équivalentes:

après y avoir passé deux mois et trois jours
après y avoir passé deux mois et, trois jours

La virgule après le "et" ne choque pas trop dans certains cas on peut donc se permettre coder un bit sur le respect ou non de la virgule après le "et":

et <=> 0
et, <=> 1

Je vous laisse imaginer le nombre de mots qu'il faut pour coder une phrase, c'est l'horreur. Mais rien ne vous interdit d'utiliser plus d'une règle pour coder votre message.

conclusion

La stéganographie sur un support texte est quelque chose qui ne supporte pas la faintaisie. En effet chaque retouche est dirctement visible par le lecteur. D'autre part un texte signé par les méthodes décrites est relativement facilement identifiable.

L'Image

Il s'agit ici du domaine le plus vaste et certainement du plus interessant. En effet, les applications sont très nombreuses, et les méthodes à utiliser sont assez complexes (comparées à celles utilisées pour le texte). Le marquage d'images a de nombreux buts: copyright des images (très important à l'époque d'Internet où des milliers d'images circulent sur le web), mais aussi marquage de papiers ou de billets (pour eviter le photocopiage), verification de l'integritée de documents  ect... A chaque utilisation correspond une méthode. En fait les techniques doivent répondre à certaines règles très importantes et souvent difficiles à concillier:
- endommager le moins possible le support sur lequel le marquage va avoir lieu. (l'oeil humain ne doit pas être choqué).
- le marquage doit pouvoir supporter le plus grand nombre de transformations possible sans être dégradé (compression JPEG, filtres, passage analogique- numerique, changement de palettes ect..voir les différentes attaques possibles sur le marquage).
- la complexité de l'algorithme doit être minimum afin de pouvoir effectuer le marquage et/ou la détection en temps réel.

Le marquage peut avoir lieu au niveau de l'image dans le domaine des fréquences:
-Technique de Watermarking tenant compte de la correlation HVS-Canaux RGB
ou même plus traditionnellement dans le domaine spatial:
-Bits de poids faibles
-Signature par modulation d'amplitude
-Watermarking par DCT à taille de blocs variable
Nous parlerons même du watermarking de la seconde génération. (un exemple proche est celui par modification géométrique). Certaines méthodes utilisent même la palette pour marquer l'image (dans le cas ou l'image possède un palette, comme pour le marquage EzStego).
Les premières méthodes de signature d'images ont étés proposées en 1993 par Caronni (bien que des articles plus anciens faisaient déjà allusion à ce type de pratiques). Les méthodes les plus récentes portent les noms de Anderson, Aucsmith, et Swansonet Al. Les méthodes utilisées dans le stéganographie dépendent surtout du type de marquage que l'on désire:

-Marquage privé : Dans ce cas précis, on a besoin de l'image originale. Et là encore on différencie deux types:
1er type : On utilise l'image originale, l'image marquée et la clef. A partir de cela on retrouve la marquage.
2e type : On a besoin de l'image originale, de la clef, et de l'image marquée et du marquage pour savoir si OUI ou NON l'image marquée contient le marquage donné..


-Marquage semi-privé : Ici, pas besoin de l'originale. on a juste besoin de l'image marquée, du marquage et de la clef pour savoir si OUI ou NON l'image contient le marquage. Ce marquage est très utilisé (par exemples poour les DVD).
En effet, imaginons un marquage spécifique à chaque pays. Le lecteur de DVD lance une application qui, avec le CD inséré dans le lecteur (image marquée) et la clef, il va regarder si l'image à été marquée et va alors autoriser ou non la lecture du DVD.

-Marquage public : (appelé aussi marquage aveugle). C'est ici le problème le plus intéressant. On ne possède ici que l'image marquée et la clef. Cela suffit à faire apparaitre le marquage.

Clef(Image marquée) = Marquage



(à suivre ....)

La 3D