Cryptographie visuelle
La cryptographie visuelle est une technique cryptographique qui permet de chiffrer des informations visuelles (images, texte, etc…).
On doit les premiers algorithmes de cryptographie visuelle à Moni Naor et Adi Shamir (1994). Voir https://link.springer.com/content/pdf/10.1007%2FBFb0053419.pdf.
Comment construire deux images de telle sorte qu’en les superposant elles font apparaitre … un message secret.
Voici deux images qui cachent un « message » :
Schéma (2,2)-VCS (Visual Cryptography Scheme)
L’image contenant l’information secrète est partagée en 2 images masque (shadow image) et peut être reconstituée en superposant ces 2 images.
Par « superposition », on entend une opération logique OU entre chaque sous-pixel de mêmes coordonnées (image transparente superposée à une image opaque) ou bien XOR.
Principe
Chaque pixel de l’image à chiffrer est partagé en 2 « blocs » de \(m\) sous-pixels (appelés shares). Ces blocs constituent alors les pixels des images masque, dont la taille sera pas conséquent \(m\) fois plus grande (en nombre de pixel) que celle de l’image à chiffrer.
L’opération de « superposition » entre 2 shares doit donner :
- pour un pixel d’origine noir : \(m\) sous-pixels noirs
- pour un pixel d’origine blanc :
- soit \(m\) sous-pixels blancs (opération XOR)
- soit \(m\) sous-pixels noirs ou blancs (opération OR)
⊕ = ⊕ = ⊕ = ⊕ = |
⊕ = ⊕ = ⊕ = ⊕ = |
Remarque : dans le cas d’une opération de superposition en OR (cas d’une image masque supérieure imprimée sur une feuille transparente), il peut être souhaitable de ne choisir que des shares contenant autant de pixels blancs que de pixels noirs. Ainsi la zone « blanche » de l’image secrète apparaitra à l’œil humain comme une zone grise plus uniforme.
Cas de groupes de 4 sous-pixels :
⊕ =
⊕ =
⊕ =
Le codage
L’image est tout d’abord binarisée (deux niveaux sont conservés, noir et blanc). Après binarisation, l’image source est donc constituée de 0 (pixels noirs) et de 1 (pixels blancs).
Ensuite on crée 2 images masque vides
Puis le chiffrement est effectué :
- Pour chaque pixel de l’image d’origine :
- On génère aléatoirement un share de \(m\) sous-pixels et on le place dans la 1ère image masque.
- On détermine le 2ème share, associé au 1er de telle sorte que la superposition des 2 donne la valeur du pixel de l’image d’origine (share1 ⊕ share2 = \(m\) pixels noirs ou \(m\) pixels blancs)
- On place ce 2ème share à la place dans la 2ème image masque.
Implémenter en Python une fonction vcs(nom_fichier_image)
qui partage l’image nom_fichier_image
en deux images masque, en utilisant des blocs de 4 sous-pixels, puis qui les enregistre sous deux noms de fichier : nom_fichier_image
suffixé d’un "_1"
et d’un "_2"
.
Sources : https://fr.wikipedia.org/wiki/Cryptographie_visuelle
http://www.irem.univ-bpclermont.fr/IMG/pdf/Fiche-crypto-visuelle.pdf
https://tel.archives-ouvertes.fr/tel-00956593/file/These-Machizaud-Jacques-2012.pdf
https://link.springer.com/content/pdf/10.1007%2FBFb0053419.pdf