Cryptographie visuelle

La cryptographie visuelle est une technique cryptographique qui permet de chiffrer des informations visuelles (images, texte, etc…).

1994 : cryptographie visuelle

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 » :

Copier/Coller ces deux images dans deux calques différents d’un logiciel d’édition graphique (Paint.NET ou Gimp par exemple).
Que font-elles apparaitre si on les superpose en réalisant une opération binaire XOR ?

 

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 :

Dénombrer puis dessiner l’ensemble des groupes de 4 sous-pixels binaires (disposés en carré) possibles.
Déterminer les groupes de 4 pixels permettant de satisfaire les « équations » suivantes :
⊕  =
 ⊕  =
 ⊕  =
 ⊕  =
Déterminer « manuellement » le symbole chiffré par ces deux images masque :
  

 

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 :
    1. On génère aléatoirement un share de \(m\) sous-pixels et on le place dans la 1ère image masque.
    2. 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)
    3. 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".

Memo pillow

Voici un petit mémo sur l’utilisation de la bibliothèque pillow:

from PIL import Image
import matplotlib.pyplot as plt

# Ouverture d'une image à partir d'un fichier :
img = Image.open(nom_fichier_image)

# Sauvegarde d'une image dans un fichier (format PNG)
img.save(nom_fichier_image, "PNG")
    
# Création d'une nouvelle image
# mode : mode de l'image (voir https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-modes)
# size : dimensions de l'image sous forme d'un tuple (largeur, hauteur)
img = Image.new(mode, size)

# Conversion de l'image dans un autre mode
img = img.convert(mode)

# Lecture d'un pixel de l'image
pix = img.getpixel((x,y))

# Écriture d'un pixel de l'image
img.putpixel((x,y), pix)

# Affichage d'une image
plt.imshow(img)
plt.show()

 

 

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

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *