AYUDA DE PYTHON

Uso de PyCryptodome para cifrado en Python

Publicado en 1 de julio, 2024
Compartir:

En la era de la transformación digital, nunca se insistirá lo suficiente en la importancia de contar con mecanismos criptográficos sólidos. La criptografía garantiza la seguridad y la privacidad de los datos a medida que atraviesan diversas redes y sistemas. PyCryptodome es una librería Python que destaca en el panorama criptográfico, ofreciendo una plétora de funcionalidades para facilitar el manejo seguro de datos, como modos de cifrado autenticado(GCM, CCM, EAX, SIV, OCB) y AES acelerado con soporte de primera clase. Este artículo profundiza en la última versión oficial de PyCryptodome, explorando sus características, casos de uso, proceso de instalación simplificado, y cómo puede ser utilizado eficazmente en diversas aplicaciones. También crearemos archivos PDF encriptados utilizando una biblioteca independiente de C#, IronPDF, con PyCryptodome.

Visión general de PyCryptodome

PyCryptodome es un paquete Python autónomo de primitivas criptográficas de bajo nivel. Fue diseñada para sustituir a la antigua biblioteca PyCrypto, abordando muchas de sus limitaciones y ampliando sus capacidades. Ofrece una amplia gama de algoritmos y protocolos criptográficos, lo que la convierte en una herramienta inestimable para los desarrolladores que necesitan implementar funciones de seguridad en sus aplicaciones.

Características principales

  1. Amplio soporte de algoritmos: PyCryptodome soporta una amplia gama de algoritmos criptográficos, incluyendo AES, RSA, DSA, y muchos más. Este amplio soporte garantiza que los desarrolladores puedan encontrar las herramientas necesarias para diversas necesidades criptográficas.

  2. Facilidad de uso: La biblioteca está diseñada para ser fácil de usar, con una API clara y concisa que permite incluso a aquellos con conocimientos criptográficos limitados implementar funciones de seguridad de manera efectiva.

  3. Mantenimiento Activo: A diferencia de su predecesor PyCrypto, PyCryptodome se mantiene activamente, con actualizaciones y mejoras regulares, asegurando la compatibilidad con las últimas versiones de Python y estándares de seguridad.

  4. Autónomo: PyCryptodome no requiere dependencias externas, por lo que es fácil de instalar y utilizar en diferentes entornos.

  5. Integración con librerías existentes: PyCryptodome puede integrarse perfectamente con otras librerías y frameworks de Python, mejorando su utilidad en diversas aplicaciones.

Instalación

Instalar PyCryptodome es un proceso sencillo, gracias a su naturaleza autocontenida. Puede instalarse mediante pip, el instalador de paquetes de Python, utilizando el siguiente comando:

pip install pycryptodome

Conceptos básicos y módulos

PyCryptodome está organizado en varios módulos, cada uno de ellos dedicado a diferentes aspectos de la criptografía. Comprender estos módulos es crucial para aprovechar la biblioteca con eficacia.

Hashing

Las funciones hash son fundamentales para la criptografía, ya que permiten obtener un valor hash de tamaño fijo a partir de datos arbitrarios. PyCryptodome soporta varios algoritmos hash a través del módulo Crypto.Hash.

Ejemplo de utilización de la función hash SHA-256

from Crypto.Hash import SHA256
hash_object = SHA256.new(data=b'Hello, PyCryptodome!')
print(hash_object.hexdigest())
PYTHON

PyCryptodome(Cómo funciona para desarrolladores): Figura 1 - Salida Hashing

Cifrado simétrico

El cifrado simétrico utiliza la misma clave para cifrar y descifrar. El módulo Crypto.Cipher de PyCryptodome soporta varios cifrados simétricos, incluyendo AES, DES y más.

Ejemplo de cifrado y descifrado AES

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

key = get_random_bytes(16)  # 16 bytes for AES-128
cipher = AES.new(key, AES.MODE_EAX)
data = b'Secret Message'
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(data)

# Decryption
cipher = AES.new(key, AES.MODE_EAX, nonce=nonce)
plaintext = cipher.decrypt(ciphertext)
try:
    cipher.verify(tag)
    print("The message is authentic:", plaintext)
except ValueError:
    print("Key incorrect or message corrupted")
PYTHON

PyCryptodome(Cómo funciona para desarrolladores): Figura 2 - Salida AES

Cifrado asimétrico

El cifrado asimétrico utiliza un par de claves: una clave pública para el cifrado y una clave privada para el descifrado. El módulo Crypto.PublicKey de PyCryptodome proporciona soporte para RSA, DSA y ECC(Criptografía de curva elíptica).

Ejemplo de cifrado y descifrado RSA

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

key = RSA.generate(2048)
public_key = key.publickey()
cipher = PKCS1_OAEP.new(public_key)
ciphertext = cipher.encrypt(b'Secret Message')

# Decryption
cipher = PKCS1_OAEP.new(key)
plaintext = cipher.decrypt(ciphertext)
print(plaintext)
PYTHON

PyCryptodome(Cómo funciona para desarrolladores): Figura 3 - Salida RSA

Derivación de claves

Las funciones de derivación de claves generan claves criptográficas a partir de una contraseña o frase de contraseña. Esto es especialmente útil en el cifrado basado en contraseñas. PyCryptodome soporta PBKDF2, scrypt, y otros algoritmos de derivación de claves.

Ejemplo de utilización de PBKDF2

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

password = b'my secret password'
salt = get_random_bytes(16)
key = PBKDF2(password, salt, dkLen=32, count=1000000)
print(key)
PYTHON

PyCryptodome(Cómo funciona para desarrolladores): Figura 4 - Salida PBKDF2

Casos prácticos

Gestión de contraseñas

Los gestores de contraseñas se benefician de las funciones de derivación de claves de PyCryptodome para almacenar y recuperar de forma segura las contraseñas de los usuarios. Mediante el uso de algoritmos de derivación de claves fuertes como PBKDF2, los desarrolladores pueden garantizar que las contraseñas almacenadas sean resistentes a los ataques de fuerza bruta.

Ejemplo de seguridad de contraseñas

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'])
try:
    cipher.verify(password_data['tag'])
    print("The stored password is authentic:", plaintext)
except ValueError:
    print("Key incorrect or password corrupted")
PYTHON

PyCryptodome(Cómo funciona para desarrolladores): Figura 5 - Asegurando la salida de contraseñas

IronPDF for Python

IronPDF es una potente biblioteca de generación de PDF para Python que permite a los desarrolladores crear, editar y manipular documentos PDF sin esfuerzo. Ofrece una amplia gama de funcionalidades, desde la conversión de HTML a PDF hasta la fusión de varios PDF, lo que la convierte en la opción ideal para automatizar los flujos de trabajo de documentos. Cuando se combina con PyCryptodome, una robusta biblioteca para operaciones criptográficas, los desarrolladores pueden añadir funciones seguras a sus documentos PDF, como cifrado y firmas digitales. Esta integración es especialmente útil para aplicaciones que requieren altos niveles de seguridad e integridad de los datos, como en entornos financieros, jurídicos o confidenciales.

Para instalar IronPDF, puede utilizar pip, el gestor de paquetes de Python. He aquí cómo empezar:

pip install ironpdf

PyCryptodome(Cómo funciona para desarrolladores): Figura 6 - IronPDF

Tras la instalación, puede empezar a utilizar IronPDF para crear y manipular archivos PDF. A continuación se muestra un ejemplo sencillo que demuestra cómo crear un PDF con IronPDF y luego utilizar PyCryptodome para cifrarlo:

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

renderer = ChromePdfRenderer()
pdfFromUrl = renderer.RenderUrlAsPdf("https://ironpdf.com/")
pdfFromUrl.SaveAs("output.pdf")

# Encrypt the PDF with AES
def encrypt_file(file_name, key):
    cipher = AES.new(key, AES.MODE_CBC)
    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

Este script muestra la creación de un PDF simple usando IronPDF y luego lo encripta usando AES de PyCryptodome, proporcionando una base para construir aplicaciones de manejo de PDF más complejas y seguras.

PyCryptodome(Cómo funciona para desarrolladores): Figura 7 - Salida de archivos encriptados

Conclusión

En conclusión, PyCryptodome es una potente y versátil librería Python que mejora significativamente las operaciones criptográficas para los desarrolladores, ofreciendo una amplia gama de algoritmos y una fácil integración con otras herramientas como IronPDF. Con su amplio conjunto de características, incluyendo soporte para modos de cifrado autenticado, cifrado simétrico y asimétrico, hashing y derivación de claves, PyCryptodome responde a las necesidades de las aplicaciones modernas que requieren medidas de seguridad robustas. Su facilidad de uso, su mantenimiento activo y su carácter autónomo lo convierten en una herramienta indispensable para implementar el tratamiento seguro de datos en diversos escenarios, desde la gestión de contraseñas hasta la generación y encriptación segura de documentos, garantizando la integridad y confidencialidad de los datos en un mundo cada vez más digital.

Para obtener más información sobre las licencias de IronPDF, consulte la página de licencias de IronPDF. Para saber más, consulta nuestro completo tutorial sobre la conversión de HTML a PDF.

< ANTERIOR
Uso de WhisperX en Python para la transcripción
SIGUIENTE >
OpenTelemetry Python (Cómo funciona para desarrolladores)

¿Listo para empezar? Versión: 2024.11.1 acaba de salir

Instalación pip gratuita Ver licencias >