Python Language Chiffrement symétrique avec pycrypto


Exemple

La fonctionnalité de cryptage intégrée de Python se limite actuellement au hachage. Le cryptage nécessite un module tiers tel que pycrypto . Par exemple, il fournit l' algorithme AES qui est considéré comme étant à la pointe de la technologie pour le chiffrement symétrique. Le code suivant chiffrera un message donné à l'aide d'une phrase secrète:

import hashlib
import math
import os

from Crypto.Cipher import AES

IV_SIZE = 16    # 128 bit, fixed for the AES algorithm
KEY_SIZE = 32   # 256 bit meaning AES-256, can also be 128 or 192 bits
SALT_SIZE = 16  # This size is arbitrary

cleartext = b'Lorem ipsum'
password = b'highly secure encryption password'
salt = os.urandom(SALT_SIZE)
derived = hashlib.pbkdf2_hmac('sha256', password, salt, 100000,
                              dklen=IV_SIZE + KEY_SIZE)
iv = derived[0:IV_SIZE]
key = derived[IV_SIZE:]

encrypted = salt + AES.new(key, AES.MODE_CFB, iv).encrypt(cleartext)

L'algorithme AES prend trois paramètres: la clé de chiffrement, le vecteur d'initialisation (IV) et le message réel à chiffrer. Si vous avez une clé AES générée aléatoirement, vous pouvez l'utiliser directement et simplement générer un vecteur d'initialisation aléatoire. Une phrase secrète n’a pas la bonne taille, cependant, il ne serait pas recommandé de l’utiliser directement, étant donné qu’elle n’est pas vraiment aléatoire et qu’elle a donc peu d’entropie. Au lieu de cela, nous utilisons l' implémentation intégrée de l'algorithme PBKDF2 pour générer un vecteur d'initialisation de 128 bits et une clé de chiffrement de 256 bits à partir du mot de passe.

Notez le sel aléatoire qui est important d'avoir un vecteur d'initialisation et une clé différents pour chaque message chiffré. Cela garantit notamment que deux messages égaux ne produiront pas un texte chiffré identique, mais empêchera également les attaquants de réutiliser le travail passé en devinant une phrase secrète sur les messages chiffrés avec une autre phrase secrète. Ce sel doit être stocké avec le message crypté afin de dériver le même vecteur d'initialisation et la même clé pour le décryptage.

Le code suivant déchiffrera à nouveau notre message:

salt = encrypted[0:SALT_SIZE]
derived = hashlib.pbkdf2_hmac('sha256', password, salt, 100000,
                              dklen=IV_SIZE + KEY_SIZE)
iv = derived[0:IV_SIZE]
key = derived[IV_SIZE:]
cleartext = AES.new(key, AES.MODE_CFB, iv).decrypt(encrypted[SALT_SIZE:])