Ir para o conteúdo do rodapé
AJUDA DO PYTHON

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

  1. 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.
  2. 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.
  3. 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.
  4. Autossuficiente: O PyCryptodome não requer nenhuma dependência externa, o que facilita sua instalação e uso em diferentes ambientes.
  5. 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
SHELL

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())
PYTHON

PyCryptodome (Como funciona para desenvolvedores): Figura 1 - Saída de hashing

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")
PYTHON

PyCryptodome (Como funciona para desenvolvedores): Figura 2 - Saída AES

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)
PYTHON

PyCryptodome (Como funciona para desenvolvedores): Figura 3 - Saída RSA

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)
PYTHON

PyCryptodome (Como funciona para desenvolvedores): Figura 4 - Saída PBKDF2

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")
PYTHON

PyCryptodome (Como funciona para desenvolvedores): Figura 5 - Protegendo a saída da senha

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
SHELL

PyCryptodome (Como funciona para desenvolvedores): Figura 6 - 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)
PYTHON

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.

PyCryptodome (Como funciona para desenvolvedores): Figura 7 - Saída de arquivo criptografado

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.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim