Przejdź do treści stopki
POMOC DOTYCZąCA JęZYKA PYTHON

Używanie PyCryptodome do szyfrowania w Python

W erze transformacji cyfrowej nie można przecenić znaczenia solidnych mechanizmów kryptograficznych. Kryptografia zapewnia bezpieczeństwo i prywatność danych podczas ich przesyłania przez różne sieci i systemy. PyCryptodome to biblioteka języka Python, która wyróżnia się na tle innych rozwiązań kryptograficznych, oferując bogactwo funkcji ułatwiających bezpieczne przetwarzanie danych, takich jak tryby szyfrowania z uwierzytelnianiem (GCM, CCM, EAX, SIV, OCB) oraz przyspieszone szyfrowanie AES z obsługą na najwyższym poziomie. W niniejszym artykule omówiono najnowszą oficjalną wersję PyCryptodome, przedstawiając jej funkcje, przykłady zastosowań, uproszczony proces instalacji oraz sposoby jej efektywnego wykorzystania w różnych aplikacjach. Będziemy również tworzyć zaszyfrowane pliki PDF przy użyciu oddzielnej biblioteki C#, IronPDF, wraz z PyCryptodome.

Przegląd PyCryptodome

PyCryptodome to samodzielny pakiet Pythona zawierający niskopoziomowe prymitywy kryptograficzne. Została zaprojektowana jako bezpośredni zamiennik starej biblioteki PyCrypto, rozwiązując wiele jej ograniczeń i rozszerzając jej możliwości. Oferuje szeroki zakres algorytmów i protokołów kryptograficznych, co czyni go nieocenionym narzędziem dla programistów, którzy muszą wdrażać funkcje bezpieczeństwa w swoich aplikacjach.

Najważniejsze cechy

  1. Obsługa szerokiej gamy algorytmów: PyCryptodome obsługuje szeroki zakres algorytmów kryptograficznych, w tym AES, RSA, DSA i wiele innych. To szerokie wsparcie gwarantuje, że programiści znajdą niezbędne narzędzia do różnych zadań kryptograficznych.
  2. Łatwość użytkowania: Biblioteka została zaprojektowana z myślą o łatwości obsługi i posiada przejrzysty oraz zwięzły interfejs API, który pozwala nawet osobom o ograniczonej wiedzy kryptograficznej na skuteczne wdrażanie funkcji bezpieczeństwa.
  3. Aktywna konserwacja: W przeciwieństwie do swojego poprzednika, PyCrypto, PyCryptodome jest aktywnie utrzymywane, regularnie aktualizowane i ulepszane, co zapewnia zgodność z najnowszymi wersjami Pythona i standardami bezpieczeństwa.
  4. Samowystarczalność: PyCryptodome nie wymaga żadnych zewnętrznych zależności, co sprawia, że jest łatwy w instalacji i użytkowaniu w różnych środowiskach.
  5. Integracja z istniejącymi bibliotekami: PyCryptodome może płynnie integrować się z innymi bibliotekami i frameworkami Pythona, zwiększając swoją użyteczność w różnych aplikacjach.

Instalacja

Instalacja PyCryptodome jest prosta dzięki jego samodzielnej naturze. Można go zainstalować za pomocą pip, instalatora pakietów Pythona, używając następującego polecenia:

pip install pycryptodome
pip install pycryptodome
SHELL

Podstawowe pojęcia i moduły

PyCryptodome jest podzielony na kilka modułów, z których każdy dotyczy różnych aspektów kryptografii. Zrozumienie tych modułów ma kluczowe znaczenie dla efektywnego wykorzystania biblioteki.

Hashing

Funkcje skrótu mają fundamentalne znaczenie dla kryptografii, zapewniając sposób na wygenerowanie wartości skrótu o stałym rozmiarze na podstawie dowolnych danych. PyCryptodome obsługuje różne algorytmy skrótu poprzez moduł Crypto.Hash.

Przykład wykorzystania funkcji skrótu 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 (Jak to działa dla programistów): Rysunek 1 – Wynik haszowania

Szyfrowanie symetryczne

Szyfrowanie symetryczne polega na użyciu tego samego klucza zarówno do szyfrowania, jak i deszyfrowania. Moduł Crypto.Cipher firmy PyCryptodome obsługuje kilka szyfrów symetrycznych, w tym AES, DES i inne.

Przykład szyfrowania i deszyfrowania 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 (Jak to działa dla programistów): Rysunek 2 – Wynik AES

Szyfrowanie asymetryczne

Szyfrowanie asymetryczne wykorzystuje parę kluczy: klucz publiczny do szyfrowania i klucz prywatny do deszyfrowania. Moduł Crypto.PublicKey firmy PyCryptodome zapewnia obsługę algorytmów RSA, DSA i ECC (kryptografia krzywych eliptycznych).

Przykład szyfrowania i deszyfrowania 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 (Jak to działa dla programistów): Rysunek 3 – Wynik RSA

Kluczowe pochodzenie

Funkcje generowania kluczy generują klucze kryptograficzne na podstawie hasła lub frazy hasła. Jest to szczególnie przydatne w przypadku szyfrowania opartego na hasłach. PyCryptodome obsługuje PBKDF2, scrypt i inne algorytmy generowania kluczy.

Przykład użycia 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 (Jak to działa dla programistów): Rysunek 4 – Wynik PBKDF2

Przykłady zastosowań

Zarządzanie hasłami

Menedżery haseł korzystają z funkcji generowania kluczy PyCryptodome w celu bezpiecznego przechowywania i odzyskiwania haseł użytkowników. Korzystając z silnych algorytmów generowania kluczy, takich jak PBKDF2, programiści mogą zapewnić, że przechowywane hasła są odporne na ataki metodą brute force.

Przykład zabezpieczania haseł

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 (Jak to działa dla programistów): Rysunek 5 – Zabezpieczanie wyświetlania hasła

IronPDF for Python

IronPDF to potężna biblioteka do generowania plików PDF dla języka Python, która pozwala programistom bez wysiłku tworzyć, edytować i modyfikować dokumenty PDF. Oferuje szeroki zakres funkcji, od konwersji HTML do PDF po scalanie wielu plików PDF, co czyni go idealnym wyborem do automatyzacji przepływu pracy z dokumentami. W połączeniu z PyCryptodome, solidną biblioteką do operacji kryptograficznych, programiści mogą dodawać do swoich dokumentów PDF funkcje bezpieczeństwa, takie jak szyfrowanie i podpisy cyfrowe. Ta integracja jest szczególnie przydatna w aplikacjach wymagających wysokiego poziomu bezpieczeństwa i integralności danych, takich jak srodowiska finansowe, prawne lub poufne.

Aby zainstalować IronPDF, można użyć pip, menedżera pakietów języka Python. Oto jak zacząć:

pip install ironpdf
pip install ironpdf
SHELL

PyCryptodome (Jak to działa dla programistów): Rysunek 6 – IronPDF

Po instalacji możesz zacząć używać IronPDF do tworzenia i edycji plików PDF. Poniżej znajduje się prosty przykład pokazujący, jak utworzyć plik PDF za pomocą IronPDF, a następnie zaszyfrować go za pomocą PyCryptodome:

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

Ten skrypt pokazuje, jak stworzyć prosty plik PDF za pomocą IronPDF, a następnie zaszyfrować go przy użyciu AES z PyCryptodome, co stanowi podstawę do tworzenia bardziej złożonych i bezpiecznych aplikacji do obsługi plików PDF.

PyCryptodome (Jak to działa dla programistów): Rysunek 7 – Wynik w postaci zaszyfrowanego pliku

Wnioski

Podsumowując, PyCryptodome to potężna i wszechstronna biblioteka Pythona, która znacznie usprawnia operacje kryptograficzne dla programistów, oferując szeroki wachlarz algorytmów oraz łatwą integrację z innymi narzędziami, takimi jak IronPDF. Dzięki kompleksowemu zestawowi funkcji, w tym obsłudze trybów szyfrowania z uwierzytelnianiem, szyfrowania symetrycznego i asymetrycznego, haszowania oraz wyprowadzania kluczy, PyCryptodome odpowiada na potrzeby nowoczesnych aplikacji wymagających solidnych środków bezpieczeństwa. Łatwość obsługi, aktywna konserwacja i samodzielność sprawiają, że jest to niezbędne narzędzie do wdrażania bezpiecznego przetwarzania danych w różnych scenariuszach, od zarządzania hasłami po bezpieczne generowanie i szyfrowanie dokumentów, zapewniając integralność i poufność danych w coraz bardziej cyfrowym świecie.

Szczegółowe informacje na temat licencji IronPDF można znaleźć na stronie licencji IronPDF. Aby dowiedzieć się więcej, zapoznaj się z naszym szczegółowym samouczkiem dotyczącym konwersji HTML do PDF.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie