PyCrypto - AES - Chiffrer du texte avec des caractères spéciaux

Fermé
[TiDi] Messages postés 126 Date d'inscription samedi 19 octobre 2013 Statut Membre Dernière intervention 17 juillet 2016 - 27 févr. 2016 à 17:48
[TiDi] Messages postés 126 Date d'inscription samedi 19 octobre 2013 Statut Membre Dernière intervention 17 juillet 2016 - 27 févr. 2016 à 22:55
Bonjour,

J'utilise la bliothèque PyCrypto pour chiffrer du texte avec AES :
from Crypto.Cipher import AES

def _SysChiffre(sCle, sTexte):
	# Vérification des données utilisateurs
	if len(sCle) == 0:
		return 1
	if len(sTexte) == 0:
		return 1
	# Traitement des données utilisateurs
	if len(sTexte) % 16 != 0:
		iN = 16 - (len(sTexte) % 16)
		for i in range(0, iN):
			sTexte += "\0"
	if len(sCle) != 16 or len(sCle) != 24 or len(sCle) != 32:
		if len(sCle) < 16:
			iN = 16 - len(sCle)
			for i in range(0, iN):
				sCle += "\0"
		elif len(sCle) > 16 and len(sCle) < 24:
			iN = 24 - len(sCle)
			for i in range(0, iN):
				sCle += "\0"
		elif len(sCle) > 24 and len(sCle) < 32:
			iN = 32 - len(sCle)
			for i in range(0, iN):
				sCle += "\0"
		else:
			return 1
	# Chiffrement
	oAES = AES.new(sCle, AES.MODE_ECB)
	sTexteC = oAES.encrypt(sTexte)
	return sTexteC

def _SysDechiffre(sCle, sTexte):
	# Vérification des données utilisateurs
	if len(sCle) == 0:
		return 1
	if len(sTexte) == 0:
		return 1
	# Traitement des données utilisateurs
	if len(sCle) != 16 or len(sCle) != 24 or len(sCle) != 32:
		if len(sCle) < 16:
			iN = 16 - len(sCle)
			for i in range(0, iN):
				sCle += "\0"
		elif len(sCle) > 16 and len(sCle) < 24:
			iN = 24 - len(sCle)
			for i in range(0, iN):
				sCle += "\0"
		elif len(sCle) > 24 and len(sCle) < 32:
			iN = 32 - len(sCle)
			for i in range(0, iN):
				sCle += "\0"
	# Déchiffrement
	oAES = AES.new(sCle, AES.MODE_ECB)
	sTexteD = oAES.decrypt(sTexte).replace(b"\0", b"")
	return sTexteD


Ces deux fonctions fonctionnent très bien avec des clés et textes sans accent mais pour tous les caractères spéciaux j'ai une erreur :
Si la clé contient des accents :
ValueError : AES key must be either 16, 24, or 32 bytes long

Si le texte contient des accents :
ValueError : Input strings must be a multiple of 16 in length

En fait c'est les memes erreurs qui sont relevées si on ne traite pas les données utilisateurs ... sauf que je les ais traitées, ça marche très bien sans accent

Comment faire pour chiffrer du texte avec tous les caractères UTF-8 ?
Je voudrais que le chiffrement fonctionne avec tous les caractères présent dans un fichier avec un objet enregistré avec Pickle

Merci de votre aide
A voir également:

2 réponses

jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
27 févr. 2016 à 18:07
Je suppose que cela provien du codage des caractères non ASCII sur plus d'un octet en UTF-8, d'où l'erreur.
0
[TiDi] Messages postés 126 Date d'inscription samedi 19 octobre 2013 Statut Membre Dernière intervention 17 juillet 2016 262
Modifié par [TiDi] le 27/02/2016 à 19:01
Ah daccord donc faudrait que pour le nombre d'octet en plus par caractère j'enlève un caractère null dans la partie traitement des données utilisateurs ou il y a une autre solution ? J'ai essayé avec la fonction encode() mais ça me retourne toujours les mêmes erreurs
0
[TiDi] Messages postés 126 Date d'inscription samedi 19 octobre 2013 Statut Membre Dernière intervention 17 juillet 2016 262
27 févr. 2016 à 22:55
Ok ben j'ai résolu mon problème tout seul : c'est ma partie de traitement des données qui pose problème. Dans cette partie, faut juste remplacer tous les len(sCle/sTexte) par len(sCle/sTexte.encode("utf-8")
0