Principe : pic et zéro de l'histogramme
L'histogramme d'une image en niveaux de gris compte, pour chaque valeur de 0 à 255, combien de pixels ont cette valeur. Dans une photo naturelle, cet histogramme présente en général un pic (une valeur très fréquente) et plusieurs zéros (des valeurs absentes).
L'algorithme de Ni exploite cette propriété : il "déplace" tous les pixels entre le pic et le zéro de un cran pour libérer de la place au niveau du pic, puis utilise ce niveau pour encoder les bits du message — un bit par pixel au pic.
Exemple d'histogramme simplifié :
Niveau de gris : ... 98 99 100 101 102 103 ...
Nombre de pixels: ... 5 8 [847] 0 2 4 ...
↑ pic ↑ zéro
Étape 1 : déplacer tous les pixels entre pic (100) et zéro (103)
Pixels avec valeur 101 → 102 (décalage +1)
Pixels avec valeur 102 → 103 (décalage +1)
→ Niveau 101 est maintenant libre
Étape 2 : encoder les bits du message
Pour chaque pixel avec valeur 100 (au pic) :
→ bit 0 à cacher → laisser à 100
→ bit 1 à cacher → incrementer à 101
Résultat : les niveaux 100 et 101 encodent les bits.
Niveau 100 → bit 0
Niveau 101 → bit 1
Tous les autres niveaux sont décalés de +1 vers le zéroAlgorithme d'encodage
Calculer l'histogramme complet de l'image (niveaux 0-255)
Identifier le pic P (niveau avec le plus de pixels) et le zéro Z (niveau vide le plus proche de P)
Décaler tous les pixels entre P et Z de un cran vers Z (pour libérer le niveau P+1)
Pour chaque pixel au niveau P : si bit à encoder = 1 → incrémenter à P+1, sinon laisser à P
Stocker P et Z dans l'en-tête de l'image (ex: dans les LSB de pixels réservés) pour le décodage
→ Contrainte importante : si P est au bord (0 ou 255), on ne peut pas décaler dans une direction. On choisit alors Z du côté opposé (Z < P si P est proche de 255, Z > P si P est proche de 0).
Décodage et réversibilité parfaite
La réversibilité est la propriété la plus remarquable de Histogram Shifting. Après extraction du message, l'image peut être restaurée à l'identique bit-perfect sans la moindre perte.
Le décodage inverse simplement l'encodage : tous les pixels à P+1 contribuent un bit 1 (et sont ramenés à P), tous les pixels à P contribuent un bit 0, et tous les pixels entre P+1 et Z sont décalés d'un cran vers P pour restaurer l'histogramme original.
DÉCODAGE (connaissance de P et Z requise) : Pour chaque pixel de l'image stéganographiée : Si valeur == P → bit lu = 0, pixel inchangé Si valeur == P+1 → bit lu = 1, pixel ramené à P Si valeur entre P+1 et Z → pixel décalé de -1 (vers P) Sinon → pixel inchangé Résultat : message extrait bit par bit, ET image restaurée à son état EXACTEMENT original. Vérification : histogramme_original == histogramme_après_décodage ✓ chaque pixel_original == pixel_après_décodage ✓
Capacité et qualité
La capacité est directement déterminée par la hauteur du pic P : elle est égale au nombre de pixels ayant la valeur P. Dans une photo naturelle, le pic peut représenter 2 à 10% des pixels totaux.
Pour augmenter la capacité, des variantes multi-paires utilisent plusieurs paires (pic, zéro) successivement. La distorsion reste très faible car les modifications sont au maximum de ±1 niveau de gris par pixel.
| Image 512×512 | Pic typique | Capacité | PSNR |
|---|---|---|---|
| Lena (test) | ~5 000 px | ~625 octets | >48 dB |
| Photo naturelle | ~3 000 px | ~375 octets | >50 dB |
| Image médicale (IRM) | ~15 000 px | ~1 875 octets | >52 dB |
| Multi-paires (×5) | ×5 paires | ~3 000 octets | >44 dB |
Applications : médical et judiciaire
La réversibilité totale fait d'Histogram Shifting la technique de choix pour les domaines où l'intégrité de l'image originale est légalement ou éthiquement impérative.
Imagerie médicale
MÉDICALCacher les métadonnées patient (nom, date, diagnostic) directement dans l'image IRM ou scanner, sans altérer les valeurs de pixels utilisées par les radiologues.
Preuve judiciaire
JUDICIAIREIntégrer une signature d'authenticité dans une photo de scène de crime sans modifier l'image elle-même. La récupération parfaite garantit l'admissibilité.
Documents légaux
LÉGALEmbeds des métadonnées (auteur, date, hash d'intégrité) dans des images de documents officiels sans altérer leur rendu visuel ou numérique.
Archivage militaire
DÉFENSEImages de surveillance avec métadonnées classifiées intégrées. La réversibilité garantit que les analystes travaillent sur l'image originale non altérée.
Détection
Histogram Shifting laisse une signature très caractéristique : un histogramme avec deux pics adjacentsd'hauteur similaire là où un seul pic existait avant, et un niveau vide décalé vers le pic. Cette signature est détectable par inspection visuelle de l'histogramme.
Paradoxalement, la qualité d'image (PSNR très élevé, distorsion minimale) peut rendre la détection difficile par les méthodes basées sur l'analyse de bruit. Mais l'analyse directe de l'histogramme reste efficace.
⚠ Détection simple : `convert image.png -define histogram:unique-colors=false histogram:- | gnuplot` — un double-pic sur des niveaux adjacents avec un zéro artificiel à proximité révèle un Histogram Shifting.
Questions fréquentes
Qu'est-ce que "réversible" veut dire en stéganographie ?
La plupart des techniques de stéganographie altèrent l'image hôte de façon permanente — même après extraction du message, l'image n'est plus exactement comme l'originale (quelques bits modifiés). Histogram Shifting est l'exception : après extraction du message, un algorithme de restauration ramène chaque pixel à sa valeur exacte d'origine. L'image est bit-perfect identique à l'originale — zéro distorsion résiduelle.
Pourquoi est-ce crucial dans le domaine médical ?
Dans un scanner IRM ou un scanner CT, chaque valeur de pixel a une signification clinique précise. Une altération de ±1 sur 255 pourrait théoriquement affecter un diagnostic. L'Histogram Shifting permet d'intégrer les métadonnées du patient (nom, date, identifiant DICOM) directement dans l'image, puis de la restaurer parfaitement avant toute analyse radiologique.
Comment savoir si une image a été modifiée par Histogram Shifting ?
En analysant son histogramme. Une image naturelle présente des pics progressifs et naturels. Une image Histogram-Shiftée présente un double-pic artificiel sur deux valeurs adjacentes (niveau P et P+1) et un zéro artificiellement décalé. Avec ImageMagick : `convert image.png histogram:- | gnuplot`. Des pics anormaux en miroir révèlent la technique.
Quelle est la capacité en pratique ?
Elle dépend du contenu de l'image : c'est le nombre de pixels au niveau du pic de l'histogramme. Pour une photo naturelle de 512×512 pixels, typiquement 3 000 à 15 000 pixels au pic, soit 375 à 1 875 octets. Les images médicales en niveaux de gris ont souvent des pics plus prononcés, donc plus de capacité. On peut augmenter la capacité avec des variantes multi-paires au prix d'une légère baisse de qualité.
Quels outils implémentent Histogram Shifting ?
Peu d'outils grand public la proposent — c'est surtout une technique de recherche et de systèmes spécialisés. En Python, la bibliothèque HS-Steg propose une implémentation. Pour des usages médicaux, certains systèmes PACS (Picture Archiving and Communication Systems) l'intègrent nativement. En CTF, elle apparaît rarement mais peut être implémentée en une trentaine de lignes Python.
Techniques similaires
Explorez d'autres techniques de stéganographie image, des plus simples aux plus avancées.