Nicolas SURRIBAS

Développement / Réseau / Sécurité Informatique

PNG Noise : convertir un fichier en une image

Rédigé par devloop - -

Voici deux petits programmes que j'ai fait en me servant de la librairie d'écriture/lecture d'images PNG PNGwriter.
Cette librairie est très simple et permet de générer des images très basiques particulièrement adaptés aux graphes et autres représentations mathématiques (voir les exemples sur le site). Des fonctions très pratiques sont disponibles comme placer un simple pixel, un trait, une forme géométrique, du texte...

Mon objectif premier en utilisant cette librairie était de faire un programme capable de prendre des données brutes dun fichier quelconque et d'en faire une image PNG valide (affichable sans erreur dans différents logiciels). Le résultat n'est forcément pas très beau (c'est du "bruit") mais on peut procèder en sens inverse et extraire les données présentes dans l'image pour recréer le fichier original.

L'utilité du programme est questionnable. Une des applications pourrait être de passer certains filtres sur les formats de fichiers comme ceux présents sur les service de stockage d'image en ligne. On pourrait alors y stocker tout type de données.
Du point de vue stéganographique le programme offre un excellent ratio mais un oeil humain se douterait que l'image renferme un secret ;-)
Enfin l'idée m'est entrée dans la tête donc il fallait que je le fasse. Je vous laisse à votre imagination pour d'autres applications.

Le principe est le suivant :
  • PNG est un format d'image matricielle, c'est à dire que les images sont définies par un ensemble de pixel
  • Chaque pixel de l'image est définit par une couleur codée sur 3 valeurs : R, V, B (rouge, vert et bleu)
  • Chacune de ces couleurs primaires est codée de 0 à 65535, correspondant à autant de nuances différentes

Une nuance de couleur (0 à 65535) tient sur 2 octets. On a donc 6 octets (car 3 couleurs primaires) par pixel. Il suffit alors de lire le fichier à "transformer" par morceaux de 6 bits et de les intégrer comme pixel dans une image.
Le programme s'arrange pour que les dimensions de l'image finale soient le plus proche possible du carré. Les derniers pixels sont donc des pixels de bourrage.

Le tout premier pixel de l'image sert à stocker la taille du fichier d'origine pour déterminer le nombre d'octets effectifs lors de l'opération inverse.

En utilisant le programme transform sur ce fichier pdf vous expliquant comment implémenter la suite de Fibonacci en kernel-land (hmmm), on obtient l'image suivante :
Kernel Module as PNG
Le programme extract sera capable de retrouver le fichier original à partir de cette image.

C'est aussi intéressant car ça permet de voir tout de suite les répétitions présentes dans un fichier : les zones unies de l'image représentent les zones du fichier qui gagneraient à être compressées.
Ainsi si on regénère une image à partir du fichier PDF une fois compressé avec bzip2 on obtient :
Kernel Module compressed as PNG
Vous trouverez les sources dans l'archive png_noise.zip
La librairie PNGwriter n'est pas incluse. Les commandes pour la compilation sont indiquées dans la source.

Les commentaires sont fermés.