استفاده از PyCryptodome در پایتون: آموزش جامع امنیت و رمزنگاری
امنیت و رمزنگاری از جنبههای حیاتی توسعه نرمافزار مدرن هستند. پایتون، به عنوان یک زبان برنامهنویسی محبوب، ابزارهای قدرتمندی برای پیادهسازی الگوریتمهای رمزنگاری ارائه میدهد. یکی از این ابزارها، کتابخانه PyCryptodome است که یک جایگزین فعال و نگهداری شده برای کتابخانه قدیمیتر PyCrypto محسوب میشود. این مقاله به بررسی جامع PyCryptodome، مفاهیم کلیدی رمزنگاری و نحوه استفاده از آن در پایتون میپردازد.
مقدمهای بر رمزنگاری و PyCryptodome
رمزنگاری فرآیند تبدیل اطلاعات به یک فرم غیرقابل خواندن (متن رمز) برای محافظت از محرمانگی، یکپارچگی و اصالت آن است. الگوریتمهای رمزنگاری مختلفی وجود دارند که هر کدام ویژگیها و کاربردهای خاص خود را دارند. PyCryptodome مجموعهای از الگوریتمهای رمزنگاری، توابع هشینگ، امضای دیجیتال و سایر ابزارهای مرتبط را فراهم میکند.
PyCryptodome بر پایه کتابخانه C نوشته شده است که باعث میشود عملکرد بالایی داشته باشد. این کتابخانه از الگوریتمهای استاندارد صنعتی مانند AES، DES، RSA، SHA-256 و HMAC پشتیبانی میکند.
نصب PyCryptodome
نصب PyCryptodome بسیار ساده است و میتوان آن را با استفاده از pip انجام داد:
pip install pycryptodome
مفاهیم کلیدی رمزنگاری
قبل از شروع کار با PyCryptodome، درک مفاهیم کلیدی رمزنگاری ضروری است:
- رمزنگاری متقارن (Symmetric Encryption): در این روش، از یک کلید واحد برای رمزنگاری و رمزگشایی استفاده میشود. الگوریتمهای رایج شامل AES و DES هستند.
- رمزنگاری نامتقارن (Asymmetric Encryption): در این روش، از دو کلید استفاده میشود: یک کلید عمومی برای رمزنگاری و یک کلید خصوصی برای رمزگشایی. الگوریتمهای رایج شامل RSA و ECC هستند.
- توابع هشینگ (Hashing Functions): توابع هشینگ یک ورودی با طول متغیر را به یک خروجی با طول ثابت (هش) تبدیل میکنند. این توابع یکطرفه هستند، به این معنی که بازگرداندن ورودی اصلی از هش آن امکانپذیر نیست.
- امضای دیجیتال (Digital Signatures): امضای دیجیتال از رمزنگاری نامتقارن برای تأیید اصالت و یکپارچگی یک پیام استفاده میکند.
رمزنگاری متقارن با AES
AES (Advanced Encryption Standard) یک الگوریتم رمزنگاری متقارن بسیار محبوب است. در اینجا نحوه استفاده از AES در PyCryptodome برای رمزنگاری و رمزگشایی دادهها آورده شده است:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import binascii
def encrypt_aes(key, plaintext):
cipher = AES.new(key, AES.MODE_CBC)
ciphertext = cipher.encrypt(pad(plaintext.encode('utf-8'), AES.block_size))
return binascii.hexlify(ciphertext).decode('utf-8')
def decrypt_aes(key, ciphertext):
cipher = AES.new(key, AES.MODE_CBC)
plaintext = unpad(cipher.decrypt(binascii.unhexlify(ciphertext)), AES.block_size)
return plaintext.decode('utf-8')
# مثال
key = b'Sixteen byte key'
plaintext = "This is a secret message."
ciphertext = encrypt_aes(key, plaintext)
print("Ciphertext:", ciphertext)
decrypted_plaintext = decrypt_aes(key, ciphertext)
print("Decrypted Plaintext:", decrypted_plaintext)
در این مثال، از حالت CBC (Cipher Block Chaining) برای رمزنگاری استفاده شده است. تابع pad برای اطمینان از اینکه طول متن اصلی مضربی از اندازه بلوک AES است، استفاده میشود. تابع unpad برای حذف پدینگ در هنگام رمزگشایی استفاده میشود.
رمزنگاری نامتقارن با RSA
RSA (Rivest–Shamir–Adleman) یک الگوریتم رمزنگاری نامتقارن است. در اینجا نحوه استفاده از RSA در PyCryptodome برای تولید کلید، رمزنگاری و رمزگشایی دادهها آورده شده است:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
def generate_rsa_keypair(bits):
key = RSA.generate(bits)
private_key = key.export_key()
public_key = key.publickey().export_key()
return private_key, public_key
def encrypt_rsa(public_key, plaintext):
key = RSA.import_key(public_key)
cipher = PKCS1_OAEP.new(key)
ciphertext = cipher.encrypt(plaintext.encode('utf-8'))
return ciphertext.hex()
def decrypt_rsa(private_key, ciphertext):
key = RSA.import_key(private_key)
cipher = PKCS1_OAEP.new(key)
plaintext = cipher.decrypt(bytes.fromhex(ciphertext)).decode('utf-8')
return plaintext
# مثال
private_key, public_key = generate_rsa_keypair(2048)
plaintext = "This is a secret message."
ciphertext = encrypt_rsa(public_key, plaintext)
print("Ciphertext:", ciphertext)
decrypted_plaintext = decrypt_rsa(private_key, ciphertext)
print("Decrypted Plaintext:", decrypted_plaintext)
در این مثال، از PKCS1_OAEP برای پدینگ استفاده شده است که یک روش امن برای پدینگ دادهها قبل از رمزنگاری با RSA است.
توابع هشینگ با SHA-256
SHA-256 (Secure Hash Algorithm 256-bit) یک تابع هشینگ امن است. در اینجا نحوه استفاده از SHA-256 در PyCryptodome برای محاسبه هش یک رشته آورده شده است:
from Crypto.Hash import SHA256
def hash_sha256(data):
hash_object = SHA256.new(data.encode('utf-8'))
hex_dig = hash_object.hexdigest()
return hex_dig
# مثال
data = "This is a message to hash."
hash_value = hash_sha256(data)
print("SHA-256 Hash:", hash_value)
امضای دیجیتال با RSA
امضای دیجیتال با RSA به شما امکان میدهد اصالت و یکپارچگی یک پیام را تأیید کنید. در اینجا نحوه استفاده از RSA در PyCryptodome برای ایجاد و تأیید امضای دیجیتال آورده شده است:
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
def sign_rsa(private_key, message):
key = RSA.import_key(private_key)
hash_object = SHA256.new(message.encode('utf-8'))
signer = PKCS1_v1_5.new(key)
signature = signer.sign(hash_object)
return signature.hex()
def verify_rsa(public_key, message, signature):
key = RSA.import_key(public_key)
hash_object = SHA256.new(message.encode('utf-8'))
verifier = PKCS1_v1_5.new(key)
try:
verifier.verify(hash_object, bytes.fromhex(signature))
return True
except (ValueError, TypeError):
return False
# مثال
private_key, public_key = generate_rsa_keypair(2048)
message = "This is a message to sign."
signature = sign_rsa(private_key, message)
print("Signature:", signature)
is_valid = verify_rsa(public_key, message, signature)
print("Signature is valid:", is_valid)
نتیجهگیری
PyCryptodome یک کتابخانه قدرتمند و انعطافپذیر برای پیادهسازی الگوریتمهای رمزنگاری در پایتون است. این مقاله به بررسی مفاهیم کلیدی رمزنگاری و نحوه استفاده از PyCryptodome برای رمزنگاری متقارن، رمزنگاری نامتقارن، توابع هشینگ و امضای دیجیتال پرداخت. با استفاده از PyCryptodome، میتوانید برنامههای پایتونی امن و قابل اعتمادی ایجاد کنید.

بدون دیدگاه