2017/05/25 23:09 1/4 Steganographie LSB avec Python et C Steganographie LSB avec Python et C Les explications générales sur la stéganographie LSB sont disponibles ici : Stéganographie LSB Dans ce TP, nous allons non seulement aborder la méthode de stéganographie LSB, mais aussi voir de quelle façon il est possible de réaliser un programme à la fois avec Python et C, en tirant partie des avantages des deux langages : Python permet de développer très rapidement, limite les bugs, mais est lent. C est très rapide à l'exécution, mais plus délicat à utiliser, et le développement est souvent plus long. Nous allons donc réaliser un programme Python qui peut charger et afficher une image (nous utiliserons une bibliothèque pour cela). Puis, depuis le programme Python, nous appellerons une fonction C qui transforme une image en utilisant la méthode LSB. Le langage C sera donc réservé au calculs des pixels de l'image, qui est typiquement le genre de calculs pour lesquels Python est lent. Il n'est pas rare que lors de la réalisation d'une application, une phase de prototypage soit nécessaire : on teste différents algorithmes, les fonctionnalités essentielles etc….. Cette phase de développement doit être rapide et il doit être facile de tester plusieurs algorithmes. Pour cette phase Python est un langage idéal. Puis lors de la phase de développement du produit, il faudra optimiser le code de manière à le rendre efficace. Parfois le langage utilisé lors de cette phase n'est pas le même que celui utilisé lors de la phase de prototypage. La gros avantage de Python et C et qu'une fois le prototype réalisé, nous pouvons nous contenter de réécrire en C les parties les plus sensibles uniquement, et parvenir ainsi plus rapidement au produit fini. C'est exactement ce que nous allons faire ici : 1. réalisation d'un prototype en Python 2. optimisation du coeur du code par sa réécriture en C Réalisation du prototype Python Nous utiliserons la bibliothèque ImageWindow (développée à l'école) ou bien PySide (pour les interfaces graphiques). La documentation de ImageWindow est ici : Travailler avec des images en Python Nous travaillerons avec des petites images (à cause du temps de calcul rédhibitoire en Python) : Informatique, Programmation, Python, Enseignement... - https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ Last update: 2015/03/18 14:06 tp:progc:steganographie02 https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/doku.php/tp:progc:steganographie02 Téléchargez la première image (kangourou) et réalisez un programme qui la charge et l'affiche. Testez. Puis soit par l'intermédiaire d'un bouton ou d'un menu (version PySide) ou bien par un simple appui sur une touche (ImageWindow), déclenchez l'exécution de la méthode LSB, en prenant soin de paramétrer le nombre de bits de poids faible à conserver dans l'image finale, puis affichez le résultat. Avec la première image, vous devriez reconnaître un pingouin (si vous conservez le bon nombre de bits significatifs). Limitations de la version Python https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ Printed on 2017/05/25 23:09 2017/05/25 23:09 3/4 Steganographie LSB avec Python et C Le module time contient la fonction time() qui renvoie le nombre de secondes écoulées depuis l'Epoch. Il est utile pour mesurer des temps de calcul (un peu à la manière de tic() et toc() avec Matlab), si on n'a pas besoin d'une grande précision (les résultats sont en effet faussés par les autres «activités» de la machine). import time t1 = time.time() # Calcul très long for i in range(100): print(i,i**2, i**3, i**4, i**5) t2 = time.time() print('Temps écoulé : ', t2-t1) Utilisez cette méthode pour mesurer le temps de calcul de l'image cachée, indiquez à quel endroit vous avez placé les appels à time(). Réalisez des mesures pour toutes les images données plus haut. Vérifiez que le temps de calcul varie comme le nombre de pixels de l'image. Estimez le temps de calcul pour une image 3000×2000. Optimisation des parties critiques Nous allons optimiser la partie calcul. Pour cela, le calcul doit idéalement être isolé dans une fonction Python qui prend en paramètre l'image de départ, le nombre de bits de poids faible à conserver et renvoie l'image résultante. Si vous n'avez pas une telle fonction dans votre code…. reprenez le. La fonction C que nous allons écrire prendra en paramètres l'image de départ (un tableau d'octets), la largeur de l'image, la hauteur, le nombre de bits de poids faible à conserver et l'image d'arrivée (initialement vide, mais la zone mémoire sera prête). Une fois cette fonction réalisée, nous retoucherons notre fonction Python pour qu'elle utilise cette fonction C. Commencez par lire le tutoriel sur l'utilisation de ctypes (il y a un exemple sur les images à la fin, mais il faudra tout lire…) : Utilisation de Ctypes Développez votre programme avec la méthode LSB en C. Mesurez le gain de temps (par combien le temps de calcul est-il divisé, ce facteur est il constant lorsque la taille de l'image varie ?). Pensez à indiquer où vous avez mis les time.time() pour faire vos mesures. Utilisez votre programme sur l'image donnée ci-dessous. Parvenez-vous à identifier l'objet caché ? Informatique, Programmation, Python, Enseignement... - https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ Last update: 2015/03/18 14:06 tp:progc:steganographie02 https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/doku.php/tp:progc:steganographie02 From: https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ - Informatique, Programmation, Python, Enseignement... Permanent link: https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/doku.php/tp:progc:steganographie02 Last update: 2015/03/18 14:06 https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ Printed on 2017/05/25 23:09