Usando PyCryptodome para criptografia em Python
Na era da transformação digital, a importância de mecanismos criptográficos robustos não pode ser subestimada. A criptografia garante a segurança e a privacidade dos dados à medida que estes trafegam por diversas redes e sistemas. PyCryptodome é uma biblioteca Python que se destaca no cenário da criptografia, oferecendo uma vasta gama de funcionalidades para facilitar o manuseio seguro de dados, como modos de criptografia autenticada (GCM, CCM, EAX, SIV, OCB) e AES acelerado com suporte de primeira classe. Este artigo analisa a última versão oficial do PyCryptodome, explorando seus recursos, casos de uso, processo de instalação simplificado e como ele pode ser utilizado de forma eficaz em diversas aplicações. Também criaremos arquivos PDF criptografados usando uma biblioteca C# separada, IronPDF, com PyCryptodome.
Visão geral do PyCryptodome
PyCryptodome é um pacote Python independente de primitivas criptográficas de baixo nível. Foi projetado para ser um substituto direto da antiga biblioteca PyCrypto, resolvendo muitas de suas limitações e ampliando suas capacidades. Oferece uma ampla gama de algoritmos e protocolos criptográficos, tornando-se uma ferramenta indispensável para desenvolvedores que precisam implementar recursos de segurança em seus aplicativos.
Principais características
- Ampla compatibilidade com algoritmos: PyCryptodome oferece suporte a uma ampla gama de algoritmos criptográficos, incluindo AES, RSA, DSA e muitos outros. Esse amplo suporte garante que os desenvolvedores possam encontrar as ferramentas necessárias para diversas necessidades criptográficas.
- Facilidade de uso: A biblioteca foi projetada para ser fácil de usar, com uma API clara e concisa que permite até mesmo a pessoas com conhecimento limitado em criptografia implementar recursos de segurança de forma eficaz.
- Manutenção ativa: Ao contrário de seu antecessor PyCrypto, o PyCryptodome recebe manutenção ativa, com atualizações e melhorias regulares, garantindo compatibilidade com as versões mais recentes do Python e os padrões de segurança.
- Autossuficiente: O PyCryptodome não requer nenhuma dependência externa, o que facilita sua instalação e uso em diferentes ambientes.
- Integração com bibliotecas existentes: PyCryptodome pode ser integrado perfeitamente com outras bibliotecas e frameworks Python, ampliando sua utilidade em diversas aplicações.
Instalação
A instalação do PyCryptodome é um processo simples, graças à sua natureza autossuficiente. Ele pode ser instalado através do pip, o instalador de pacotes do Python, usando o seguinte comando:
pip install pycryptodome
pip install pycryptodome
Conceitos e Módulos Essenciais
PyCryptodome está organizado em vários módulos, cada um dedicado a diferentes aspectos da criptografia. Compreender esses módulos é crucial para aproveitar a biblioteca de forma eficaz.
Hashing
As funções hash são fundamentais para a criptografia, fornecendo uma maneira de produzir um valor hash de tamanho fixo a partir de dados arbitrários. PyCryptodome suporta vários algoritmos de hash através do módulo Crypto.Hash.
Exemplo de utilização da função hash 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())

Criptografia Simétrica
A criptografia simétrica envolve o uso da mesma chave tanto para a criptografia quanto para a descriptografia. O módulo Crypto.Cipher do PyCryptodome suporta diversas cifras simétricas, incluindo AES, DES e outras.
Exemplo de criptografia e descriptografia 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")

Criptografia Assimétrica
A criptografia assimétrica utiliza um par de chaves: uma chave pública para criptografia e uma chave privada para descriptografia. O módulo Crypto.PublicKey do PyCryptodome oferece suporte para RSA, DSA e ECC (Criptografia de Curva Elíptica).
Exemplo de criptografia e descriptografia 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)

Derivação chave
As funções de derivação de chaves geram chaves criptográficas a partir de uma senha ou frase secreta. Isso é particularmente útil na criptografia baseada em senhas. PyCryptodome suporta PBKDF2, scrypt e outros algoritmos de derivação de chaves.
Exemplo de utilização do 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)

Casos de uso
Gerenciamento de senhas
Os gerenciadores de senhas se beneficiam das funções de derivação de chaves do PyCryptodome para armazenar e recuperar senhas de usuários com segurança. Ao utilizar algoritmos robustos de derivação de chaves, como o PBKDF2, os desenvolvedores podem garantir que as senhas armazenadas sejam resistentes a ataques de força bruta.
Exemplo de como proteger senhas
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")

IronPDF for Python
IronPDF é uma poderosa biblioteca for Python voltada para geração de PDFs, que permite aos desenvolvedores criar, editar e manipular documentos PDF sem esforço. Oferece uma ampla gama de funcionalidades, desde a conversão de HTML para PDF até a fusão de vários PDFs, tornando-se uma escolha ideal para automatizar fluxos de trabalho de documentos. Quando combinada com o PyCryptodome, uma biblioteca robusta para operações criptográficas, os desenvolvedores podem adicionar recursos de segurança aos seus documentos PDF, como criptografia e assinaturas digitais. Essa integração é particularmente útil para aplicações que exigem altos níveis de segurança e integridade de dados, como em ambientes financeiros, jurídicos ou confidenciais.
Para instalar o IronPDF, você pode usar o pip, o gerenciador de pacotes do Python. Veja como começar:
pip install ironpdf
pip install ironpdf

Após a instalação, você poderá começar a usar o IronPDF para criar e manipular PDFs. Abaixo, um exemplo simples demonstrando como criar um PDF com o IronPDF e, em seguida, usar o PyCryptodome para criptografá-lo:
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)
Este script demonstra a criação de um PDF simples usando o IronPDF e, em seguida, criptografá-lo usando AES do PyCryptodome, fornecendo uma base para a construção de aplicativos de manipulação de PDF mais complexos e seguros.

Conclusão
Em conclusão, PyCryptodome é uma biblioteca Python poderosa e versátil que aprimora significativamente as operações criptográficas para desenvolvedores, oferecendo uma ampla gama de algoritmos e fácil integração com outras ferramentas como o IronPDF. Com seu conjunto abrangente de recursos, incluindo suporte para modos de criptografia autenticada, criptografia simétrica e assimétrica, hashing e derivação de chaves, o PyCryptodome atende às necessidades de aplicações modernas que exigem medidas de segurança robustas. Sua facilidade de uso, manutenção ativa e natureza autossuficiente o tornam uma ferramenta indispensável para implementar o tratamento seguro de dados em diversos cenários, desde o gerenciamento de senhas até a geração e criptografia seguras de documentos, garantindo a integridade e a confidencialidade dos dados em um mundo cada vez mais digital.
Para obter detalhes sobre o licenciamento do IronPDF , consulte a página de licença do IronPDF . Para explorar mais a fundo, confira nosso tutorial completo sobre como converter HTML em PDF.




