Categories
Security Steganography

Stéganalyse de la méthode LSB (avec un ensemble de nombres décrit par crible d’Eratosthenes) avec Jennifer Morrison

Tout d’abord afin se rafraîchir l’esprit, on pourra lire l’ancien billet Stéganalyse de la méthode LSB. Il s’agissait d’usiter la méthode dite Least Significant Beat puis de comparer la stéganalyse du fichier original et du fichier avec un message caché. La conclusion était que grâce à la stéganalyse par parité il était aisé de détecter une image altérée par la méthode LSB classique.

Aujourd’hui nous allons en plus caché le message avec la nouvelle technique. Qui consiste à utiliser un ensemble de nombres pour sélectionner les pixels où seront cachés les données. Pour cette exemple nous allons utiliser le crible d’Eratosthenes.

J’avais promis qu’après Elisha Cuthbert nous passerions à Jennifer Morrison.

Ensuite il suffit d’exécuter les commandes:

# Cache le contenu de secret.txt dans Jennifer_Morrison-original.png en utilisant l'ensemble des nombres décrit par le crible d'Eratosthenes
$ slsb-set --hide -i ./Jennifer_Morrison-original.png -o ./Jennifer_Morrison-enc-gen.png --generator eratosthenes -f ./secret.txt
# Stéganalyse du fichier résultant 
$ steganalysis-parity -i ./Jennifer_Morrison-enc-gen.png -o ./Jennifer_Morrison-en-gen-steg.png

# Cache le contenu de secret.txt dans Jennifer_Morrison-original.png via la méthode LSB classique
$ slsb --hide -i ./Jennifer_Morrison-original.png -o ./Jennifer_Morrison-enc.png  -f ./secret.txt 
# Stéganalyse du fichier résultant
$ steganalysis-parity -i ./Jennifer_Morrison-enc.png -o ./Jennifer_Morrison-en-steg.png 

# Stéganalyse du fichier original
$ steganalysis-parity -i ./Jennifer_Morrison-original.png -o ./Jennifer_Morrison-steg.png

Vous obtiendrez en résultat ces fichiers (survollez avec la souris les images afin de comprendre de quoi il s’agit):

Fichier original Stéganalyse du fichier original

Texte caché (LSB)

Texte caché (LSB + Eratosthenes) Stéganalyse de l'image avec un texte caché (LSB + Eratosthenes)

Les 3 sublimes images de la première colonne paraissent identiques.
On peut observer une étrange régularité au début du fichier résultant de la stéganlyse de l’image dans laquelle un texte a été caché via la méthode LSB classique.
Par contre il est plus difficile de détecter une anomalie similaire sur le fichier résultant de la stéganalyse de l’image dans laquelle un texte a été caché via la méthode LSB tout en utilisant un ensemble de points (ici obtenu avec le crible d’Eratosthenes).

Si vous ne me faites pas confiance:

$ wget http://blog.cedricbonhomme.org/wp-content/uploads/2011/12/Jennifer_Morrison-enc.png
$ wget http://blog.cedricbonhomme.org/wp-content/uploads/2011/12/Jennifer_Morrison-enc-gen.png

$ slsb-set --reveal --generator eratosthenes -i ./Jennifer_Morrison-enc-gen.png  -b text-dec-gen.txt
$ slsb --reveal  -i ./Jennifer_Morrison-enc.png  -b text-dec.txt
$ cmp text-dec.txt text-dec-gen.txt 
$ cat text-dec.txt 
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.

$ slsb-set --reveal --generator fermat -i ./Jennifer_Morrison-enc-gen.png  -b text-dec-gen.txt
Impossible to detect message.

La conclusion évidente est donc qu’il est préférable de ne pas utiliser des pixels se suivants mais un ensemble de pixels bien réparti que l’on pourra retrouver afin de récupérer le message caché. Ici l’idée était donc de générer des ensembles via des générateurs de nombres entiers. La qualité de la répartition va donc dépendre de la suite choisie. On aurait très bien pu utiliser la suite de Fibonacci par exemple.

Vous trouverez plus de détails ainsi qu’un meilleur exemple à cette page.

La prochaine fois on se fait Jessica Alba ou Sarah Michelle Gellar.

Categories
Python Security Steganography

Encore plus vite

Ci-dessous une stéganalyse de cette photo.

Stéganalyse de l'image originale
Stéganalyse de l'image originale

Maintenant une stéganalyse du cadeau d’hier:

Stéganalyse de l'image contenant un message
Stéganalyse de l'image contenant un message

On constate deux choses:

  • il reste beaucoup de place. L’algorithme de stéganographie LSB utilise le dernier bit de chaque couleur des pixels. De nombreuses implémentations utilisent les deux derniers. Ce qui signifie que j’aurai pu utiliser une photo de seulement 5Mo pour faire la même chose.
  • des données encodées en base 64 sont facilement détectables par stéganalyse. Il faudrait ajouter du bruit et ne pas les insérer à la suite.

La fonction reveal est aussi beaucoup plus rapide grâce à Christophe qui préfère les bits aux strings.

Categories
Python Security Steganography

Stéganalyse de la méthode LSB

Comme expliqué dans le billet précédent la technique LSB (Least Significant Bit) est aisément attaquable. En effet si pour l’oeil modifier le bit de poids faible est invisible il n’en est pas de même pour un script Python. Nous allons donc utiliser une technique qui consiste tout simplement à remplacer les composantes pairs des pixels par 0 et les composantes impairs par 255. Ce qui veut dire que le pixel (132, 247, 123) deviendrait (0, 255, 255).

Voyons ce que cela nous donne avec l’image originale.

Image originale

Stéganalyse de l'image originale

On voit que la répartition n’est localement pas très uniforme (cliquez sur les images pour voir plus près).

Maintenant nous utilisons l’algorithme LSB afin de cacher un message. Ensuite nous réalisons une stéganalyse sur l’image modifiée.

Image avec un texte caché

Stéganalyse de l'image avec un texte caché

Ici on s’aperçoit nettement que la zone où se trouve dissimulé le message est plus uniforme (une des raisons de chiffrer le texte avant de le cacher). En introduisant un message dans l’image nous avons modifié le bit de poids faible (donc la parité) des composantes des pixels. Il faut aussi savoir que dans le système RGB un pixel par exemple blanc sera toujours codé (255, 255, 255) avec les appareils saturants les couleurs (les valeus sont quasi exactes).

J’ai une autre petite idée derrière la tête. Donc avec de la chance nous verrons bientôt une autre méthode utilisant l’entropie pour détecter un message caché dans une image, peut être même le trouver. Si mes résultats seront concluents… Nous pourrons aussi comparer les deux techniques de stéganalyse.