Zum Fußzeileninhalt springen
PYTHON-HILFE

PyCryptodome für Verschlüsselung in Python verwenden

Im Zeitalter der digitalen Transformation kann die Bedeutung robuster kryptografischer Mechanismen nicht hoch genug eingeschätzt werden. Kryptographie gewährleistet die Sicherheit und den Datenschutz von Daten, während sie durch verschiedene Netzwerke und Systeme reisen. PyCryptodome ist eine Python-Bibliothek, die in der kryptografischen Landschaft herausragt und eine Fülle von Funktionalitäten bietet, um eine sichere Datenverarbeitung zu erleichtern, wie z.B. authentifizierte Verschlüsselungsmodi (GCM, CCM, EAX, SIV, OCB) und beschleunigtes AES mit erstklassiger Unterstützung. Dieser Artikel taucht in die letzte offizielle Version von PyCryptodome ein, untersucht dessen Funktionen, Anwendungsfälle, vereinfachten Installationsprozess und wie es effektiv in verschiedenen Anwendungen genutzt werden kann. Wir werden auch verschlüsselte PDF-Dateien mit einer separaten C#-Bibliothek IronPDF und PyCryptodome erstellen.

Übersicht über PyCryptodome

PyCryptodome ist ein eigenständiges Python-Paket mit kryptografischen Low-Level-Primitiven. Es wurde als Ersatz für die alte PyCrypto-Bibliothek entwickelt, um viele ihrer Einschränkungen zu überwinden und ihre Möglichkeiten zu erweitern. Es bietet eine breite Palette von kryptografischen Algorithmen und Protokollen, was es zu einem unschätzbaren Werkzeug für Entwickler macht, die Sicherheitsfunktionen in ihren Anwendungen implementieren müssen.

Wichtige Merkmale

  1. Breite Algorithmusunterstützung: PyCryptodome unterstützt eine umfassende Auswahl an kryptografischen Algorithmen, einschließlich AES, RSA, DSA und viele mehr. Diese umfassende Unterstützung gewährleistet, dass Entwickler die notwendigen Werkzeuge für verschiedene kryptografische Anforderungen finden können.
  2. Einfache Handhabung: Die Bibliothek ist benutzerfreundlich gestaltet, mit einer klaren und prägnanten API, die es selbst denjenigen mit begrenztem kryptografischen Wissen ermöglicht, Sicherheitsfunktionen effektiv zu implementieren.
  3. Aktive Wartung: Im Gegensatz zu ihrem Vorgänger PyCrypto wird PyCryptodome aktiv gewartet, mit regelmäßigen Updates und Verbesserungen, die die Kompatibilität mit den neuesten Python-Versionen und Sicherheitsstandards sicherstellen.
  4. Eigenständig: PyCryptodome benötigt keine externen Abhängigkeiten, was die Installation und Nutzung in verschiedenen Umgebungen einfach macht.
  5. Integration mit bestehenden Bibliotheken: PyCryptodome kann nahtlos mit anderen Python-Bibliotheken und -Frameworks integriert werden, was seine Nützlichkeit in verschiedenen Anwendungen erhöht.

Installation

Die Installation von PyCryptodome ist dank seiner eigenständigen Natur ein einfacher Prozess. Es kann über pip, den Python-Paketinstallationsprogramm, mit dem folgenden Befehl installiert werden:

pip install pycryptodome
pip install pycryptodome
SHELL

Kernkonzepte und Module

PyCryptodome ist in mehrere Module gegliedert, die jeweils unterschiedliche Aspekte der Kryptographie abdecken. Das Verständnis dieser Module ist entscheidend, um die Bibliothek effektiv zu nutzen.

Hashing

Hash-Funktionen sind grundlegend für die Kryptographie und bieten eine Möglichkeit, einen hash-Wert fester Größe aus beliebigen Daten zu erzeugen. PyCryptodome unterstützt verschiedene Hash-Algorithmen über das Crypto.Hash-Modul.

Beispiel zur Verwendung der SHA-256-Hash-Funktion

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 (How It Works For Developers): Abbildung 1 - Hashing-Ausgabe

Symmetrische Verschlüsselung

Symmetrische Verschlüsselung verwendet denselben Schlüssel sowohl für die Verschlüsselung als auch die Entschlüsselung. PyCryptodomes Crypto.Cipher-Modul unterstützt mehrere symmetrische Verschlüsselungen, einschließlich AES, DES und mehr.

Beispiel für AES-Verschlüsselung und -Entschlüsselung

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 (How It Works For Developers): Abbildung 2 - AES-Ausgabe

Asymmetrische Verschlüsselung

Asymmetrische Verschlüsselung verwendet ein Schlüsselpaar: einen öffentlichen Schlüssel zur Verschlüsselung und einen privaten Schlüssel zur Entschlüsselung. PyCryptodomes Crypto.PublicKey-Modul bietet Unterstützung für RSA, DSA und ECC (Elliptische Kurvenkryptographie).

Beispiel für RSA-Verschlüsselung und -Entschlüsselung

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 (How It Works For Developers): Abbildung 3 - RSA-Ausgabe

Schlüsselableitung

Schlüsselableitungsfunktionen erzeugen kryptografische Schlüssel aus einem Passwort oder einer Passphrase. Dies ist besonders nützlich bei passwortbasierter Verschlüsselung. PyCryptodome unterstützt PBKDF2, scrypt und andere Schlüsselableitungsalgorithmen.

Beispiel zur Verwendung von 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 (How It Works For Developers): Abbildung 4 - PBKDF2-Ausgabe

Anwendungsfälle

Passwortverwaltung

Passwortmanager profitieren von PyCryptodomes Schlüsselableitungsfunktionen, um Benutzerpasswörter sicher zu speichern und abzurufen. Durch die Verwendung starker Schlüsselableitungsalgorithmen wie PBKDF2 können Entwickler sicherstellen, dass gespeicherte Passwörter gegen Brute-Force-Angriffe resistent sind.

Beispiel zur Sicherung von Passwörtern

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 (How It Works For Developers): Abbildung 5 - Sicherung der Passwortausgabe

IronPDF for Python

IronPDF ist eine leistungsstarke PDF-Generierungsbibliothek für Python, die es Entwicklern ermöglicht, PDF-Dokumente mühelos zu erstellen, zu bearbeiten und zu manipulieren. Es bietet eine breite Palette von Funktionalitäten, von der Umwandlung von HTML in PDF bis hin zur Zusammenführung mehrerer PDFs, was es zur idealen Wahl für die Automatisierung von Dokumenten-Workflows macht. In Kombination mit PyCryptodome, einer umfassenden Bibliothek für kryptografische Operationen, können Entwickler sichere Funktionen zu ihren PDF-Dokumenten hinzufügen, wie Verschlüsselung und digitale Signaturen. Diese Integration ist besonders nützlich für Anwendungen, die ein hohes Maß an Sicherheit und Datenintegrität erfordern, z.B. in finanziellen, rechtlichen oder vertraulichen Umgebungen.

Um IronPDF zu installieren, können Sie pip, den Python-Paketmanager, verwenden. Hier erfahren Sie, wie Sie beginnen:

pip install ironpdf
pip install ironpdf
SHELL

PyCryptodome (How It Works For Developers): Abbildung 6 - IronPDF

Nach der Installation können Sie mit IronPDF beginnen, PDFs zu erstellen und zu manipulieren. Unten ist ein einfaches Beispiel, das zeigt, wie man mit IronPDF ein PDF erstellt und dann mit PyCryptodome verschlüsselt:

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

Dieses Skript zeigt die Erstellung eines einfachen PDFs mit IronPDF und verschlüsselt es dann mit AES von PyCryptodome, was eine Grundlage für den Aufbau komplexerer und sichererer PDF-Verarbeitungsanwendungen bietet.

PyCryptodome (How It Works For Developers): Abbildung 7 - Verschlüsselte Datei-Ausgabe

Abschluss

Abschließend ist PyCryptodome eine leistungsstarke und vielseitige Python-Bibliothek, die kryptografische Operationen für Entwickler erheblich verbessert, indem sie eine breite Palette von Algorithmen und eine einfache Integration mit anderen Tools wie IronPDF bietet. Mit ihrem umfassenden Funktionsumfang, einschließlich Unterstützung für authentifizierte Verschlüsselungsmodi, symmetrische und asymmetrische Verschlüsselung, Hashing und Schlüsselableitung, deckt PyCryptodome die Bedürfnisse moderner Anwendungen ab, die robuste Sicherheitsmaßnahmen erfordern. Ihre leichte Handhabung, aktive Wartung und eigenständige Natur machen sie zu einem unverzichtbaren Werkzeug für die Implementierung einer sicheren Datenverarbeitung in verschiedenen Szenarien, von der Passwortverwaltung bis hin zur sicheren Dokumentenerstellung und -verschlüsselung, um Datenintegrität und Vertraulichkeit in einer zunehmend digitalen Welt zu gewährleisten.

Für Details zur IronPDF-Lizenzierung siehe die IronPDF-Lizenzseite. Um mehr zu erfahren, schauen Sie sich unser ausführliches Tutorial zur Umwandlung von HTML in PDF an.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen