Mise en oeuvre des chiffrements symétriques DES et Triple DES. Le Triple DES est codé à l'aide du DES, et peut se faire de deux manières :
Ce module est programmé en pur Python : il est donc portable, indépendant de la plateforme, mais ne convient pas à ceux nécessitant une version rapide de cet algorithme.
Le Triple DES revient juste à lancer 3 fois le DES. La clé fournie, de 16 ou 24 octets, est séparée en 3 nouvelles clés, dépendant de la longueur de la clé originelle. Le Triple DES dépend lui aussi de cette taille...
Si une clé de 24 octets est fournie, le DES-EDE3 sera la méthode choisie pour le Triple DES :
Si la clé originelle fait 16 octets, la méthode utilisée sera alors le DES-EDE2 : on retrouve encore trois applications du DES (chiffrement, déchiffrement, puis rechiffrement).
Seulement, les deux opérations de chiffrement utilisent cette fois-ci la même clé : celle correspondant aux 8 premiers octets.
Le module pyDes peut se télécharger ici.
>>> import pyDes
Notre clé sera "\0\0\0\0\0\0\0\0", constituée de 8 octets :
>>> k = pyDes.des("DESCRYPT", pyDes.CBC, "\0\0\0\0\0\0\0\0")
On utilise la méthode encrypt pour chiffrer un message :
>>> d = k.encrypt("Chiffrez-moi") Traceback (most recent call last): File "<input>", line 1, in <module> File "/usr/lib/python2.5/site-packages/pyDes.py", line 495, in encrypt return self.crypt(data, des.ENCRYPT) File "/usr/lib/python2.5/site-packages/pyDes.py", line 409, in crypt raise ValueError("Invalid data length, data must be a multiple of " + str(self.block_size) + " bytes\n. Try setting the optional padding character") ValueError: Invalid data length, data must be a multiple of 8 bytes. Try setting the optional padding character
Le texte à chiffrer doit avoir une longueur divisible par la taille de la clé :
>>> d = k.encrypt("__Chiffrez-moi__") >>> print "Cryptogramme : " + d Cryptogramme : ~P��~D�F^P��j^R^^�{er >>> print "Chaîne déchiffrée : " + k.decrypt(d) Chaîne déchiffrée : __Chiffrez-moi__
(16 est bien divisible par 8). On peut aussi préciser, en deuxième argument, le caractère à utiliser pour compléter la chaîne jusqu'au prochain multiple :
>>> d = k.encrypt("Chiffrez-moi",'*') >>> k.decrypt(d) 'Chiffrez-moi****' >>> k.decrypt(d,'*') 'Chiffrez-moi'
Pour le Triple DES, on procède de la même manière :
>>> k = pyDes.triple_des("CleSecrete3DESDe24Octets") >>> d = k.encrypt("Chiffrez ces données sensibles", "*") >>> print "Cryptogramme : " + d �8~@=kC >>> print "Chaîne déchiffrée : " + k.decrypt(d, "*") Chaîne déchiffrée : Chiffrez ces données sensibles
Il y a deux constructeurs dans la classe pyDes :
Les arguments de ces constructeurs peuvent s'expliquer ainsi :
Il y a deux méthodes dans la classe pyDes :
Les arguments sont ici :