منبع اصلی نوشتار زیر در این لینک قرار دارد

رمزنگاری و رمزگشایی متقارن در Python

در این مطلب آموزشی از وبسایت اوپن مایند می خواهیم نحوه رمزنگاری و رمزگشایی متقارن رشته ها و فایل ها را در زبان پایتون به شما آموزش دهیم.

ما در این مطلب ساخت کلیدها، ذخیره کلیدهای ساخته شده و نحوه رمزنگاری با آن ها را بررسی می کنم.

 

نصب کتابخانه cryptography

از آنجا که خود پایتون از ابتدا کتابخانه و ابزار از پیش نصب شده برای رمزنگاری فایل ها ندارد، پس ما یک ماژول مخصوص رمزنگاری را نصب و استفاده می کنیم.

برای نصب کتابخانه cryptography دستور زیر را اجرا کنید:

python -m pip install cryptography

برای اطمینان از نصب صحیح این کتابخانه دستور زیر را در IDLE اجرا کنید:

import cryptography

اگر خطایی به وجود نیامد، پس کتابخانه به طور کامل و صحیح نصب شده است.

رمزنگاری متقارن چیست؟

رمزنگاری متقارن زمانی انجام می شود که یک کلید برای رمزنگاری و رمزگشایی استفاده می شود و تنها همان یک کلید ساخته و استفاده می شود. پس فقط یک راه برای رمزگشایی وجود دارد و در اینجا آن کلید همانند رمز عبور عمل می کند.

برای استفاده از رمزنگاری متقارن ما از کلاس Fernet استفاده می کنید که یک پیاده سازی از AES است.

به دست آوردن یک کلید رمز متقارن

دو راه کلی برای به دست آوردن یک کلید وجود دارد، یا یک کلید جدید می سازید یا یک کلید قبلی را می خوانید و بارگذاری می کنید.

بیایید ساخت یک کلید تازه را با همدیگه ببینیم. برای ساخت یک کلید تصادفی متد generate_key را از کلاس Fernet صدا می زنیم.

from cryptography.fernet import Fernet
key = Fernet.generate_key()

متغیر key حالا یک کلید را داخل خود دارد. هنگام کار با این کلیدهای تولید شده دقت کنید آنها را از دست ندهید، چرا که با از دست کلید قادر به رمزگشایی نخواهید بود.

ذخیره کلید

یک راه برای ذخیره امن کلیدهای ساخته شده، ذخیره آنها در فایل باینری است. برای این کار ما به صورت ساده می توانیم یک فایل بسازیم و مقدار متغیر را درون آن بنویسیم:

file = open('key.key', 'wb')
file.write(key) # The key is type bytes still
file.close()

 

خواندن و بارگذاری کلید

اگر از قبل یک کلید را ذخیره کرده باشید، می توانید طبق مثال زیر آن را بازیابی کنید:

file = open('key.key', 'rb')
key = file.read() # The key will be type bytes
file.close()

 

تولید یک کلید از روی یک رمز عبور

اگر می خواهید بر پایه یک رشته رمز عبور کلید خود را تولید کنید، باید طبق کد زیر پیش بروید:

import base64
import os
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

password_provided = "password" # This is input in the form of a string
password = password_provided.encode() # Convert to type bytes
salt = b'salt_' # CHANGE THIS - recommend using a key from os.urandom(16), must be of type bytes
kdf = PBKDF2HMAC(
    algorithm=hashes.SHA256(),
    length=32,
    salt=salt,
    iterations=100000,
    backend=default_backend()
)
key = base64.urlsafe_b64encode(kdf.derive(password)) # Can only use kdf once

در کد بالا، متغیر key مقدار کلید که بر حسب رشته “password” و رشته افزودنی ‘salt_’ ساخته شده را در داخل خود نگهداری می کند.

به شما قویاً پیشنهاد می کنیم، که رشته افزودنی بالا را تغییر دهید و یک رشته افزودنی ساده انتخاب نکنید.

رمزگذاری اطلاعات

برای رمزگذاری یک رشته شما ابتدا به یک کلید نیاز دارید که نحوه ساخت یا بارگذاری آن را بالاتر نشان دادیم. پس از گرفتن کلید، باید رشته خود را به صورت byte به متد encrypt بدهید (از شئ ساخته شده با کلید مذکور) تا مقدار رمزنگاری شده آن را دریافت کنید. به کد زیر دقت کنید:

from cryptography.fernet import Fernet
message = "my deep dark secret".encode()

f = Fernet(key)
encrypted = f.encrypt(message)

متغیر encrypted حالا مقدار رمز شده از رشته “my deep dark secret” را در درون خود دارد.

 

رمزگشایی اطلاعات

برای رمزگشایی ابتدا با استفاده از همان کلید یک شئ از کلاس Fernet بسازید و سپس متد decrypt را به کار ببرید. به نمونه کد زیر دقت کنید

from cryptography.fernet import Fernet
encrypted = b"...encrypted bytes..."

f = Fernet(key)
decrypted = f.decrypt(encrypted)

 

نمایش یک نمونه رمزنگاری و رمزگشایی

برای نمایش این موارد در عمل، به کد زیر دقت کنید. در کد زیر ابتدا کلید تولید شده و سپس با آن کلید رمزنگاری و رمزگشایی شده و در نهایت برابری رشته اصلی با رشته رمزگشایی شده بررسی شده است.

>>> from cryptography.fernet import Fernet
>>> message = "my deep dark secret".encode()
>>> key = Fernet.generate_key() # Store this key or get if you already have it
>>> f = Fernet(key)
>>> encrypted = f.encrypt(message)
>>> decrypted = f.decrypt(encrypted)
>>> message == decrypted
True
>>>

 

رمزنگاری و رمزگشایی فایل ها

ما می توانیم فایل ها را هم به همین شیوه رمزنگاری و رمزگشایی کنیم. کافی است که محتوای فایل ها را به صورت باینری بخوانیم و موارد خوانده شده را به متد encrypt بدهیم.

در مثال زیر محتویات یک فایل را رمزنگاری و در فایل جدیدی بازنویسی کرده ایم.

from cryptography.fernet import Fernet
key = b'' # Use one of the methods to get a key (it must be the same when decrypting)
input_file = 'test.txt'
output_file = 'test.encrypted'

with open(input_file, 'rb') as f:
    data = f.read()

fernet = Fernet(key)
encrypted = fernet.encrypt(data)

with open(output_file, 'wb') as f:
    f.write(encrypted)

# You can delete input_file if you want

پس از عملیات رمزنگاری، می توانیم فایل اصلی را پاک کنیم.

 

برای رمزگشایی فایل هم می توانیم به صورت زیر عمل کنیم:

from cryptography.fernet import Fernet
key = b'' # Use one of the methods to get a key (it must be the same as used in encrypting)
input_file = 'test.encrypted'
output_file = 'test.txt'

with open(input_file, 'rb') as f:
    data = f.read()

fernet = Fernet(key)
encrypted = fernet.decrypt(data)

with open(output_file, 'wb') as f:
    f.write(encrypted)

# You can delete input_file if you want

 

نکته مهم برای رمزنگاری و رمزگشایی فایل ها با کلاس Fernet این است که، این کتابخانه برای رمزنگاری داده ای مناسب است که به راحتی درون حافظه اصلی سیستم (RAM) جای می گیرد و بیش از حد بزرگ نیست. اگر فایل بزرگی دارید، باید راه حلی اتخاذ کنید که داده فایل را به بخش های کوچکتر تقسیم کنید.

 

منبع : Encryption and Decryption in Python

 

نوشته رمزنگاری و رمزگشایی متقارن در Python اولین بار در اوپن مایند. پدیدار شد.



برچسب ها : ,