Steganographie LSB avec Python et C

publicité
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
Téléchargement