Bonjour,
Je cherches des classes pour chiffrer du texte et des fichiers avec une clé le plus simplement possible.
Merci de votre aide
Bonjour,
Je cherches des classes pour chiffrer du texte et des fichiers avec une clé le plus simplement possible.
Merci de votre aide
Salut,
Techniquement des "classes", c'est juste une façon d'organiser un code. Vous recherchez plutôt une bibliothèque de chiffrement/cryptographie. Ceciditécrit, et à défaut de plus de détails sur ce que vous voulez en faire, peut être commencer par jeter un œil à pycrypto. Ca permettra de savoir si ce que çà fait répond (ou pas) à vos besoins.
- W
Merci, j'ai installé pycrypto, j'ai regardé un peu comment ça marcher mais j'ai beaucoup de mal avec l'anglais.
Pour chiffrer du texte :
Quand j'essaie, à chaque fois j'ai une exception : "ValueError : AES key must be either 16, 24 or 32 bytes long"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 oAES = AES.new("clé", AES.MODE_ECB, IV="") sTxtC = oAES.encrypt("message")
J'ai deux question : la clé est entrée par l'utilisateur, comment faire pour l'adapter à AES ? Et qu'est-ce que l'IV, comment le définir ?
Salut,
Il n'est pas si compliqué de vérifier que la clé à la longueur attendue ou de la compléter par des caractères quelconques.
Vous avez un exemple dans la documentation ici. Vous êtes supposé connaître AES avant de l'utiliser notamment pour vous assurer que ce chiffrement répond bien à ce que vous voulez faire et vous avez une littérature abondante disponible en quelques clics sur le sujet.
Pourquoi ne pas essayez de coder un chiffrement basé sur Vigenere. C'est beaucoup plus simple à comprendre et vous apprendriez pas mal de choses à essayer de le coder.
- W
Bon au sujet de l'IV, je ne sais toujours pas ce que c'est mais j'ai trouvé comment le définir mais avec le mode ECB l'IV n'est pas utilisé :
Pour la clé c'est bon aussi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part iv = Random.new().read(AES.block_size)
Maintenant mon problème est que les caractères acceptés sont très limités. J'ai essayé avec la classe Fernet et PyCrypto sur différent algo de chiffrement symétrique mais rien n'y fait seul les caractères littéraux ASCII sont acceptés et ça vient du petit "b" avant la définition d'une chaine (je ne sais pas comment s'appelle).
Pour mon projet, il y a deux types de données à chiffrer : des fichiers contenant des objets enregistrés par Pickle et du texte entré par l'utilisateur encodé en UTF-8.
Donc je peux oublier ces deux bibliothèques, auriez-vous une solution ?
Le "b" signifie bytes (en français on dit octet). Ils se représentent par un nombre non signé dans 0..255.
Des littéraux contenant des caractères accentués tels que 'àéïôù' ne peuvent pas être interprétés en tant que "bytes" directement, il faut dire quel encoding utiliser:
Dans les deux cas ce sont des "bytes", non?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 >>> b'ééé' File "<stdin>", line 1 SyntaxError: bytes can only contain ASCII literal characters. >>> 'ééé'.encode() b'\xc3\xa9\xc3\xa9\xc3\xa9' >>>
- W
l'IV est ce qu'on appelle le "vecteur d'initialisation", il est directement lié au mode de chiffrement
https://fr.wikipedia.org/wiki/Mode_d...ecteur_initial
je rejoins wiztricks sur le fait qu'il est impératif de connaitre et comprendre les bases de la cryptographie et du chiffrement de données pour utiliser correctement une lib comme pycrypto
Merci pour votre aide.
J'ai essayé ça mais ça ne marche pas :
Je crois que ça vient de PyCrypto qui fait la conversion string to byte lui même parce qu'avec Fernet ça marche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 oAES = AES.new(sCle, AES.MODE_ECB) sTexteC = oAES.encrypt(sTexte.encode())
Pour ce qui de l'adaptation du texte et de la clé pour AES :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 oFernet = Fernet(sCle) sTexteC = oFernet.encrypt(sTexte.encode())
Le texte :
Et au moment du déchiffrage :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if len(sTexte) % 16 != 0: iN = 16 - (len(sTexte) % 16) for i in range(0, iN): sTexte += "\0"
La clé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part sTexteD = oAES.decrypt(sTexte).replace(b"\0", b"")
Normalement avec ça, toute les données entrées par l'utilisateur peuvent passer par AES.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 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"
Du coup, pour mon projet, je crois que je vais me tourner vers Fernet.
[QUOTE=TiDi.;8540708]J'ai essayé ça mais ça ne marche pas :
Ca ne marche pas n'est pas un message d'erreur et le code que vous montrez ne permet pas de reproduire quoi que ce soit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 oAES = AES.new(sCle, AES.MODE_ECB) sTexteC = oAES.encrypt(sTexte.encode())
Si vous ne prenez pas la peine d'essayer de comprendre ce que vous faites, la patrouille vous rattrapera assez vite.
- W
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager