L'homme en noir se cache dans le chevalier blanc

Il s'agit d'utiliser Octave pour faire de la stéganographie…

Voir cette page qui traite du même sujet et peut vous aider à comprendre ce qui va suivre…

Cacher une image dans une autre

Nous allons essayer de cacher une image codée sur 24 bits dans une autre image codée elle aussi sur 24 bits. Les deux images ont la même dimension.

L'image visible est appelée "blanc.png", l'image à cacher s'appelle "noir.png" . À partir de ces deux images, nous allons créer une image de couverture qui s'appelera "couv.png" qui aura l'apparence de "blanc.png" mais qui contiendra des informations permettant d'afficher "noir.png"…


L'idée de base

Prenons le premier pixel de la première matrice de "blanc.png", c'est le premier terme de B1 donc 91. Comme 91=16×5+11, on dira que 5 est l'information forte du pixel et 11 l'information faible. On remplacera le pixel par un pixel dont l'information forte sera aussi 5 donc 91 peut être remplacé par un nombre entre 80 et 95.On verra bientôt qu'il sera remplacé par 88…


De même l'information forte du premier pixel de la première matrice de "noir.png" est 8 puisque 129=8×16+1 .

Nous allons créer une nouvelle matrice C1 qui décrira une image "couv.png". Son premier pixel aura pour information forte 5, (information forte du premier pixel de B1) et pour information faible 8 ( information forte du premier pixel de N1 ) donc le premier terme de C1 sera 5×16+8=88

Le début de C1 :


Le script Octave

B=imread("blanc.png")
N=imread("noir.png")
B=double(B)
N=double(N)
B1=B(:,:,1)
B2=B(:,:,2)
B3=B(:,:,3)
N1=N(:,:,1)
N2=N(:,:,2)
N3=N(:,:,3)
B1f=floor(B1/16)
B2f=floor(B2/16)
B3f=floor(B3/16)
N1f=floor(N1/16)
N2f=floor(N2/16)
N3f=floor(N3/16)
C1=16*B1f+N1f
C2=16*B2f+N2f
C3=16*B3f+N3f
C1=uint8(C1)
C2=uint8(C2)
C3=uint8(C3)
imwrite("couv.png",C1,C2,C3)

On obtient l'image de couverture suivante :

On voit que l'image est altérée; la moitié des informations de l'image de départ ont été perdues mais c'étaient les informations les plus faibles et l'image reste très correcte. Avec un fond moins uni et plus texturé, on verrait moins de différence.


Ce qu'il y a dans le cœur du chevalier blanc

Il reste à décoder cette image ; il nous suffira d'échanger les informations fortes et les faibles…

Ainsi nous transformerons le pixel codé par 88 (information forte: 5 et information faible: 8) en un pixel codé par 16×8+5=133 et de cette façon nous obtiendrons une matrice S1 permettant de révéler l'image cachée…


Avec ce code, on révèle l'image cachée :

C=imread("couv.png")
C=double(C)
C1=C(:,:,1)
C2=C(:,:,2)
C3=C(:,:,3)
C1F=floor(C1/16)
C2F=floor(C2/16)
C3F=floor(C3/16)
C1f=mod(C1,16)
C2f=mod(C2,16)
C3f=mod(C3,16)
S1=16*C1f+C1F
S2=16*C2f+C2F
S3=16*C3f+C3F
S1=uint8(S1)
S2=uint8(S2)
S3=uint8(S3)
imwrite("secret.png",S1,S2,S3)

En zoomant, on peut voir que l'image a aussi été altérée :


Remarques

amusant

Si on avait cherché à décoder l'image "blanc.png" au lieu de l'image "couv.png", on aurait obtenu ceci  Cela ressemble à l'image créee aléatoirement, sauf sur le fond où il y a des aplats de couleur.


script Octave

On peut très bien éditer un script avec un éditeur de texte et le lancer avec Octave: on peut par exemple recopier l'un des deux programmes affichés, sauvegarder le fichier avec l'extension .m par exemple decode.m (attention certains noms sont interdits…) ; pour lancer le script, il suffit de saisir en ligne de commande decode (pas d'extension)…

Au travail

Si vous voulez savoir ce qu'il y a dans le cœur d'Yvain, vous devez décoder cette image…


fait le 3 août 2008