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

[TiDi] Messages postés 126 Date d'inscription   Statut Membre Dernière intervention   -  
[TiDi] Messages postés 126 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Modérateur Dernière intervention   934
 
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   Statut Membre Dernière intervention   262
 
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   Statut Membre Dernière intervention   262
 
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