IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Déchiffrement image avec Crypto Cipher


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Par défaut Déchiffrement image avec Crypto Cipher
    Bonjour, j'essaye de chiffrer et déchiffrer en AES plusieurs types de fichiers et la je bloque sur les images... Aucun problème pour la chiffrer, mais le déchiffrage ne fonctionne pas... j'ai l'impression qu'il me rechiffre l'image...

    voila mon code pour chiffrer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    from Crypto.Cipher import AES
    import re
    from PIL import Image
     
    aes = AES.MODE_CBC
     
    liste=[".JPG",".JPEG",".GIF",".ICO",".BMP",".DIB",".JPE",".PNG",".JFIF",".TIF",".TIFF"]
     
    def extension(text):
    	ext = re.compile(r"(.[a-zA-Z0-9]+)$")
    	if ext.search(text):
    		return ext.search(text).group(0).upper()	
     
    def FonctionCrypteurAES(fichiernoncrypt,fichiercryptAES,fichiercleAES):
    	fichier = fichiernoncrypt
    	fichier_code = fichiercryptAES
    	fichier_cle = fichiercleAES
    	exten = extension(fichiernoncrypt)
    	exten2 = extension(fichier_code)
     
    	fichier_coder = open(fichier_code,"wb")
    	fichier_coder.close()
     
    	cle = open(str(fichier_cle),"rb")
    	key = cle.read()
    	coder_aes = AES.new(str(key), aes)
     
    	if not exten in liste :
    		handler = open(str(fichier),"rb")
    		a_coder = handler.read()
    		handler.close()
    		if (len(a_coder) % 16) != 0:
    			n = 16 - (len(a_coder) % 16)
    			for i in range(0, n):
    				a_coder += '\0'
     
    		motcrypte = coder_aes.encrypt(str(a_coder))
    		fichier_coder = open(str(fichier_code),"ab+")
    		fichier_coder.write(str(exten)+"\n")
    		fichier_coder.write(motcrypte)
    		fichier_coder.close()
    	else:
    		input_image = Image.open(fichier)
    		image_string = input_image.tostring()
    		if (len(image_string) % 16) != 0:
    			n = 16 - (len(image_string) % 16)
    			for i in range(0, n):
    				a_coder += '\0'
     
    		encrypted = coder_aes.encrypt(str(image_string))
    		encrypted_img = Image.frombuffer("RGB", input_image.size, encrypted, 'raw',"RGB", 0, 1)
     
    		if not exten2 in liste:
    			encrypted_img.save(fichier_code, 'JPEG')
    			os.remove(fichier_code)
    		else :
    			encrypted_img.save(fichier_code)


    et celui pour déchiffrer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    from Crypto.Cipher import AES
    import re
    import os
    from PIL import Image
     
    mode = AES.MODE_CBC
    liste=[".JPG",".JPEG",".GIF",".ICO",".BMP",".DIB",".JPE",".PNG",".JFIF",".TIF",".TIFF"]
     
    def fin_ligne(text):
    	fin = re.compile(r"(.[a-zA-Z0-9]+){1}[\n\r]{0,2}")
    	if fin.search(text):
    		return fin.search(text).group(0)
    def extension(text):
    	ext = re.compile(r"(.[a-zA-Z0-9]+)$")
    	if ext.search(text):
    		return ext.search(text).group(0).upper()	
     
    def FonctionDecrypteurAES(fichiercryptAES,fichierdecryptAES,fichiercleAES):
    	fichier = fichierdecryptAES
    	fichier_code = fichiercryptAES
    	fichier_cle = fichiercleAES
    	exten = extension(fichier)
     
    	fichier_decrypt = open(fichier,"wb")
    	fichier_decrypt.close()
     
    	handler = open(str(fichier_code),"rb")
    	a_decoder = handler.read()
    	handler.close()
     
    	cle = open(str(fichier_cle),"rb")
    	key = cle.read()
    	decoder = AES.new(str(key), mode)
     
    	if not exten in liste :
    		fin = str(fin_ligne(a_decoder))
    		a_decoder2 = a_decoder.replace(str(fin),"")
    		# if (len(a_decoder2) % 16) != 0:
    			# n = 16 - (len(a_decoder2) % 16)
    			# for i in range(0, n):
    				# a_decoder2 += '\0'
    		motdecrypte = decoder.decrypt(str(a_decoder2))
    		space = re.compile(r"[\0]+$")
    		if space.search(str(motdecrypte)) :
    			motdecrypte = motdecrypte.replace("\0",'')
    		fichier_decrypt = open(str(fichier),"ab+")
    		fichier_decrypt.write(motdecrypte)
    		fichier_decrypt.close()
     
    	else:
    		input_image = Image.open(fichier_code)
    		image_string = input_image.tostring()
    		# if (len(image_string) % 16) != 0:
    			# n = 16 - (len(image_string) % 16)
    			# for i in range(0, n):
    				# image_string += '\0'
    		decrypted = decoder.decrypt(str(image_string))
    		space = re.compile(r"[\0]+$")
    		if space.search(str(decrypted)) :
    			decrypted = decrypted.replace("\0",'')
    		decrypted_img = Image.frombuffer("RGB", input_image.size, decrypted, 'raw',"RGB", 0, 1)
    		decrypted_img.save(fichier)
    si quelqu'un a une idée!

    Merci

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne connais pas le sujet, mais poussé par la curiosité (=un moteur puissant ), j'ai installé pycrypto pour voir. J'ai eu un peu de mal sous Windows, car il m'a fallu installer avant Visual Studio C++ 2008 Express!

    Ensuite, j'ai cherché un code plus simple que le tien pour apprendre, et j'en ai trouvé un ici:

    http://eli.thegreenplace.net/2010/06...with-pycrypto/.

    J'ai copié-collé, défini une clé de 32 caractères (key=""nimportequoipourvuquecamoussexxx""), et tenté de crypter/décrypter une photo jpg d'environ 4Mo: tout fonctionne parfaitement! Et la photo décryptée est bien la même photo qu'avant.

    Peut-être peux-tu t'inspirer de ce code pour déverminer ton programme?

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Il me semble que tu enregistres le résultat du codage d'une image sous forme d'une image. A quoi cela sert ? Pourquoi ne pas utiliser le même code que pour les autres fichiers binaires ?

    Certains formats d'image sont "lossy" (avec pertes), JPEG par exemple. Dans ce cas le décryptage ne fonctionnera jamais car tu auras perdu de l'information. Et même pour les formats sans pertes, la taille de tes fichiers va exploser car les fichiers cryptés sont incompressibles...

  4. #4
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Par défaut
    merci pour vos réponses mais le problème venait en fait de l'ajout et de la suppression des caractères \0...

    dividee en fait je vais abandonner cette partie la... je vais obliger l'utilisateur a enregistrer le fichier avec l'extension que je veux, d'une ca allègera le code et de deux ca évitera toutes les pertes dont tu parles

    pour ceux qui auraient repris mon code voila ce que j'ai modifié :
    - dans le code de chiffrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # remplissage du fichier s'il n'est pas proportionnel a 16
    	if (len(a_coder) % 16) != 0:
    		n = 16 - (len(a_coder) % 16)
    		N = n + 16
    		for i in range(0, N):
    			a_coder += '\0'
    - dans le code de déchiffrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # on retire les espaces rajoutés a la fin pendant le cryptage
    	space = re.compile(r"[\0]{17,31}$")
     
    	if space.search(str(motdecrypte)) :
    		inter = space.search(str(motdecrypte)).group(0)
    		motdecrypte = motdecrypte.replace(str(inter),'')
    et j'ai enlevé toutes la partie de remplissage dans le code de déchiffrement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/03/2014, 11h14
  2. Passer des Image avec SOAP
    Par pef421 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 01/03/2004, 21h32
  3. Economie de mémoire pour plusieur images avec la même source
    Par neness dans le forum Composants VCL
    Réponses: 5
    Dernier message: 18/01/2004, 10h56
  4. PB affichage d'image avec IE
    Par arturo dans le forum Modules
    Réponses: 6
    Dernier message: 25/09/2003, 17h28
  5. [VB6] Affichage d'image avec qlq contraintes
    Par youri dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo