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
- 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.
- Ł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.
- 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.
- Samowystarczalność: PyCryptodome nie wymaga żadnych zewnętrznych zależności, co sprawia, że jest łatwy w instalacji i użytkowaniu w różnych środowiskach.
- 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 pycryptodomepip install pycryptodomePodstawowe 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())
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")
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)
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)
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")
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 ironpdfpip install 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)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.

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.










