Passer au contenu du pied de page
AIDE PYTHON

Utilisation de PyCryptodome pour le chiffrement en Python

À l'ère de la transformation numérique, l'importance de mécanismes cryptographiques robustes ne saurait être sous-estimée. La cryptographie assure la sécurité et la confidentialité des données lorsqu'elles traversent divers réseaux et systèmes. PyCryptodome est une bibliothèque Python qui se distingue dans le paysage cryptographique en offrant une pléthore de fonctionnalités pour faciliter la gestion sécurisée des données, telles que les modes de chiffrement authentifiés (GCM, CCM, EAX, SIV, OCB) et l'AES accéléré avec un support de premier ordre. Cet article explore la dernière version officielle de PyCryptodome, explorant ses fonctionnalités, cas d'utilisation, processus d'installation simplifié, et comment l'utiliser efficacement dans diverses applications. Nous créerons également des fichiers PDF cryptés à l'aide d'une bibliothèque C# distincte, IronPDF, avec PyCryptodome.

Aperçu de PyCryptodome

PyCryptodome est un package Python autonome de primitives cryptographiques bas-niveau. Il a été conçu pour être un remplacement immédiat de la vieille bibliothèque PyCrypto, en abordant bon nombre de ses limitations et en étendant ses capacités. Il fournit une large gamme d'algorithmes et de protocoles cryptographiques, ce qui en fait un outil inestimable pour les développeurs ayant besoin de mettre en œuvre des fonctionnalités de sécurité dans leurs applications.

Fonctionnalités clés

  1. Support Large d'Algorithmes : PyCryptodome supporte un éventail complet d'algorithmes cryptographiques, incluant AES, RSA, DSA, et bien plus. Ce support étendu assure que les développeurs peuvent trouver les outils nécessaires pour divers besoins cryptographiques.
  2. Facilité d'Utilisation : La bibliothèque est conçue pour être conviviale, avec une API claire et concise qui permet, même à ceux ayant des connaissances cryptographiques limitées, d'implémenter efficacement des fonctionnalités de sécurité.
  3. Maintenance Active : Contrairement à son prédécesseur PyCrypto, PyCryptodome est activement maintenu, avec des mises à jour régulières et des améliorations, assurant la compatibilité avec les dernières versions de Python et les normes de sécurité.
  4. Autonome : PyCryptodome ne nécessite aucune dépendance externe, ce qui le rend simple à installer et à utiliser dans différents environnements.
  5. Intégration avec des Bibliothèques Existantes : PyCryptodome peut s'intégrer sans coutures avec d'autres bibliothèques et cadres Python, augmentant son utilité dans diverses applications.

Installation

Installer PyCryptodome est un processus simple, grâce à sa nature autonome. Il peut être installé via pip, l'installateur de packages Python, en utilisant la commande suivante :

pip install pycryptodome
pip install pycryptodome
SHELL

Concepts et Modules Principaux

PyCryptodome est organisé en plusieurs modules, chacun répondant à différents aspects de la cryptographie. Comprendre ces modules est crucial pour tirer parti de la bibliothèque efficacement.

Hachage

Les fonctions de hachage sont fondamentales pour la cryptographie, fournissant un moyen de produire une valeur de hachage de taille fixe à partir de données arbitraires. PyCryptodome supporte divers algorithmes de hachage via le module Crypto.Hash.

Exemple d'utilisation de la fonction de hachage SHA-256

from Crypto.Hash import SHA256

# Create a new SHA-256 hash object
hash_object = SHA256.new(data=b'Hello, PyCryptodome!')

# Output the hexadecimal digest of the hash
print(hash_object.hexdigest())
from Crypto.Hash import SHA256

# Create a new SHA-256 hash object
hash_object = SHA256.new(data=b'Hello, PyCryptodome!')

# Output the hexadecimal digest of the hash
print(hash_object.hexdigest())
PYTHON

PyCryptodome (Comment cela fonctionne pour les développeurs) : Figure 1 - Sortie de Hachage

Chiffrement Symétrique

Le chiffrement symétrique implique la même clé pour le chiffrement et le déchiffrement. Le module Crypto.Cipher de PyCryptodome prend en charge plusieurs chiffrements symétriques, y compris AES, DES, et plus.

Exemple de chiffrement et de déchiffrement AES

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# Generate a random AES key
key = get_random_bytes(16)  # 16 bytes for AES-128

# Create a new AES cipher in EAX mode for encryption
cipher = AES.new(key, AES.MODE_EAX)
data = b'Secret Message'

# Encrypt the data and get the nonce, ciphertext and tag
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(data)

# Create a new AES cipher in EAX mode for decryption
cipher = AES.new(key, AES.MODE_EAX, nonce=nonce)
plaintext = cipher.decrypt(ciphertext)

# Verify the authenticity of the message
try:
    cipher.verify(tag)
    print("The message is authentic:", plaintext)
except ValueError:
    print("Key incorrect or message corrupted")
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# Generate a random AES key
key = get_random_bytes(16)  # 16 bytes for AES-128

# Create a new AES cipher in EAX mode for encryption
cipher = AES.new(key, AES.MODE_EAX)
data = b'Secret Message'

# Encrypt the data and get the nonce, ciphertext and tag
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(data)

# Create a new AES cipher in EAX mode for decryption
cipher = AES.new(key, AES.MODE_EAX, nonce=nonce)
plaintext = cipher.decrypt(ciphertext)

# Verify the authenticity of the message
try:
    cipher.verify(tag)
    print("The message is authentic:", plaintext)
except ValueError:
    print("Key incorrect or message corrupted")
PYTHON

PyCryptodome (Comment cela fonctionne pour les développeurs) : Figure 2 - Sortie AES

Chiffrement Asymétrique

Le chiffrement asymétrique utilise une paire de clés : une clé publique pour le chiffrement et une clé privée pour le déchiffrement. Le module Crypto.PublicKey de PyCryptodome fournit un support pour RSA, DSA, et ECC (Cryptographie sur Courbes Elliptiques).

Exemple de chiffrement et de déchiffrement RSA

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

# Generate an RSA key pair
key = RSA.generate(2048)
public_key = key.publickey()

# Encrypt the message using the public key
cipher = PKCS1_OAEP.new(public_key)
ciphertext = cipher.encrypt(b'Secret Message')

# Decrypt the message using the private key
cipher = PKCS1_OAEP.new(key)
plaintext = cipher.decrypt(ciphertext)
print(plaintext)
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

# Generate an RSA key pair
key = RSA.generate(2048)
public_key = key.publickey()

# Encrypt the message using the public key
cipher = PKCS1_OAEP.new(public_key)
ciphertext = cipher.encrypt(b'Secret Message')

# Decrypt the message using the private key
cipher = PKCS1_OAEP.new(key)
plaintext = cipher.decrypt(ciphertext)
print(plaintext)
PYTHON

PyCryptodome (Comment cela fonctionne pour les développeurs) : Figure 3 - Sortie RSA

Dérivation de Clés

Les fonctions de dérivation de clé génèrent des clés cryptographiques à partir d’un mot de passe ou d’une phrase secrète. Cela est particulièrement utile dans le chiffrement basé sur mot de passe. PyCryptodome supporte PBKDF2, scrypt, et d'autres algorithmes de dérivation de clé.

Exemple d'utilisation de PBKDF2

from Crypto.Protocol.KDF import PBKDF2
from Crypto.Random import get_random_bytes

# Define a password and generate a salt
password = b'my secret password'
salt = get_random_bytes(16)

# Derive a key from the password and salt using PBKDF2
key = PBKDF2(password, salt, dkLen=32, count=1000000)
print(key)
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Random import get_random_bytes

# Define a password and generate a salt
password = b'my secret password'
salt = get_random_bytes(16)

# Derive a key from the password and salt using PBKDF2
key = PBKDF2(password, salt, dkLen=32, count=1000000)
print(key)
PYTHON

PyCryptodome (Comment cela fonctionne pour les développeurs) : Figure 4 - Sortie PBKDF2

Cas d'utilisation

Gestion des Mots de Passe

Les gestionnaires de mots de passe bénéficient des fonctions de dérivation de clé de PyCryptodome pour stocker et récupérer en toute sécurité les mots de passe des utilisateurs. En utilisant des algorithmes de dérivation de clé forts comme PBKDF2, les développeurs peuvent s'assurer que les mots de passe stockés sont résistants aux attaques par force brute.

Exemple de sécurisation des mots de passe

from Crypto.Protocol.KDF import PBKDF2
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES

# Derive a strong key from a password
password = b'user_password'
salt = get_random_bytes(16)
key = PBKDF2(password, salt, dkLen=32, count=1000000)

# Encrypt the password before storing
cipher = AES.new(key, AES.MODE_EAX)
stored_password = b'ActualPassword'
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(stored_password)

# Store ciphertext, nonce, salt, and tag securely
password_data = {
    'ciphertext': ciphertext,
    'nonce': nonce,
    'salt': salt,
    'tag': tag
}

# Decrypt the password when needed
key = PBKDF2(password, password_data['salt'], dkLen=32, count=1000000)
cipher = AES.new(key, AES.MODE_EAX, nonce=password_data['nonce'])
plaintext = cipher.decrypt(password_data['ciphertext'])

# Verify the authenticity of the password
try:
    cipher.verify(password_data['tag'])
    print("The stored password is authentic:", plaintext)
except ValueError:
    print("Key incorrect or password corrupted")
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES

# Derive a strong key from a password
password = b'user_password'
salt = get_random_bytes(16)
key = PBKDF2(password, salt, dkLen=32, count=1000000)

# Encrypt the password before storing
cipher = AES.new(key, AES.MODE_EAX)
stored_password = b'ActualPassword'
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(stored_password)

# Store ciphertext, nonce, salt, and tag securely
password_data = {
    'ciphertext': ciphertext,
    'nonce': nonce,
    'salt': salt,
    'tag': tag
}

# Decrypt the password when needed
key = PBKDF2(password, password_data['salt'], dkLen=32, count=1000000)
cipher = AES.new(key, AES.MODE_EAX, nonce=password_data['nonce'])
plaintext = cipher.decrypt(password_data['ciphertext'])

# Verify the authenticity of the password
try:
    cipher.verify(password_data['tag'])
    print("The stored password is authentic:", plaintext)
except ValueError:
    print("Key incorrect or password corrupted")
PYTHON

PyCryptodome (Comment cela fonctionne pour les développeurs) : Figure 5 - Sortie de Sécurisation des Mots de Passe

IronPDF pour Python

IronPDF est une puissante bibliothèque de génération de PDF pour Python qui permet aux développeurs de créer, éditer, et manipuler des documents PDF aisément. Elle offre une large gamme de fonctionnalités, allant de la conversion de HTML en PDF à la fusion de plusieurs PDFs, ce qui en fait un choix idéal pour automatiser les flux de travail documentaires. Lorsqu'elle est combinée avec PyCryptodome, une bibliothèque robuste pour les opérations cryptographiques, les développeurs peuvent ajouter des fonctionnalités sécurisées à leurs documents PDF, telles que le chiffrement et les signatures numériques. Cette intégration est particulièrement utile pour les applications nécessitant de hauts niveaux de sécurité et d'intégrité des données, comme dans les environnements financiers, juridiques, ou confidentiels.

Pour installer IronPDF, vous pouvez utiliser pip, le gestionnaire de packages Python. Voici comment commencer :

pip install ironpdf
pip install ironpdf
SHELL

PyCryptodome (Comment cela fonctionne pour les développeurs) : Figure 6 - IronPDF

Après l'installation, vous pouvez commencer à utiliser IronPDF pour créer et manipuler des PDFs. Voici un simple exemple démontrant comment créer un PDF avec IronPDF et ensuite l'utiliser avec PyCryptodome pour le chiffrer :

from ironpdf import ChromePdfRenderer
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import os

# Create a new PDF renderer
renderer = ChromePdfRenderer()

# Render a URL as a PDF and save it
pdfFromUrl = renderer.RenderUrlAsPdf("https://ironpdf.com/")
pdfFromUrl.SaveAs("output.pdf")

# Function to encrypt a file using AES
def encrypt_file(file_name, key):
    cipher = AES.new(key, AES.MODE_CBC)  # Use AES in CBC mode
    iv = cipher.iv
    with open(file_name, 'rb') as f:
        data = f.read()
    encrypted_data = iv + cipher.encrypt(pad(data, AES.block_size))
    with open(file_name + '.enc', 'wb') as f:
        f.write(encrypted_data)

# Example usage
key = os.urandom(16)  # AES key must be either 16, 24, or 32 bytes long
encrypt_file("output.pdf", key)
from ironpdf import ChromePdfRenderer
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import os

# Create a new PDF renderer
renderer = ChromePdfRenderer()

# Render a URL as a PDF and save it
pdfFromUrl = renderer.RenderUrlAsPdf("https://ironpdf.com/")
pdfFromUrl.SaveAs("output.pdf")

# Function to encrypt a file using AES
def encrypt_file(file_name, key):
    cipher = AES.new(key, AES.MODE_CBC)  # Use AES in CBC mode
    iv = cipher.iv
    with open(file_name, 'rb') as f:
        data = f.read()
    encrypted_data = iv + cipher.encrypt(pad(data, AES.block_size))
    with open(file_name + '.enc', 'wb') as f:
        f.write(encrypted_data)

# Example usage
key = os.urandom(16)  # AES key must be either 16, 24, or 32 bytes long
encrypt_file("output.pdf", key)
PYTHON

Ce script montre la création d'un PDF simple en utilisant IronPDF puis le chiffre en utilisant AES de PyCryptodome, fournissant une base pour construire des applications de gestion de PDF plus complexes et sécurisées.

PyCryptodome (Comment cela fonctionne pour les développeurs) : Figure 7 - Sortie du Fichier Chiffré

Conclusion

En conclusion, PyCryptodome est une bibliothèque Python puissante et polyvalente qui améliore considérablement les opérations cryptographiques pour les développeurs, offrant un large éventail d'algorithmes et une intégration facile avec d'autres outils comme IronPDF. Avec son ensemble complet de fonctionnalités, y compris le support des modes de chiffrement authentifiés, le chiffrement symétrique et asymétrique, le hachage, et la dérivation de clés, PyCryptodome répond aux besoins des applications modernes nécessitant des mesures de sécurité robustes. Sa facilité d'utilisation, sa maintenance active, et son caractère autonome en font un outil indispensable pour mettre en œuvre la gestion sécurisée des données dans divers scénarios, de la gestion des mots de passe à la génération et au chiffrement sécurisés de documents, garantissant l'intégrité et la confidentialité des données dans un monde de plus en plus numérique.

Pour plus de détails sur le licenciement d'IronPDF, consultez la page de licence IronPDF. Pour aller plus loin, consultez notre tutoriel approfondi sur la conversion de HTML en PDF.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite